]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/bitmap.cpp
applied patch #103444
[wxWidgets.git] / src / os2 / bitmap.cpp
index 62d8a3bc6fe91cdb4d0897f8b668e83756df01f6..11f601c829575a534b1d4dbaca982f0bd13230e3 100644 (file)
@@ -965,3 +965,73 @@ bool wxBitmapHandler::SaveFile(
     return(FALSE);
 }
 
+// ----------------------------------------------------------------------------
+// Utility functions
+// ----------------------------------------------------------------------------
+HBITMAP wxInvertMask(
+  HBITMAP                           hBmpMask
+, int                               nWidth
+, int                               nHeight
+)
+{
+    HBITMAP                         hBmpInvMask = 0;
+
+    wxCHECK_MSG( hBmpMask, 0, _T("invalid bitmap in wxInvertMask") );
+
+    //
+    // Get width/height from the bitmap if not given
+    //
+    if (!nWidth || !nHeight)
+    {
+        BITMAPINFOHEADER2           vBmhdr;
+
+        ::GpiQueryBitmapInfoHeader( hBmpMask
+                                   ,&vBmhdr
+                                  );
+        nWidth  = (int)vBmhdr.cx;
+        nHeight = (int)vBmhdr.cy;
+    }
+
+    BITMAPINFOHEADER2               vBmih;
+    SIZEL                           vSize = {0, 0};
+    DEVOPENSTRUC                    vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+    HDC                             hDCSrc = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE);
+    HDC                             hDCDst = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE);
+    HPS                             hPSSrc = ::GpiCreatePS(vHabmain, hDCSrc, &vSize, PU_PELS | GPIA_ASSOC);
+    HPS                             hPSDst = ::GpiCreatePS(vHabmain, hDCDst, &vSize, PU_PELS | GPIA_ASSOC);
+    POINTL                          vPoint[4] = { 0 ,0, nWidth, nHeight,
+                                                  0, 0, nWidth, nHeight
+                                                };
+
+    memset(&vBmih, '\0', sizeof(BITMAPINFOHEADER2));
+    vBmih.cbFix     =  sizeof(BITMAPINFOHEADER2);
+    vBmih.cx        = nWidth;
+    vBmih.cy        = nHeight;
+    vBmih.cPlanes   = 1;
+    vBmih.cBitCount = 1;
+
+    hBmpInvMask = ::GpiCreateBitmap( hPSDst
+                                    ,&vBmih
+                                    ,0L
+                                    ,NULL
+                                    ,NULL
+                                   );
+
+    ::GpiSetBitmap(hPSSrc, (HBITMAP) hBmpMask);
+    ::GpiSetBitmap(hPSDst, (HBITMAP) hBmpInvMask);
+
+    ::GpiBitBlt( hPSDst
+                ,hPSSrc
+                ,4L
+                ,vPoint
+                ,ROP_SRCCOPY
+                ,BBO_IGNORE
+               );
+
+    ::GpiDestroyPS(hPSSrc);
+    ::GpiDestroyPS(hPSDst);
+    ::DevCloseDC(hDCSrc);
+    ::DevCloseDC(hDCDst);
+
+    return hBmpInvMask;
+} // end of WxWinGdi_InvertMask