]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/curico.cpp
bitmap and image updates
[wxWidgets.git] / src / msw / curico.cpp
index 854a6a65ab1c8996dc8e476d296177605289c06e..e3ee90176fdf0a938de29b69d52f634dbdafe7f5 100644 (file)
 #include <io.h>
 #include <windows.h>
 
-#ifdef __GNUWIN32__
+#if defined(__MWERKS__)
+#include <wingdi.h>
+#include <winuser.h>
+#endif
+
+#ifndef __TWIN32__
+#if defined (__GNUWIN32__) && !defined(wxUSE_NORLANDER_HEADERS)
 #include "wx/msw/gnuwin32/extra.h"
 #endif
+#endif
 
+#include "wx/wxchar.h"
 #include "wx/msw/curicop.h"
 #include "wx/msw/curico.h"
+#include "wx/string.h"
 
 //*****************************************************************************
 //* Function : ReadIconFile()                                                 *
 //*            be created for any reason.                                     *
 //*****************************************************************************
 
-HICON ReadIconFile( char *szFileName, HINSTANCE hInst, int *W, int *H)
+HICON ReadIconFile( wxChar *szFileName, HINSTANCE hInst, int *W, int *H)
 { HICON   hIcon;
   HANDLE  hDIB;
 
-  if( (hDIB = ReadIcon(szFileName, W, H)) == NULL)
+  if( (hDIB = ReadIcon(szFileName, W, H)) == (HANDLE) NULL)
                                           // read the icon DIB from file
-    return NULL;
+    return (HICON) NULL;
   hIcon = MakeIcon( hDIB, hInst);         // create an icon from DIB
   GlobalFree( hDIB);
   return hIcon;
@@ -58,13 +67,13 @@ HICON ReadIconFile( char *szFileName, HINSTANCE hInst, int *W, int *H)
 //*            monochrome.                                                    *
 //*****************************************************************************
 
-HICON CursorToIcon( char *szFileName, HINSTANCE hInst, int *W, int *H)
+HICON CursorToIcon( wxChar *szFileName, HINSTANCE hInst, int *W, int *H)
 { HANDLE  hDIB;     // Handle to DIB memory
   HICON   hIcon;    // Handle to Icon
 
-  if( (hDIB = ReadCur( szFileName, NULL, W, H)) == NULL)
+  if( (hDIB = ReadCur( szFileName, NULL, W, H)) == (HANDLE) NULL)
                                                     // Read cursor DIB
-    return NULL;
+    return (HICON) NULL;
   hIcon = MakeIcon( hDIB, hInst);      // make icon from cursor DIB
   GlobalFree( hDIB);
   return hIcon;
@@ -78,7 +87,7 @@ HICON CursorToIcon( char *szFileName, HINSTANCE hInst, int *W, int *H)
 //*            is corrupt or if memory cannot be allocated for the DIB info.  *
 //*****************************************************************************
 
-HANDLE ReadIcon( char *szFileName, int *W, int *H)
+HANDLE ReadIcon( wxChar *szFileName, int *W, int *H)
 { ICONFILEHEADER iconFileHead;   // ICON file header structure
   ICONFILERES    iconFileRes;    // ICON file resource
   WORD           cbHead,
@@ -92,25 +101,24 @@ HANDLE ReadIcon( char *szFileName, int *W, int *H)
                  nDirEntries = 0;
 
    // Open and read the .ICO file header and the first ICONFILERES
-  hFile  = _lopen( szFileName, OF_READ);
+  hFile  = _lopen( wxFNCONV(szFileName), OF_READ);
   cbHead = _lread( hFile, (LPSTR)&iconFileHead, sizeof(ICONFILEHEADER));
   cbRes  = _lread( hFile, (LPSTR)&iconFileRes, sizeof(ICONFILERES));
   ++nDirEntries;
 
   if((cbHead != sizeof( ICONFILEHEADER)) || (cbRes != sizeof( ICONFILERES)))
-    return NULL;
-
+    return (HANDLE) NULL;
   // Verify that it's an .ICON file
   if( iconFileHead.wResourceType != 1)
-    return NULL;
+    return (HANDLE) NULL;
 
   // inserted by P.S.
-  while( (nDirEntries < iconFileHead.wResourceCount) &&
+  while( ((unsigned)nDirEntries < iconFileHead.wResourceCount) &&
          ((iconFileRes.bWidth != nWidth) || (iconFileRes.bHeight != nHeight)))
   {
     cbRes = _lread( hFile, (LPSTR )&iconFileRes, sizeof( ICONFILERES));
     if(cbRes != sizeof( ICONFILERES))
-      return NULL;
+      return (HANDLE) NULL;
     else
       ++nDirEntries;
   }
@@ -122,8 +130,9 @@ HANDLE ReadIcon( char *szFileName, int *W, int *H)
 
   // Allocate and lock memory to read in the DIB
   hDIB = GlobalAlloc(GHND, iconFileRes.dwDIBSize);
-  if(hDIB == NULL)
-    return NULL;
+  if(hDIB == (HANDLE) NULL)
+    return (HANDLE) NULL;
+
 #ifdef __WINDOWS_386__
   lpDIB = (LPBITMAPINFO)MK_FP32(GlobalLock(hDIB));
 #else
@@ -143,7 +152,7 @@ HANDLE ReadIcon( char *szFileName, int *W, int *H)
   if( (DWORD )cbBits != iconFileRes.dwDIBSize)
   {
     GlobalFree( hDIB);
-    return NULL;
+    return (HANDLE) NULL;
   }
   return hDIB;
 }
@@ -209,7 +218,7 @@ HICON MakeIcon( HANDLE hDIB, HINSTANCE hInst)
                             lpDIB->bmiHeader.biBitCount)));
 
   // Get a hDC so we can create a bitmap compatible with it
-  hDC = CreateDC( "DISPLAY", NULL, NULL, NULL);
+  hDC = CreateDC( wxT("DISPLAY"), NULL, NULL, NULL);
 
   // 5) Create a device dependent bitmap with the XOR bits.
   hbmXor = CreateDIBitmap( hDC, (LPBITMAPINFOHEADER)&(lpDIB->bmiHeader),
@@ -219,13 +228,13 @@ HICON MakeIcon( HANDLE hDIB, HINSTANCE hInst)
 
   dwBmpSize = (DWORD )(bmpXor.bmWidthBytes * bmpXor.bmHeight * bmpXor.bmPlanes);
   hXorDDB = GlobalAlloc( GHND, dwBmpSize);
-  if(hXorDDB == NULL)
+  if(hXorDDB == (HANDLE) NULL)
   {
     // clean up before quitting
     DeleteObject( hbmXor);
     DeleteDC( hDC);
     GlobalUnlock( hDIB);
-    return NULL;
+    return (HICON) NULL;
   }
 
 #ifdef __WINDOWS_386__
@@ -270,15 +279,15 @@ HICON MakeIcon( HANDLE hDIB, HINSTANCE hInst)
 //*            be created for any reason.                                     *
 //*****************************************************************************
 
-HCURSOR ReadCursorFile( char *szFileName, HINSTANCE hInst, int *W, int *H,
+HCURSOR ReadCursorFile( wxChar *szFileName, HINSTANCE hInst, int *W, int *H,
                         int *XHot, int *YHot)
 { HANDLE    hDIB;    // Handle to DIB memory
   HCURSOR   hCursor;
   POINT     ptHotSpot;
 
   // read cur DIB from file
-  if( (hDIB = ReadCur( szFileName, (LPPOINT )&ptHotSpot, W, H)) == NULL)
-    return NULL;
+  if( (hDIB = ReadCur( szFileName, (LPPOINT )&ptHotSpot, W, H)) == (HANDLE) NULL)
+    return (HCURSOR) NULL;
   hCursor = MakeCursor( hDIB, (LPPOINT )&ptHotSpot, hInst);//create cur from DIB
   if(XHot != 0)
     *XHot = ptHotSpot.x;
@@ -299,15 +308,15 @@ HCURSOR ReadCursorFile( char *szFileName, HINSTANCE hInst, int *W, int *H,
 //*            monochrome.                                                    *
 //*****************************************************************************
 
-HCURSOR IconToCursor( char *szFileName, HINSTANCE hInst, int XHot, int YHot,
+HCURSOR IconToCursor( wxChar *szFileName, HINSTANCE hInst, int XHot, int YHot,
                       int  *W, int *H)
 { HCURSOR   hCursor;
   HANDLE    hDIB;
   POINT     ptHotSpot;
 
-  if( (hDIB = ReadIcon( szFileName, W, H)) == NULL)
+  if( (hDIB = ReadIcon( szFileName, W, H)) == (HANDLE) NULL)
                                              //read icon file to get icon DIB
-    return NULL;
+    return (HCURSOR) NULL;
   // Set the hot spot of the cursor
   ptHotSpot.x = XHot;
   ptHotSpot.y = YHot;
@@ -325,7 +334,7 @@ HCURSOR IconToCursor( char *szFileName, HINSTANCE hInst, int XHot, int YHot,
 //*            is corrupt or if memory cannot be allocated for the DIB info.  *
 //*****************************************************************************
 
-HANDLE ReadCur( char *szFileName, LPPOINT lpptHotSpot, int *W, int *H)
+HANDLE ReadCur( wxChar *szFileName, LPPOINT lpptHotSpot, int *W, int *H)
 { CURFILEHEADER   curFileHead;  // CURSOR file header structure
   CURFILERES      curFileRes;   // CURSOR file resource
   WORD            cbHead,
@@ -339,25 +348,25 @@ HANDLE ReadCur( char *szFileName, LPPOINT lpptHotSpot, int *W, int *H)
                   nDirEntries = 0;
 
   // Open and read the .ICO file header and the first ICONFILERES
-  hFile  = _lopen( szFileName, OF_READ);
+  hFile  = _lopen( wxFNCONV(szFileName), OF_READ);
   cbHead = _lread( hFile,  (LPSTR )&curFileHead, sizeof( CURFILEHEADER));
   cbRes  = _lread( hFile,  (LPSTR )&curFileRes,  sizeof( CURFILERES));
   ++nDirEntries;
 
   if((cbHead != sizeof( CURFILEHEADER)) || (cbRes != sizeof( CURFILERES)))
-    return NULL;
+    return (HANDLE) NULL;
 
    // Verify that it's an .CUR file
   if ((curFileRes.bReserved1 != 0) || (curFileHead.wResourceType != 2))
-    return NULL;
+    return (HANDLE) NULL;
 
   // following added by P.S.
-  while( (nDirEntries < curFileHead.wResourceCount) &&
+  while( ((unsigned)nDirEntries < curFileHead.wResourceCount) &&
          ((curFileRes.bWidth != nWidth) || (curFileRes.bHeight != nHeight)))
   {
     cbRes = _lread( hFile, (LPSTR )&curFileRes, sizeof( CURFILERES));
     if(cbRes != sizeof( CURFILERES))
-      return NULL;
+      return (HANDLE) NULL;
     else
       ++nDirEntries;
   }
@@ -369,8 +378,8 @@ HANDLE ReadCur( char *szFileName, LPPOINT lpptHotSpot, int *W, int *H)
 
   // Allocate & lock memory to read in the DIB
   hDIB = GlobalAlloc(GHND, curFileRes.dwDIBSize);
-  if(hDIB == NULL)
-    return NULL;
+  if(hDIB == (HANDLE) NULL)
+    return (HANDLE) NULL;
 
 #ifdef __WINDOWS_386__
   lpDIB = (LPBITMAPINFO )MK_FP32(GlobalLock(hDIB));
@@ -390,9 +399,9 @@ HANDLE ReadCur( char *szFileName, LPPOINT lpptHotSpot, int *W, int *H)
   {
     GlobalUnlock( hDIB);
     GlobalFree( hDIB);
-    return NULL;
+    return (HANDLE) NULL;
   }
-  if(lpptHotSpot != NULL)  // If it is necessary to know the hot spot
+  if(lpptHotSpot != (LPPOINT) NULL)  // If it is necessary to know the hot spot
   {
     lpptHotSpot->x = (int )curFileRes.wXHotspot;
     lpptHotSpot->y = (int )curFileRes.wYHotspot;
@@ -433,13 +442,13 @@ HBITMAP ColorDDBToMonoDDB ( HBITMAP hbm)
 
   dwLen = bi.biSize + PaletteSize((LPSTR)&bi);
 
-  hdc = GetDC( NULL);
+  hdc = GetDC( (HWND) NULL);
 
   hdib = GlobalAlloc( GHND, dwLen);
-  if (hdib == NULL)
+  if (hdib == (HANDLE) NULL)
   {
-    ReleaseDC( NULL, hdc);
-    return NULL;
+    ReleaseDC( (HWND) NULL, hdc);
+    return (HBITMAP) NULL;
   }
 
 #ifdef __WINDOWS_386__
@@ -469,8 +478,8 @@ HBITMAP ColorDDBToMonoDDB ( HBITMAP hbm)
   else
   {
     GlobalFree( hdib);
-    ReleaseDC( NULL, hdc);
-    return NULL;
+    ReleaseDC( (HWND) NULL, hdc);
+    return (HBITMAP) NULL;
   }
 
   // Call GetDIBits with a NON-NULL lpBits parameter, to actually
@@ -487,9 +496,9 @@ HBITMAP ColorDDBToMonoDDB ( HBITMAP hbm)
                  (LPBITMAPINFO)lpbi, DIB_RGB_COLORS) == 0)
   {
     GlobalUnlock( hdib);
-    hdib = NULL;
-    ReleaseDC( NULL, hdc);
-    return NULL;
+    hdib = (HANDLE) NULL;
+    ReleaseDC( (HWND) NULL, hdc);
+    return (HBITMAP) NULL;
   }
 
   // Finally, create a monochrome DDB, and put the DIB into
@@ -503,7 +512,7 @@ HBITMAP ColorDDBToMonoDDB ( HBITMAP hbm)
   GlobalUnlock( hdib);
   GlobalFree( hdib);
 
-  ReleaseDC(NULL, hdc);
+  ReleaseDC((HWND) NULL, hdc);
   return hbmMono;
 }
 
@@ -570,7 +579,7 @@ HCURSOR MakeCursor( HANDLE hDIB, LPPOINT lpptHotSpot, HINSTANCE hInst)
                            lpDIB->bmiHeader.biBitCount)));
 
   // Get a hDC so we can create a bitmap compatible with it
-  hDC = CreateDC( "DISPLAY", NULL, NULL, NULL);
+  hDC = CreateDC( wxT("DISPLAY"), NULL, NULL, NULL);
 
   // 5) Create a device dependent bitmap with the XOR bits.
   hbmXor = CreateBitmap( (int )lpDIB->bmiHeader.biWidth,
@@ -581,12 +590,12 @@ HCURSOR MakeCursor( HANDLE hDIB, LPPOINT lpptHotSpot, HINSTANCE hInst)
 
   dwBmpSize = (DWORD )(bmpXor.bmWidthBytes * bmpXor.bmHeight * bmpXor.bmPlanes);
   hXorDDB = GlobalAlloc( GHND, dwBmpSize);
-  if(hXorDDB == NULL)
+  if(hXorDDB == (HANDLE) NULL)
   {  // clean up before quitting
     DeleteObject( hbmXor);
     DeleteDC( hDC);
     GlobalUnlock( hDIB);
-    return NULL;
+    return (HCURSOR) NULL;
   }
 #ifdef __WINDOWS_386__
   lpXorDDB = (LPSTR)MK_FP32(GlobalLock( hXorDDB));
@@ -691,7 +700,7 @@ WORD DIBNumColors ( LPSTR pv)
 
 #if 0
 // ******************************************************************
-BOOL fGetXPixmap( BOOL fIsIcon, char *szFileName, HINSTANCE hInst,
+BOOL fGetXPixmap( BOOL fIsIcon, wxChar *szFileName, HINSTANCE hInst,
                   char cData[], int &width, int &height)
 { HDC       hdc,
             hdcMemory;
@@ -766,7 +775,7 @@ HCURSOR MakeCursorFromBitmap(HINSTANCE hInst, HBITMAP hBitmap, POINT *pPoint)
   NPSTR     andBits;
   NPSTR     xorBits;
 
-  hDC = GetDC(NULL);
+  hDC = GetDC((HWND) NULL);
   hDCColor = CreateCompatibleDC(hDC);
   hDCMono = CreateCompatibleDC(hDC);
   hAndBmp = CreateCompatibleBitmap(hDCMono, 32, 32);
@@ -813,10 +822,17 @@ HCURSOR MakeCursorFromBitmap(HINSTANCE hInst, HBITMAP hBitmap, POINT *pPoint)
   DeleteObject(hXorBmp);
   ReleaseDC(NULL, hDC);
 #ifndef __WIN32__
+#ifdef STRICT
+  LocalUnlock(LocalHandle((void NEAR*) andBits));
+  LocalUnlock(LocalHandle((void NEAR*) xorBits));
+  LocalFree(LocalHandle((void NEAR*) andBits));
+  LocalFree(LocalHandle((void NEAR*) xorBits));
+#else
   LocalUnlock(LocalHandle((WORD) andBits));
   LocalUnlock(LocalHandle((WORD) xorBits));
   LocalFree(LocalHandle((WORD) andBits));
   LocalFree(LocalHandle((WORD) xorBits));
+#endif
 #else
   LocalUnlock(LocalHandle((LPCVOID) andBits));
   LocalUnlock(LocalHandle((LPCVOID) xorBits));
@@ -843,7 +859,7 @@ HICON MakeIconFromBitmap(HINSTANCE hInst, HBITMAP hBitmap)
   NPSTR     andBits;
   NPSTR     xorBits;
 
-  hDC = GetDC(NULL);
+  hDC = GetDC((HWND) NULL);
   hDCColor = CreateCompatibleDC(hDC);
   hDCMono = CreateCompatibleDC(hDC);
   hAndBmp = CreateCompatibleBitmap(hDCMono, 32, 32);
@@ -882,12 +898,19 @@ HICON MakeIconFromBitmap(HINSTANCE hInst, HBITMAP hBitmap)
   DeleteDC(hDCMono);
   DeleteObject(hAndBmp);
   DeleteObject(hXorBmp);
-  ReleaseDC(NULL, hDC);
+  ReleaseDC((HWND) NULL, hDC);
 #ifndef __WIN32__
+#ifdef STRICT
+  LocalUnlock(LocalHandle((void NEAR*) andBits));
+  LocalUnlock(LocalHandle((void NEAR*) xorBits));
+  LocalFree(LocalHandle((void NEAR*) andBits));
+  LocalFree(LocalHandle((void NEAR*) xorBits));
+#else
   LocalUnlock(LocalHandle((WORD) andBits));
   LocalUnlock(LocalHandle((WORD) xorBits));
   LocalFree(LocalHandle((WORD) andBits));
   LocalFree(LocalHandle((WORD) xorBits));
+#endif
 #else
   LocalUnlock(LocalHandle((LPCVOID) andBits));
   LocalUnlock(LocalHandle((LPCVOID) xorBits));