[ros-diffs] [fireball] 45600: - Implement kernelmode part of SetDIBitsToDevice (heavily based on win32k from r41760).

fireball at svn.reactos.org fireball at svn.reactos.org
Tue Feb 16 19:45:49 CET 2010


Author: fireball
Date: Tue Feb 16 19:45:49 2010
New Revision: 45600

URL: http://svn.reactos.org/svn/reactos?rev=45600&view=rev
Log:
- Implement kernelmode part of SetDIBitsToDevice (heavily based on win32k from r41760).

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
    branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c?rev=45600&r1=45599&r2=45600&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/bitmap.c [iso-8859-1] Tue Feb 16 19:45:49 2010
@@ -388,11 +388,33 @@
 
 INT APIENTRY RosGdiSetDIBitsToDevice( HDC physDev, INT xDest, INT yDest, DWORD cx,
                                     DWORD cy, INT xSrc, INT ySrc,
-                                    UINT startscan, UINT lines, LPCVOID bits,
-                                    const BITMAPINFO *info, UINT coloruse )
-{
-    UNIMPLEMENTED;
-    return 0;
+                                    UINT StartScan, UINT ScanLines, LPCVOID Bits,
+                                    const BITMAPINFO *bmi, UINT ColorUse )
+{
+    PDC pDC;
+
+    /* Get a pointer to the DCs */
+    pDC = DC_Lock(physDev);
+
+    /* Set the bits */
+    ScanLines = GreSetDIBitsToDevice(pDC,
+                                     xDest,
+                                     yDest,
+                                     cx,
+                                     cy,
+                                     xSrc,
+                                     ySrc,
+                                     StartScan,
+                                     ScanLines,
+                                     Bits,
+                                     bmi,
+                                     ColorUse);
+
+    /* Release DC objects */
+    DC_Unlock(pDC);
+
+    /* Return amount of lines set */
+    return ScanLines;
 }
 
 BOOL APIENTRY RosGdiStretchBlt( HDC physDevDst, INT xDst, INT yDst,

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c?rev=45600&r1=45599&r2=45600&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] Tue Feb 16 19:45:49 2010
@@ -1093,4 +1093,138 @@
     return Result;
 }
 
+INT
+NTAPI
+GreSetDIBitsToDevice(
+    PDC   pDC,
+    INT   XDest,
+    INT   YDest,
+    DWORD Width,
+    DWORD Height,
+    INT   XSrc,
+    INT   YSrc,
+    UINT  StartScan,
+    UINT  ScanLines,
+    CONST VOID  *Bits,
+    CONST BITMAPINFO  *bmi,
+    UINT  ColorUse)
+{
+    INT ret = 0;
+    NTSTATUS Status = STATUS_SUCCESS;
+    HBITMAP hSourceBitmap = NULL;
+    SURFOBJ *pDestSurf, *pSourceSurf = NULL;
+    SURFACE *pSurf;
+    RECTL rcDest;
+    POINTL ptSource;
+    INT DIBWidth;
+    SIZEL SourceSize;
+    XLATEOBJ *XlateObj = NULL;
+    PPALETTE pDCPalette;
+    HPALETTE DDBPalette, DIBPalette = NULL;
+    ULONG DDBPaletteType, DIBPaletteType;
+
+    if (!Bits) return 0;
+
+    /* Use destination palette obtained from the DC by default */
+    DDBPalette = pDC->pPDevice->DevInfo.hpalDefault;
+
+    /* Try to use hDIBPalette if it exists */
+    pSurf = pDC->pBitmap;
+    if (pSurf && pSurf->hDIBPalette)
+    {
+        DDBPalette = pSurf->hDIBPalette;
+    }
+
+    pDestSurf = pSurf ? &pSurf->SurfObj : NULL;
+
+    rcDest.left = XDest;
+    rcDest.top = YDest;
+    rcDest.left += pDC->rcVport.left + pDC->rcDcRect.left;
+    rcDest.top += pDC->rcVport.top + pDC->rcDcRect.top;
+
+    rcDest.right = rcDest.left + Width;
+    rcDest.bottom = rcDest.top + Height;
+    ptSource.x = XSrc;
+    ptSource.y = YSrc;
+
+    SourceSize.cx = bmi->bmiHeader.biWidth;
+    SourceSize.cy = ScanLines; // this one --> abs(bmi->bmiHeader.biHeight) - StartScan
+    DIBWidth = DIB_GetDIBWidthBytes(SourceSize.cx, bmi->bmiHeader.biBitCount);
+
+    hSourceBitmap = EngCreateBitmap(SourceSize,
+                                    DIBWidth,
+                                    GrepBitmapFormat(bmi->bmiHeader.biBitCount, bmi->bmiHeader.biCompression),
+                                    bmi->bmiHeader.biHeight < 0 ? BMF_TOPDOWN : 0,
+                                    (PVOID) Bits);
+    if (!hSourceBitmap)
+    {
+        SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+        Status = STATUS_NO_MEMORY;
+        goto Exit;
+    }
+
+    pSourceSurf = EngLockSurface((HSURF)hSourceBitmap);
+    if (!pSourceSurf)
+    {
+        Status = STATUS_UNSUCCESSFUL;
+        goto Exit;
+    }
+
+    /* Obtain destination palette */
+    pDCPalette = PALETTE_LockPalette(DDBPalette);
+    if (!pDCPalette)
+    {
+        SetLastWin32Error(ERROR_INVALID_HANDLE);
+        Status = STATUS_UNSUCCESSFUL;
+        goto Exit;
+    }
+
+    DDBPaletteType = pDCPalette->Mode;
+    PALETTE_UnlockPalette(pDCPalette);
+
+    DIBPalette = BuildDIBPalette(bmi, (PINT)&DIBPaletteType);
+    if (!DIBPalette)
+    {
+        SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+        Status = STATUS_NO_MEMORY;
+        goto Exit;
+    }
+
+    /* Determine XlateObj */
+    XlateObj = IntEngCreateXlate(DDBPaletteType, DIBPaletteType, DDBPalette, DIBPalette);
+    if (!XlateObj)
+    {
+        SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
+        Status = STATUS_NO_MEMORY;
+        goto Exit;
+    }
+
+    /* Copy the bits */
+    Status = GrepBitBltEx(pDestSurf,
+                          pSourceSurf,
+                          NULL,
+                          pDC->CombinedClip,
+                          XlateObj,
+                          &rcDest,
+                          &ptSource,
+                          NULL,
+                          NULL,
+                          NULL,
+                          ROP3_TO_ROP4(SRCCOPY),
+                          TRUE);
+Exit:
+    if (NT_SUCCESS(Status))
+    {
+        /* FIXME: Should probably be only the number of lines actually copied */
+        ret = ScanLines; // this one --> abs(Info->bmiHeader.biHeight) - StartScan;
+    }
+
+    if (pSourceSurf) EngUnlockSurface(pSourceSurf);
+    if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap);
+    if (XlateObj) EngDeleteXlate(XlateObj);
+    if (DIBPalette) PALETTE_FreePaletteByHandle(DIBPalette);
+
+    return ret;
+}
+
 /* EOF */

Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h?rev=45600&r1=45599&r2=45600&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] Tue Feb 16 19:45:49 2010
@@ -93,6 +93,22 @@
     BITMAPINFO  *bmi,
     UINT  ColorUse);
 
+INT
+NTAPI
+GreSetDIBitsToDevice(
+    PDC   DC,
+    INT   xDest,
+    INT   yDest,
+    DWORD cx,
+    DWORD cy,
+    INT   xSrc,
+    INT   ySrc,
+    UINT  StartScan,
+    UINT  ScanLines,
+    CONST VOID  *Bits,
+    CONST BITMAPINFO  *bmi,
+    UINT  ColorUse);
+
 INT FASTCALL
 BitsPerFormat(ULONG Format);
 
@@ -362,4 +378,7 @@
 INT FASTCALL
 MouseSafetyOnDrawEnd(SURFOBJ *pso);
 
+/* Test functions */
+VOID NTAPI GrePerformTests();
+
 #endif




More information about the Ros-diffs mailing list