Author: fireball
Date: Tue Feb 16 19:43:21 2010
New Revision: 45599
URL:
http://svn.reactos.org/svn/reactos?rev=45599&view=rev
Log:
- Implement usermode part of SetDIBitsToDevice.
Modified:
branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
branches/arwinss/reactos/dll/win32/winent.drv/winent.h
Modified: branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winen…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] Tue Feb 16
19:43:21 2010
@@ -732,8 +732,59 @@
UINT startscan, UINT lines, LPCVOID bits,
const BITMAPINFO *info, UINT coloruse )
{
- UNIMPLEMENTED;
- return 0;
+ BOOL top_down;
+ LONG height, width;
+ WORD infoBpp, compression;
+ POINT pt;
+
+ pt.x = xDest; pt.y = yDest;
+ LPtoDP(physDev->hUserDC, &pt, 1);
+
+ /* Perform extensive parameter checking */
+ if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height,
+ &infoBpp, &compression ) == -1)
+ return 0;
+
+ top_down = (height < 0);
+ if (top_down) height = -height;
+
+ if (!lines || (startscan >= height)) return 0;
+ if (!top_down && startscan + lines > height) lines = height - startscan;
+
+ /* make xSrc,ySrc point to the upper-left corner, not the lower-left one,
+ * and clamp all values to fit inside [startscan,startscan+lines]
+ */
+ if (ySrc + cy <= startscan + lines)
+ {
+ UINT y = startscan + lines - (ySrc + cy);
+ if (ySrc < startscan) cy -= (startscan - ySrc);
+ if (!top_down)
+ {
+ /* avoid getting unnecessary lines */
+ ySrc = 0;
+ if (y >= lines) return 0;
+ lines -= y;
+ }
+ else
+ {
+ if (y >= lines) return lines;
+ ySrc = y; /* need to get all lines in top down mode */
+ }
+ }
+ else
+ {
+ if (ySrc >= startscan + lines) return lines;
+ pt.y += ySrc + cy - (startscan + lines);
+ cy = startscan + lines - ySrc;
+ ySrc = 0;
+ if (cy > lines) cy = lines;
+ }
+ if (xSrc >= width) return lines;
+ if (xSrc + cx >= width) cx = width - xSrc;
+ if (!cx || !cy) return lines;
+
+ return RosGdiSetDIBitsToDevice(physDev->hKernelDC, pt.x, pt.y, cx, cy,
+ xSrc, ySrc, startscan, lines, bits, info, coloruse);
}
void CDECL RosDrv_SetDeviceClipping( NTDRV_PDEVICE *physDev, HRGN vis_rgn, HRGN clip_rgn
)
@@ -850,4 +901,54 @@
return FALSE;
}
+/***********************************************************************
+ * DIB_GetBitmapInfoEx
+ *
+ * Get the info from a bitmap header.
+ * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
+ */
+int DIB_GetBitmapInfoEx( const BITMAPINFOHEADER *header, LONG *width,
+ LONG *height, WORD *planes, WORD *bpp,
+ WORD *compr, DWORD *size )
+{
+ if (header->biSize == sizeof(BITMAPCOREHEADER))
+ {
+ const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *)header;
+ *width = core->bcWidth;
+ *height = core->bcHeight;
+ *planes = core->bcPlanes;
+ *bpp = core->bcBitCount;
+ *compr = 0;
+ *size = 0;
+ return 0;
+ }
+ if (header->biSize >= sizeof(BITMAPINFOHEADER))
+ {
+ *width = header->biWidth;
+ *height = header->biHeight;
+ *planes = header->biPlanes;
+ *bpp = header->biBitCount;
+ *compr = header->biCompression;
+ *size = header->biSizeImage;
+ return 1;
+ }
+ ERR("(%d): unknown/wrong size for header\n", header->biSize );
+ return -1;
+}
+
+/***********************************************************************
+ * DIB_GetBitmapInfo
+ *
+ * Get the info from a bitmap header.
+ * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error.
+ */
+int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width,
+ LONG *height, WORD *bpp, WORD *compr )
+{
+ WORD planes;
+ DWORD size;
+
+ return DIB_GetBitmapInfoEx( header, width, height, &planes, bpp, compr,
&size);
+}
+
/* EOF */
Modified: branches/arwinss/reactos/dll/win32/winent.drv/winent.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winen…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/winent.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/winent.h [iso-8859-1] Tue Feb 16
19:43:21 2010
@@ -37,6 +37,15 @@
RECT client_rect; /* client area relative to parent */
};
+/* gdidrv.c */
+int DIB_GetBitmapInfoEx( const BITMAPINFOHEADER *header, LONG *width,
+ LONG *height, WORD *planes, WORD *bpp,
+ WORD *compr, DWORD *size );
+
+int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width,
+ LONG *height, WORD *bpp, WORD *compr );
+
+
/* font.c */
VOID
FeSelectFont(NTDRV_PDEVICE *physDev, HFONT hFont);