1 /*
2  * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 #include "awt_IconCursor.h"
27 
28 /* common code used by awt_Frame.cpp and awt_Cursor.cpp */
29 
create_BMP(HWND hW,int * imageData,int nSS,int nW,int nH)30 HBITMAP create_BMP(HWND hW,int* imageData,int nSS, int nW, int nH)
31 {
32     Bitmapheader    bmhHeader;
33     HDC             hDC;
34     char            *ptrImageData;
35     HBITMAP         hbmpBitmap;
36     HBITMAP         hBitmap;
37 
38     int             nNumChannels    = 3;
39 
40     if (!hW) {
41         hW = ::GetDesktopWindow();
42     }
43     hDC = ::GetDC(hW);
44     if (!hDC) {
45         return NULL;
46     }
47 
48     memset(&bmhHeader, 0, sizeof(Bitmapheader));
49     bmhHeader.bmiHeader.biSize              = sizeof(BITMAPINFOHEADER);
50     bmhHeader.bmiHeader.biWidth             = nW;
51     bmhHeader.bmiHeader.biHeight            = -nH;
52     bmhHeader.bmiHeader.biPlanes            = 1;
53 
54     bmhHeader.bmiHeader.biBitCount          = 24;
55     bmhHeader.bmiHeader.biCompression       = BI_RGB;
56 
57     hbmpBitmap = ::CreateDIBSection(hDC, (BITMAPINFO*)&(bmhHeader),
58                                     DIB_RGB_COLORS,
59                                     (void**)&(ptrImageData),
60                                     NULL, 0);
61     int  *srcPtr = imageData;
62     char *dstPtr = ptrImageData;
63     if (!dstPtr) {
64         ReleaseDC(hW, hDC);
65         return NULL;
66     }
67     for (int nOutern = 0; nOutern < nH; nOutern++ ) {
68         for (int nInner = 0; nInner < nSS; nInner++ ) {
69             dstPtr[2] = (*srcPtr >> 0x10) & 0xFF;
70             dstPtr[1] = (*srcPtr >> 0x08) & 0xFF;
71             dstPtr[0] = *srcPtr & 0xFF;
72 
73             srcPtr++;
74             dstPtr += nNumChannels;
75         }
76     }
77 
78     // convert it into DDB to make CustomCursor work on WIN95
79     hBitmap = CreateDIBitmap(hDC,
80                              (BITMAPINFOHEADER*)&bmhHeader,
81                              CBM_INIT,
82                              (void *)ptrImageData,
83                              (BITMAPINFO*)&bmhHeader,
84                              DIB_RGB_COLORS);
85 
86     ::DeleteObject(hbmpBitmap);
87     ::ReleaseDC(hW, hDC);
88     ::GdiFlush();
89     return hBitmap;
90 }
91 
destroy_BMP(HBITMAP hBMP)92 void destroy_BMP(HBITMAP hBMP)
93 {
94     if (hBMP) {
95         ::DeleteObject(hBMP);
96     }
97 }
98