Author: tkreuzer
Date: Sat May 12 21:05:35 2012
New Revision: 56569
URL:
http://svn.reactos.org/svn/reactos?rev=56569&view=rev
Log:
[WIN32K]
Halfplement GreCreateDIBitmapInternal
Modified:
branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c
Modified: branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c
URL:
http://svn.reactos.org/svn/reactos/branches/dib_rewrite/win32ss/gdi/ntgdi/d…
==============================================================================
--- branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c [iso-8859-1] (original)
+++ branches/dib_rewrite/win32ss/gdi/ntgdi/dibitmap.c [iso-8859-1] Sat May 12 21:05:35
2012
@@ -565,7 +565,10 @@
_In_ HANDLE hcmXform)
{
PDC pdc;
- PSURFACE psurfDIB;
+ PSURFACE psurfDIB, psurfDC, psurfBmp;
+ ULONG iFormat;
+ PPALETTE ppalBmp;
+ HBITMAP hbmp;
/* Check if we got a DC */
if (hdc)
@@ -576,6 +579,8 @@
{
return NULL;
}
+
+ psurfDC = pdc->dclevel.pSurface;
}
else
{
@@ -593,6 +598,82 @@
cjMaxBits);
}
+
+ if (fInit & CBM_CREATDIB)
+ {
+ if (iUsage == 2) goto cleanup;
+
+ /* Need a DC for DIB_PAL_COLORS */
+ if ((iUsage == DIB_PAL_COLORS) && !pdc) goto cleanup;
+
+ iFormat = psurfDIB->SurfObj.iBitmapFormat;
+
+ if (psurfDIB)
+ {
+ ppalBmp = psurfDIB->ppal;
+ GDIOBJ_vReferenceObjectByPointer(&ppalBmp->BaseObject);
+ }
+ else
+ {
+ ppalBmp = CreateDIBPalette(pbmi, pdc, iUsage);
+ }
+ }
+ else
+ {
+ if (psurfDC)
+ {
+ /* Use the same format as the DC surface */
+ iFormat = psurfDC->SurfObj.iBitmapFormat;
+ ppalBmp = psurfDC->ppal;
+ }
+ else
+ {
+ __debugbreak();
+ }
+
+ GDIOBJ_vReferenceObjectByPointer(&ppalBmp->BaseObject);
+ }
+
+ /* Allocate a surface for the bitmap */
+ psurfBmp = SURFACE_AllocSurface(STYPE_BITMAP, cx, cy, iFormat, 0, 0, NULL);
+ if (psurfBmp)
+ {
+ /* Set new palette for the bitmap */
+ SURFACE_vSetPalette(psurfBmp, ppalBmp);
+
+ if (pjInit)
+ {
+ RECTL rclDest = {0, 0, cx, cy};
+ POINTL ptlSrc = {0, 0};
+ EXLATEOBJ exlo;
+
+ /* Initialize XLATEOBJ */
+ EXLATEOBJ_vInitialize(&exlo,
+ psurfBmp->ppal,
+ psurfDIB->ppal,
+ RGB(0xff, 0xff, 0xff),
+ RGB(0xff, 0xff, 0xff),
+ RGB(0x00, 0x00, 0x00));
+
+ EngCopyBits(&psurfBmp->SurfObj,
+ &psurfDIB->SurfObj,
+ NULL,
+ &exlo.xlo,
+ &rclDest,
+ &ptlSrc);
+
+ EXLATEOBJ_vCleanup(&exlo);
+ }
+
+ /* Get the bitmap handle and unlock the bitmap */
+ hbmp = psurfBmp->BaseObject.hHmgr;
+ SURFACE_UnlockSurface(psurfBmp);
+ }
+
+
+cleanup:
+
+ if (ppalBmp) PALETTE_ShareUnlockPalette(ppalBmp);
return 0;
}