]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dibutils.cpp
bitmap and image updates
[wxWidgets.git] / src / msw / dibutils.cpp
index 3ae1f94dc9f194dcb70e78578a6949ad7d71f407..c52aa3bfaa50cae55107d21976b4d7c47a2af497 100644 (file)
@@ -21,9 +21,9 @@
 #endif
 
 #ifndef WX_PRECOMP
-#include <stdio.h>
 #include "wx/setup.h"
 #include "wx/defs.h"
+#include "wx/string.h"
 #endif
 
 #include <windows.h>
 
 #include "wx/msw/dibutils.h"
 
+#ifdef __WXWINE__
+  #include <module.h>
+#endif
+
 #if defined(__WIN32__)
 #if !defined(__MWERKS__) && !defined(__SALFORDC__)
     #include <memory.h>             // for _fmemcpy()
 
 #define BFT_ICON   0x4349   /* 'IC' */
 #define BFT_BITMAP 0x4d42   /* 'BM' */
-#define BFT_CURSOR 0x5450   /* 'PT' */
+#define BFT_CURSOR 0x5450   /* 'PT(' */
 
+#ifndef SEEK_CUR
 /* flags for _lseek */
 #define  SEEK_CUR 1
 #define  SEEK_END 2
 #define  SEEK_SET 0
+#endif
+
+/* Copied from PNGhandler for coompilation with MingW32, RR */
+
+#ifndef GlobalAllocPtr
+#define     GlobalPtrHandle(lp)         \
+                ((HGLOBAL)GlobalHandle(lp))
+
+#define     GlobalLockPtr(lp)                \
+                ((BOOL)GlobalLock(GlobalPtrHandle(lp)))
+#define     GlobalUnlockPtr(lp)      \
+                GlobalUnlock(GlobalPtrHandle(lp))
+
+#define     GlobalAllocPtr(flags, cb)        \
+                (GlobalLock(GlobalAlloc((flags), (cb))))
+#define     GlobalReAllocPtr(lp, cbNew, flags)       \
+                (GlobalUnlockPtr(lp), GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) , (cbNew), (flags))))
+#define     GlobalFreePtr(lp)                \
+                (GlobalUnlockPtr(lp), (BOOL)GlobalFree(GlobalPtrHandle(lp)))
+#endif
 
 
 /*
- *  Clear the System Palette so that we can ensure an identity palette 
+ *  Clear the System Palette so that we can ensure an identity palette
  *  mapping for fast performance.
  */
 
-void ClearSystemPalette(void)
+void wxClearSystemPalette(void)
 {
   //*** A dummy palette setup
   struct
@@ -77,8 +102,8 @@ void ClearSystemPalette(void)
   UINT nMapped = 0;
   BOOL bOK = FALSE;
   int  nOK = 0;
-  
-  //*** Reset everything in the system palette to black
+
+  // *** Reset everything in the system palette to black
   for(Counter = 0; Counter < 256; Counter++)
   {
     Palette.aEntries[Counter].peRed = 0;
@@ -87,8 +112,12 @@ void ClearSystemPalette(void)
     Palette.aEntries[Counter].peFlags = PC_NOCOLLAPSE;
   }
 
-  //*** Create, select, realize, deselect, and delete the palette
+  // *** Create, select, realize, deselect, and delete the palette
+#ifdef __WXWINE__
+  ScreenDC = GetDC((HWND)NULL);
+#else
   ScreenDC = GetDC(NULL);
+#endif
   ScreenPalette = CreatePalette((LOGPALETTE *)&Palette);
 
   if (ScreenPalette)
@@ -99,7 +128,11 @@ void ClearSystemPalette(void)
     bOK = DeleteObject(ScreenPalette);
   }
 
+#ifdef __WXWINE__
+  nOK = ReleaseDC((HWND)NULL, ScreenDC);
+#else
   nOK = ReleaseDC(NULL, ScreenDC);
+#endif
 
   return;
 }
@@ -113,48 +146,47 @@ void ClearSystemPalette(void)
  *   bits....
  */
 
-int DibWriteFile(LPSTR szFile, LPBITMAPINFOHEADER lpbi)
+int wxDibWriteFile(LPTSTR szFile, LPBITMAPINFOHEADER lpbi)
 {
    HFILE               fh;
    OFSTRUCT            of;
 
-   fh = OpenFile(szFile, &of, OF_WRITE | OF_CREATE);
+   fh = OpenFile(wxConvFile.cWX2MB(szFile), &of, OF_WRITE | OF_CREATE);
 
   if (!fh) {
 //   printf("la regamos0");
    return 0;
   }
 
-  long size = DibSize(lpbi);
+  long size = wxDibSize(lpbi);
 
   // write file header
   BITMAPFILEHEADER bmf;
-  bmf.bfType = 'BM';
+  bmf.bfType = BFT_BITMAP;
   bmf.bfSize = sizeof(bmf) + size;
   bmf.bfReserved1 = 0;
   bmf.bfReserved2 = 0;
-  bmf.bfOffBits = sizeof(bmf) + (char far*)(DibPtr(lpbi)) - (char far*)lpbi;
-#if defined( __WATCOMC__) || defined(__VISUALC__) || defined(__SC__) || defined(__SALFORDC__)
-  if (_hwrite(fh, (LPCSTR)(&bmf), sizeof(bmf))<0 ||
-  _hwrite(fh, (LPCSTR)lpbi, size)<0) {
-    _lclose(fh);
-//   printf("la regamos1");
-    return 0;
-  }
-#else
-  if (_hwrite(fh, (LPBYTE)(&bmf), sizeof(bmf))<0 ||
-  _hwrite(fh, (LPBYTE)lpbi, size)<0) {
+  bmf.bfOffBits = sizeof(bmf) + (char FAR*)(wxDibPtr(lpbi)) - (char FAR*)lpbi;
+#if 1 // defined( __WATCOMC__) || defined(__VISUALC__) || defined(__SC__) || defined(__SALFORDC__) || defined(__MWERKS__) || defined(wxUSE_NORLANDER_HEADERS)
+  #define HWRITE_2ND_ARG_TYPE   LPCSTR
+#else // don't know who needs this...
+  #define HWRITE_2ND_ARG_TYPE   LPBYTE
+#endif
+
+  if ( _hwrite(fh, (HWRITE_2ND_ARG_TYPE)(&bmf), sizeof(bmf)) < 0 ||
+       _hwrite(fh, (HWRITE_2ND_ARG_TYPE)lpbi, size) < 0 )
+  {
     _lclose(fh);
-//   printf("la regamos1");
     return 0;
   }
-#endif
+
+#undef HWRITE_2ND_ARG_TYPE
 
   _lclose(fh);
   return 1;
 }
 
-PDIB DibOpenFile(LPSTR szFile)
+PDIB wxDibOpenFile(LPTSTR szFile)
 {
    HFILE               fh;
    DWORD               dwLen;
@@ -169,7 +201,7 @@ PDIB DibOpenFile(LPSTR szFile)
    #define GetCurrentInstance()    (HINSTANCE)SELECTOROF((LPVOID)&of)
 #endif
 
-   fh = OpenFile(szFile, &of, OF_READ);
+   fh = OpenFile(wxConvFile.cWX2MB(szFile), &of, OF_READ);
 
    if (fh == -1)
    {
@@ -178,6 +210,8 @@ PDIB DibOpenFile(LPSTR szFile)
           // TODO: Unicode version
 #ifdef __WIN16__
       h = FindResource(GetCurrentInstance(), szFile, RT_BITMAP);
+#elif wxUSE_UNICODE
+      h = FindResourceW(GetCurrentInstance(), szFile, RT_BITMAP);
 #else
       h = FindResourceA(GetCurrentInstance(), szFile, RT_BITMAP);
 #endif
@@ -196,7 +230,7 @@ PDIB DibOpenFile(LPSTR szFile)
    if (fh == -1)
       return NULL;
 
-   pdib = DibReadBitmapInfo(fh);
+   pdib = wxDibReadBitmapInfo(fh);
 
    if (!pdib)
       return NULL;
@@ -204,7 +238,7 @@ PDIB DibOpenFile(LPSTR szFile)
     /* How much memory do we need to hold the DIB */
 
     dwBits = pdib->biSizeImage;
-    dwLen  = pdib->biSize + DibPaletteSize(pdib) + dwBits;
+    dwLen  = pdib->biSize + wxDibPaletteSize(pdib) + dwBits;
 
     /* Can we get more memory? */
 
@@ -223,7 +257,7 @@ PDIB DibOpenFile(LPSTR szFile)
     if (pdib)
     {
       /* read in the bits */
-      _hread(fh, (LPBYTE)pdib + (UINT)pdib->biSize + DibPaletteSize(pdib), dwBits);
+      _hread(fh, (LPBYTE)pdib + (UINT)pdib->biSize + wxDibPaletteSize(pdib), dwBits);
     }
 
     _lclose(fh);
@@ -240,10 +274,9 @@ PDIB DibOpenFile(LPSTR szFile)
  *  bitmap formats, but will always return a "new" BITMAPINFO.
  */
 
-PDIB DibReadBitmapInfo(HFILE fh)
+PDIB wxDibReadBitmapInfo(HFILE fh)
 {
     DWORD     off;
-    HANDLE    hbi = NULL;
     int       size;
     int       i;
     int       nNumColors;
@@ -302,16 +335,16 @@ PDIB DibReadBitmapInfo(HFILE fh)
             break;
     }
 
-    nNumColors = DibNumColors(&bi);
+    nNumColors = wxDibNumColors(&bi);
 
 #if 0
     if (bi.biSizeImage == 0)
         bi.biSizeImage = DibSizeImage(&bi);
 
     if (bi.biClrUsed == 0)
-        bi.biClrUsed = DibNumColors(&bi);
+        bi.biClrUsed = wxDibNumColors(&bi);
 #else
-    FixBitmapInfo(&bi);
+    wxFixBitmapInfo(&bi);
 #endif
 
     pdib = (PDIB)GlobalAllocPtr(GMEM_MOVEABLE,(LONG)bi.biSize + nNumColors * sizeof(RGBQUAD));
@@ -321,7 +354,7 @@ PDIB DibReadBitmapInfo(HFILE fh)
 
     *pdib = bi;
 
-    pRgb = DibColors(pdib);
+    pRgb = wxDibColors(pdib);
 
     if (nNumColors)
     {
@@ -368,7 +401,7 @@ PDIB DibReadBitmapInfo(HFILE fh)
  *      in the passed palette
  */
 
-BOOL DibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage)
+BOOL wxDibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage)
 {
     PALETTEENTRY       ape[256];
     RGBQUAD FAR *      pRgb;
@@ -382,14 +415,14 @@ BOOL DibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage)
     if (!pdib)
         return FALSE;
 
-    nColors = DibNumColors(pdib);
-    
-    if (nColors == 3 && DibCompression(pdib) == BI_BITFIELDS)
+    nColors = wxDibNumColors(pdib);
+
+    if (nColors == 3 && wxDibCompression(pdib) == BI_BITFIELDS)
         nColors = 0;
 
     if (nColors > 0)
     {
-        pRgb = DibColors(pdib);
+        pRgb = wxDibColors(pdib);
 
         switch (wUsage)
         {
@@ -430,7 +463,7 @@ BOOL DibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage)
  *  given number of bits per pixel
  */
 
-PDIB DibCreate(int bits, int dx, int dy)
+PDIB wxDibCreate(int bits, int dx, int dy)
 {
     LPBITMAPINFOHEADER lpbi ;
     DWORD       dwSizeImage;
@@ -582,7 +615,7 @@ static void hmemmove(BYTE _huge *d, BYTE _huge *s, LONG len)
  *  the colors of the given palette.
  */
 
-BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal)
+BOOL wxDibMapToPalette(PDIB pdib, HPALETTE hpal)
 {
    LPBITMAPINFOHEADER  lpbi;
    PALETTEENTRY        pe;
@@ -598,13 +631,13 @@ BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal)
       return FALSE;
 
    lpbi   = (LPBITMAPINFOHEADER)pdib;
-   lpRgb  = DibColors(pdib);
+   lpRgb  = wxDibColors(pdib);
 
    GetObject(hpal,sizeof(int),(LPSTR)&nPalColors);
-   nDibColors = DibNumColors(pdib);
+   nDibColors = wxDibNumColors(pdib);
 
    if ((SizeImage = lpbi->biSizeImage) == 0)
-      SizeImage = DibSizeImage(lpbi);
+      SizeImage = wxDibSizeImage(lpbi);
 
    //
    //  build a xlat table. from the current DIB colors to the given
@@ -613,7 +646,7 @@ BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal)
    for (n=0; n<nDibColors; n++)
       xlat[n] = (BYTE)GetNearestPaletteIndex(hpal,RGB(lpRgb[n].rgbRed,lpRgb[n].rgbGreen,lpRgb[n].rgbBlue));
 
-   lpBits = (LPBYTE)DibPtr(lpbi);
+   lpBits = (LPBYTE)wxDibPtr(lpbi);
    lpbi->biClrUsed = nPalColors;
 
    //
@@ -622,14 +655,14 @@ BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal)
    if (nPalColors > nDibColors)
    {
       GlobalReAllocPtr(lpbi, lpbi->biSize + nPalColors*sizeof(RGBQUAD) + SizeImage, 0);
-      hmemmove((BYTE _huge *)DibPtr(lpbi), (BYTE _huge *)lpBits, SizeImage);
-      lpBits = (LPBYTE)DibPtr(lpbi);
+      hmemmove((BYTE _huge *)wxDibPtr(lpbi), (BYTE _huge *)lpBits, SizeImage);
+      lpBits = (LPBYTE)wxDibPtr(lpbi);
    }
    else if (nPalColors < nDibColors)
    {
-      hmemcpy(DibPtr(lpbi), lpBits, SizeImage);
+      hmemcpy(wxDibPtr(lpbi), lpBits, SizeImage);
       GlobalReAllocPtr(lpbi, lpbi->biSize + nPalColors*sizeof(RGBQUAD) + SizeImage, 0);
-      lpBits = (LPBYTE)DibPtr(lpbi);
+      lpBits = (LPBYTE)wxDibPtr(lpbi);
    }
 
    //
@@ -670,10 +703,10 @@ BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal)
 }
 
 
-HPALETTE MakePalette(const BITMAPINFO FAR* Info, UINT flags)
+HPALETTE wxMakePalette(const BITMAPINFO FAR* Info, UINT flags)
 {
   HPALETTE hPalette;
-  const RGBQUAD far* rgb = Info->bmiColors;
+  const RGBQUAD FAR* rgb = Info->bmiColors;
 
   WORD nColors = Info->bmiHeader.biClrUsed;
   if (nColors) {
@@ -682,7 +715,7 @@ HPALETTE MakePalette(const BITMAPINFO FAR* Info, UINT flags)
 
    logPal->palVersion  = 0x300; // Windows 3.0 version
    logPal->palNumEntries = nColors;
-   for (short n = 0; n < nColors; n++) {
+   for (WORD n = 0; n < nColors; n++) {
     logPal->palPalEntry[n].peRed   = rgb[n].rgbRed;
     logPal->palPalEntry[n].peGreen = rgb[n].rgbGreen;
     logPal->palPalEntry[n].peBlue  = rgb[n].rgbBlue;