Author: fireball
Date: Mon Oct 12 17:03:17 2009
New Revision: 43404
URL:
http://svn.reactos.org/svn/reactos?rev=43404&view=rev
Log:
[arwinss]
- Sync up to Wine-1.1.31.
Modified:
branches/arwinss/reactos/dll/win32/winex11.drv/ (props changed)
branches/arwinss/reactos/dll/win32/winex11.drv/bitblt.c
branches/arwinss/reactos/dll/win32/winex11.drv/brush.c
branches/arwinss/reactos/dll/win32/winex11.drv/dib.c
branches/arwinss/reactos/dll/win32/winex11.drv/event.c
branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec
branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h
branches/arwinss/reactos/dll/win32/winex11.drv/xfont.c
branches/arwinss/reactos/dll/win32/winex11.drv/xrender.c
Propchange: branches/arwinss/reactos/dll/win32/winex11.drv/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 12 17:03:17 2009
@@ -1,3 +1,3 @@
/branches/ros-amd64-bringup/reactos/dll/win32/winex11.drv:35746,35789,36614,36930,38148,38151,38265,38268,39333,39345,40991,41000,41027-41028,41050,41052,41082-41086,41549,43080
/trunk/reactos/dll/win32/winex11.drv:42000-43126
-/vendor/wine/dlls/winex11.drv/current:43149
+/vendor/wine/dlls/winex11.drv/current:43149,43398
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/bitblt.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/bitblt.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/bitblt.c [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -1231,19 +1231,137 @@
/***********************************************************************
- * BITBLT_InternalStretchBlt
- *
- * Implementation of PatBlt(), BitBlt() and StretchBlt().
+ * client_side_dib_copy
*/
-static BOOL BITBLT_InternalStretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
- INT widthDst, INT heightDst,
- X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
- INT widthSrc, INT heightSrc,
- DWORD rop )
+static BOOL client_side_dib_copy( X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
+ X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
+ INT width, INT height )
+{
+ DIBSECTION srcDib, dstDib;
+ BYTE *srcPtr, *dstPtr;
+ INT srcRowOffset, dstRowOffset;
+ INT bytesPerPixel;
+ INT bytesToCopy;
+ INT y;
+ static RECT unusedRect;
+
+ if (GetObjectW(physDevSrc->bitmap->hbitmap, sizeof(srcDib), &srcDib) !=
sizeof(srcDib))
+ return FALSE;
+ if (GetObjectW(physDevDst->bitmap->hbitmap, sizeof(dstDib), &dstDib) !=
sizeof(dstDib))
+ return FALSE;
+
+ /* check for oversized values, just like X11DRV_DIB_CopyDIBSection() */
+ if (xSrc > srcDib.dsBm.bmWidth || ySrc > srcDib.dsBm.bmHeight)
+ return FALSE;
+ if (xSrc + width > srcDib.dsBm.bmWidth)
+ width = srcDib.dsBm.bmWidth - xSrc;
+ if (ySrc + height > srcDib.dsBm.bmHeight)
+ height = srcDib.dsBm.bmHeight - ySrc;
+
+ if (GetRgnBox(physDevDst->region, &unusedRect) == COMPLEXREGION)
+ {
+ /* for simple regions, the clipping was already done by BITBLT_GetVisRectangles */
+ FIXME("potential optimization: client-side complex region clipping\n");
+ return FALSE;
+ }
+ if (dstDib.dsBm.bmBitsPixel <= 8)
+ {
+ FIXME("potential optimization: client-side color-index mode DIB
copy\n");
+ return FALSE;
+ }
+ if (!(srcDib.dsBmih.biCompression == BI_BITFIELDS &&
+ dstDib.dsBmih.biCompression == BI_BITFIELDS &&
+ !memcmp(srcDib.dsBitfields, dstDib.dsBitfields, 3*sizeof(DWORD)))
+ && !(srcDib.dsBmih.biCompression == BI_RGB &&
+ dstDib.dsBmih.biCompression == BI_RGB))
+ {
+ FIXME("potential optimization: client-side compressed DIB copy\n");
+ return FALSE;
+ }
+ if (srcDib.dsBm.bmBitsPixel != dstDib.dsBm.bmBitsPixel)
+ {
+ FIXME("potential optimization: pixel format conversion\n");
+ return FALSE;
+ }
+ if (srcDib.dsBmih.biWidth < 0 || dstDib.dsBmih.biWidth < 0)
+ {
+ FIXME("negative widths not yet implemented\n");
+ return FALSE;
+ }
+
+ switch (dstDib.dsBm.bmBitsPixel)
+ {
+ case 15:
+ case 16:
+ bytesPerPixel = 2;
+ break;
+ case 24:
+ bytesPerPixel = 3;
+ break;
+ case 32:
+ bytesPerPixel = 4;
+ break;
+ default:
+ FIXME("don't know how to work with a depth of %d\n",
physDevSrc->depth);
+ return FALSE;
+ }
+
+ bytesToCopy = width * bytesPerPixel;
+
+ if (srcDib.dsBmih.biHeight < 0)
+ {
+ srcPtr = &physDevSrc->bitmap->base[ySrc*srcDib.dsBm.bmWidthBytes +
xSrc*bytesPerPixel];
+ srcRowOffset = srcDib.dsBm.bmWidthBytes;
+ }
+ else
+ {
+ srcPtr =
&physDevSrc->bitmap->base[(srcDib.dsBm.bmHeight-ySrc-1)*srcDib.dsBm.bmWidthBytes
+ + xSrc*bytesPerPixel];
+ srcRowOffset = -srcDib.dsBm.bmWidthBytes;
+ }
+ if (dstDib.dsBmih.biHeight < 0)
+ {
+ dstPtr = &physDevDst->bitmap->base[yDst*dstDib.dsBm.bmWidthBytes +
xDst*bytesPerPixel];
+ dstRowOffset = dstDib.dsBm.bmWidthBytes;
+ }
+ else
+ {
+ dstPtr =
&physDevDst->bitmap->base[(dstDib.dsBm.bmHeight-yDst-1)*dstDib.dsBm.bmWidthBytes
+ + xDst*bytesPerPixel];
+ dstRowOffset = -dstDib.dsBm.bmWidthBytes;
+ }
+
+ /* Handle overlapping regions on the same DIB */
+ if (physDevSrc == physDevDst && ySrc < yDst)
+ {
+ srcPtr += srcRowOffset * (height - 1);
+ srcRowOffset = -srcRowOffset;
+ dstPtr += dstRowOffset * (height - 1);
+ dstRowOffset = -dstRowOffset;
+ }
+
+ for (y = yDst; y < yDst + height; ++y)
+ {
+ memmove(dstPtr, srcPtr, bytesToCopy);
+ srcPtr += srcRowOffset;
+ dstPtr += dstRowOffset;
+ }
+
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * X11DRV_StretchBlt
+ */
+BOOL CDECL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst, INT
widthDst, INT heightDst,
+ X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc, INT
widthSrc, INT heightSrc,
+ DWORD rop )
{
BOOL usePat, useSrc, useDst, destUsed, fStretch, fNullBrush;
RECT visRectDst, visRectSrc;
INT width, height;
+ INT sDst, sSrc = DIB_Status_None;
const BYTE *opcode;
Pixmap pixmaps[3] = { 0, 0, 0 }; /* pixmaps for DST, SRC, TMP */
GC tmpGC = 0;
@@ -1305,6 +1423,8 @@
visRectSrc.right, visRectSrc.bottom,
visRectDst.left, visRectDst.top,
visRectDst.right, visRectDst.bottom );
+ if (physDevDst != physDevSrc)
+ sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None );
}
else
{
@@ -1319,6 +1439,21 @@
width = visRectDst.right - visRectDst.left;
height = visRectDst.bottom - visRectDst.top;
+
+ sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None );
+ if (physDevDst == physDevSrc) sSrc = sDst;
+
+ /* try client-side DIB copy */
+ if (!fStretch && rop == SRCCOPY &&
+ sSrc == DIB_Status_AppMod && sDst == DIB_Status_AppMod &&
+ physDevSrc->depth == physDevDst->depth)
+ {
+ if (client_side_dib_copy( physDevSrc, visRectSrc.left, visRectSrc.top,
+ physDevDst, visRectDst.left, visRectDst.top, width,
height ))
+ goto done;
+ }
+
+ X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod );
opcode = BITBLT_Opcodes[(rop >> 16) & 0xff];
@@ -1346,7 +1481,7 @@
physDevDst->dc_rect.top + visRectDst.top,
width, height );
wine_tsx11_unlock();
- return TRUE;
+ goto done;
}
break;
case DSTINVERT: /* 0x55 */
@@ -1366,7 +1501,7 @@
physDevDst->dc_rect.top + visRectDst.top,
width, height );
wine_tsx11_unlock();
- return TRUE;
+ goto done;
}
break;
}
@@ -1380,7 +1515,7 @@
width, height );
wine_tsx11_unlock();
}
- return TRUE;
+ goto done;
}
else if (OP_SRCDST(*opcode) == OP_ARGS(SRC,DST))
{
@@ -1388,6 +1523,19 @@
{
wine_tsx11_lock();
XSetFunction( gdi_display, physDevDst->gc, OP_ROP(*opcode) );
+ wine_tsx11_unlock();
+
+ if (physDevSrc != physDevDst)
+ {
+ if (sSrc == DIB_Status_AppMod)
+ {
+ X11DRV_DIB_CopyDIBSection( physDevSrc, physDevDst,
visRectSrc.left, visRectSrc.top,
+ visRectDst.left, visRectDst.top,
width, height );
+ goto done;
+ }
+ X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod );
+ }
+ wine_tsx11_lock();
XCopyArea( gdi_display, physDevSrc->drawable,
physDevDst->drawable, physDevDst->gc,
physDevSrc->dc_rect.left + visRectSrc.left,
@@ -1397,14 +1545,15 @@
physDevDst->dc_rect.top + visRectDst.top );
physDevDst->exposures++;
wine_tsx11_unlock();
- return TRUE;
+ goto done;
}
if (physDevSrc->depth == 1)
{
int fg, bg;
+
+ X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod );
get_colors(physDevDst, physDevSrc, &fg, &bg);
wine_tsx11_lock();
-
XSetBackground( gdi_display, physDevDst->gc, fg );
XSetForeground( gdi_display, physDevDst->gc, bg );
XSetFunction( gdi_display, physDevDst->gc, OP_ROP(*opcode) );
@@ -1417,7 +1566,7 @@
physDevDst->dc_rect.top + visRectDst.top, 1 );
physDevDst->exposures++;
wine_tsx11_unlock();
- return TRUE;
+ goto done;
}
}
}
@@ -1436,6 +1585,8 @@
pixmaps[SRC] = XCreatePixmap( gdi_display, root_window, width, height,
physDevDst->depth );
wine_tsx11_unlock();
+
+ if (physDevDst != physDevSrc) X11DRV_CoerceDIBSection( physDevSrc,
DIB_Status_GdiMod );
if(!X11DRV_XRender_GetSrcAreaStretch( physDevSrc, physDevDst, pixmaps[SRC],
tmpGC,
widthSrc, heightSrc, widthDst, heightDst,
@@ -1501,263 +1652,9 @@
if (pixmaps[TMP]) XFreePixmap( gdi_display, pixmaps[TMP] );
XFreeGC( gdi_display, tmpGC );
wine_tsx11_unlock();
+
+done:
+ if (useSrc && physDevDst != physDevSrc) X11DRV_UnlockDIBSection( physDevSrc,
FALSE );
+ X11DRV_UnlockDIBSection( physDevDst, TRUE );
return TRUE;
}
-
-
-/***********************************************************************
- * X11DRV_PatBlt
- */
-BOOL CDECL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top, INT width, INT
height, DWORD rop )
-{
- BOOL result;
-
- X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod );
- result = BITBLT_InternalStretchBlt( physDev, left, top, width, height, NULL, 0, 0, 0,
0, rop );
- X11DRV_UnlockDIBSection( physDev, TRUE );
- return result;
-}
-
-
-/***********************************************************************
- * X11DRV_ClientSideDIBCopy
- */
-static BOOL X11DRV_ClientSideDIBCopy( X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
- X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
- INT width, INT height )
-{
- DIBSECTION srcDib, dstDib;
- BYTE *srcPtr, *dstPtr;
- INT srcRowOffset, dstRowOffset;
- INT bytesPerPixel;
- INT bytesToCopy;
- INT y;
- static RECT unusedRect;
-
- if (GetObjectW(physDevSrc->bitmap->hbitmap, sizeof(srcDib), &srcDib) !=
sizeof(srcDib))
- return FALSE;
- if (GetObjectW(physDevDst->bitmap->hbitmap, sizeof(dstDib), &dstDib) !=
sizeof(dstDib))
- return FALSE;
-
- /* check for oversized values, just like X11DRV_DIB_CopyDIBSection() */
- if (xSrc > srcDib.dsBm.bmWidth || ySrc > srcDib.dsBm.bmHeight)
- return FALSE;
- if (xSrc + width > srcDib.dsBm.bmWidth)
- width = srcDib.dsBm.bmWidth - xSrc;
- if (ySrc + height > srcDib.dsBm.bmHeight)
- height = srcDib.dsBm.bmHeight - ySrc;
-
- if (GetRgnBox(physDevDst->region, &unusedRect) == COMPLEXREGION)
- {
- /* for simple regions, the clipping was already done by BITBLT_GetVisRectangles */
- FIXME("potential optimization: client-side complex region clipping\n");
- return FALSE;
- }
- if (dstDib.dsBm.bmBitsPixel <= 8)
- {
- FIXME("potential optimization: client-side color-index mode DIB
copy\n");
- return FALSE;
- }
- if (!(srcDib.dsBmih.biCompression == BI_BITFIELDS &&
- dstDib.dsBmih.biCompression == BI_BITFIELDS &&
- !memcmp(srcDib.dsBitfields, dstDib.dsBitfields, 3*sizeof(DWORD)))
- && !(srcDib.dsBmih.biCompression == BI_RGB &&
- dstDib.dsBmih.biCompression == BI_RGB))
- {
- FIXME("potential optimization: client-side compressed DIB copy\n");
- return FALSE;
- }
- if (srcDib.dsBm.bmBitsPixel != dstDib.dsBm.bmBitsPixel)
- {
- FIXME("potential optimization: pixel format conversion\n");
- return FALSE;
- }
- if (srcDib.dsBmih.biWidth < 0 || dstDib.dsBmih.biWidth < 0)
- {
- FIXME("negative widths not yet implemented\n");
- return FALSE;
- }
-
- switch (dstDib.dsBm.bmBitsPixel)
- {
- case 15:
- case 16:
- bytesPerPixel = 2;
- break;
- case 24:
- bytesPerPixel = 3;
- break;
- case 32:
- bytesPerPixel = 4;
- break;
- default:
- FIXME("don't know how to work with a depth of %d\n",
physDevSrc->depth);
- return FALSE;
- }
-
- bytesToCopy = width * bytesPerPixel;
-
- if (srcDib.dsBmih.biHeight < 0)
- {
- srcPtr = &physDevSrc->bitmap->base[ySrc*srcDib.dsBm.bmWidthBytes +
xSrc*bytesPerPixel];
- srcRowOffset = srcDib.dsBm.bmWidthBytes;
- }
- else
- {
- srcPtr =
&physDevSrc->bitmap->base[(srcDib.dsBm.bmHeight-ySrc-1)*srcDib.dsBm.bmWidthBytes
- + xSrc*bytesPerPixel];
- srcRowOffset = -srcDib.dsBm.bmWidthBytes;
- }
- if (dstDib.dsBmih.biHeight < 0)
- {
- dstPtr = &physDevDst->bitmap->base[yDst*dstDib.dsBm.bmWidthBytes +
xDst*bytesPerPixel];
- dstRowOffset = dstDib.dsBm.bmWidthBytes;
- }
- else
- {
- dstPtr =
&physDevDst->bitmap->base[(dstDib.dsBm.bmHeight-yDst-1)*dstDib.dsBm.bmWidthBytes
- + xDst*bytesPerPixel];
- dstRowOffset = -dstDib.dsBm.bmWidthBytes;
- }
-
- /* Handle overlapping regions on the same DIB */
- if (physDevSrc == physDevDst && ySrc < yDst)
- {
- srcPtr += srcRowOffset * (height - 1);
- srcRowOffset = -srcRowOffset;
- dstPtr += dstRowOffset * (height - 1);
- dstRowOffset = -dstRowOffset;
- }
-
- for (y = yDst; y < yDst + height; ++y)
- {
- memmove(dstPtr, srcPtr, bytesToCopy);
- srcPtr += srcRowOffset;
- dstPtr += dstRowOffset;
- }
-
- return TRUE;
-}
-
-
-/***********************************************************************
- * X11DRV_BitBlt
- */
-BOOL CDECL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
- INT width, INT height, X11DRV_PDEVICE *physDevSrc,
- INT xSrc, INT ySrc, DWORD rop )
-{
- BOOL result = FALSE;
- INT sSrc, sDst;
- RECT visRectDst, visRectSrc;
-
- if (((rop >> 16) & 0x55) == ((rop >> 17) & 0x55)) {
- /* FIXME: seems the ROP doesn't include destination;
- * now if the destination area include the entire dcDst,
- * we can pass TRUE instead of FALSE to CoerceDIBSection(dcDst...),
- * which may avoid a copy in some situations */
- }
-
- sDst = X11DRV_LockDIBSection( physDevDst, DIB_Status_None );
- if (physDevDst != physDevSrc)
- sSrc = X11DRV_LockDIBSection( physDevSrc, DIB_Status_None );
- else
- sSrc = sDst;
-
- if ((sSrc == DIB_Status_AppMod) && (rop == SRCCOPY) &&
- (physDevSrc->depth == physDevDst->depth))
- {
- POINT pts[2];
- /* do everything ourselves; map coordinates */
-
- pts[0].x = xSrc;
- pts[0].y = ySrc;
- pts[1].x = xSrc + width;
- pts[1].y = ySrc + height;
-
- LPtoDP(physDevSrc->hdc, pts, 2);
- width = pts[1].x - pts[0].x;
- height = pts[1].y - pts[0].y;
- xSrc = pts[0].x;
- ySrc = pts[0].y;
-
- pts[0].x = xDst;
- pts[0].y = yDst;
- LPtoDP(physDevDst->hdc, pts, 1);
-
- xDst = pts[0].x;
- yDst = pts[0].y;
-
- /* Perform basic clipping */
- if (!BITBLT_GetVisRectangles( physDevDst, xDst, yDst, width, height,
- physDevSrc, xSrc, ySrc, width, height,
- &visRectSrc, &visRectDst ))
- {
- result = TRUE;
- goto END;
- }
-
- xSrc = visRectSrc.left;
- ySrc = visRectSrc.top;
- xDst = visRectDst.left;
- yDst = visRectDst.top;
- width = visRectDst.right - visRectDst.left;
- height = visRectDst.bottom - visRectDst.top;
-
- if (sDst == DIB_Status_AppMod) {
- result = X11DRV_ClientSideDIBCopy( physDevSrc, xSrc, ySrc,
- physDevDst, xDst, yDst,
- width, height );
- if (result)
- goto END;
- /* fall back to X server copying */
- }
- X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod );
-
- wine_tsx11_lock();
- XSetFunction( gdi_display, physDevDst->gc, GXcopy );
- wine_tsx11_unlock();
-
- X11DRV_DIB_CopyDIBSection( physDevSrc, physDevDst, xSrc, ySrc, xDst, yDst, width,
height );
- result = TRUE;
- goto END;
- }
-
- X11DRV_CoerceDIBSection( physDevDst, DIB_Status_GdiMod );
- if (physDevDst != physDevSrc)
- X11DRV_CoerceDIBSection( physDevSrc, DIB_Status_GdiMod );
-
- result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, width, height,
- physDevSrc, xSrc, ySrc, width, height, rop );
-
-END:
- if (physDevDst != physDevSrc)
- X11DRV_UnlockDIBSection( physDevSrc, FALSE );
- X11DRV_UnlockDIBSection( physDevDst, TRUE );
-
- return result;
-}
-
-
-/***********************************************************************
- * X11DRV_StretchBlt
- */
-BOOL CDECL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
- INT widthDst, INT heightDst,
- X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
- INT widthSrc, INT heightSrc, DWORD rop )
-{
- BOOL result;
-
- X11DRV_LockDIBSection( physDevDst, DIB_Status_GdiMod );
- if (physDevDst != physDevSrc)
- X11DRV_LockDIBSection( physDevSrc, DIB_Status_GdiMod );
-
- result = BITBLT_InternalStretchBlt( physDevDst, xDst, yDst, widthDst, heightDst,
- physDevSrc, xSrc, ySrc, widthSrc, heightSrc, rop
);
-
- if (physDevDst != physDevSrc)
- X11DRV_UnlockDIBSection( physDevSrc, FALSE );
- X11DRV_UnlockDIBSection( physDevDst, TRUE );
- return result;
-}
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/brush.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/brush.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/brush.c [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -298,8 +298,7 @@
case BS_DIBPATTERN:
TRACE("BS_DIBPATTERN\n");
-#ifndef __REACTOS__
- if ((bmpInfo = GlobalLock16( logbrush.lbHatch )))
+ if ((bmpInfo = GlobalLock( (HGLOBAL)logbrush.lbHatch )))
{
int size = bitmap_info_size( bmpInfo, logbrush.lbColor );
hBitmap = CreateDIBitmap( physDev->hdc, &bmpInfo->bmiHeader,
@@ -308,9 +307,8 @@
(WORD)logbrush.lbColor );
BRUSH_SelectPatternBrush( physDev, hBitmap );
DeleteObject( hBitmap );
- GlobalUnlock16( logbrush.lbHatch );
+ GlobalUnlock( (HGLOBAL)logbrush.lbHatch );
}
-#endif
break;
}
return hbrush;
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/dib.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/dib.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/dib.c [iso-8859-1] Mon Oct 12 17:03:17
2009
@@ -4744,19 +4744,23 @@
&physBitmap->nColorMap
);
}
+ if (!X11DRV_XRender_SetPhysBitmapDepth( physBitmap, &dib ))
+ {
+ if (dib.dsBm.bmBitsPixel == 1)
+ {
+ physBitmap->pixmap_depth = 1;
+ physBitmap->trueColor = FALSE;
+ }
+ else
+ {
+ physBitmap->pixmap_depth = screen_depth;
+ physBitmap->pixmap_color_shifts = X11DRV_PALETTE_default_shifts;
+ physBitmap->trueColor = (visual->class == TrueColor || visual->class
== DirectColor);
+ }
+ }
+
/* create pixmap and X image */
wine_tsx11_lock();
- if(dib.dsBm.bmBitsPixel == 1)
- {
- physBitmap->pixmap_depth = 1;
- physBitmap->trueColor = FALSE;
- }
- else
- {
- physBitmap->pixmap_depth = screen_depth;
- physBitmap->pixmap_color_shifts = X11DRV_PALETTE_default_shifts;
- physBitmap->trueColor = (visual->class == TrueColor || visual->class ==
DirectColor);
- }
#ifdef HAVE_LIBXXSHM
physBitmap->shminfo.shmid = -1;
@@ -4802,6 +4806,19 @@
wine_tsx11_unlock();
if (!physBitmap->pixmap || !physBitmap->image) return 0;
+
+ if (physBitmap->trueColor)
+ {
+ ColorShifts *shifts = &physBitmap->pixmap_color_shifts;
+
+ /* When XRender is around and used, we also support dibsections in other formats
like 16-bit. In these
+ * cases we need to override the mask of XImages. The reason is that during
XImage creation the masks are
+ * derived from a 24-bit visual (no 16-bit ones are around when X runs at
24-bit). SetImageBits and other
+ * functions rely on the color masks for proper color conversion, so we need to
override the masks here. */
+ physBitmap->image->red_mask = shifts->physicalRed.max <<
shifts->physicalRed.shift;
+ physBitmap->image->green_mask = shifts->physicalGreen.max <<
shifts->physicalGreen.shift;
+ physBitmap->image->blue_mask = shifts->physicalBlue.max <<
shifts->physicalBlue.shift;
+ }
/* install fault handler */
InitializeCriticalSection( &physBitmap->lock );
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/event.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/event.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/event.c [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -324,7 +324,7 @@
/***********************************************************************
* process_events
*/
-static int process_events( Display *display, Bool (*filter)(), ULONG_PTR arg )
+static int process_events( Display *display, Bool (*filter)(Display*, XEvent*,XPointer),
ULONG_PTR arg )
{
XEvent event, prev_event;
int count = 0;
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec [iso-8859-1]
(original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/winex11.drv.spec [iso-8859-1] Mon Oct
12 17:03:17 2009
@@ -2,7 +2,6 @@
@ cdecl AlphaBlend(ptr long long long long ptr long long long long long)
X11DRV_AlphaBlend
@ cdecl Arc(ptr long long long long long long long long) X11DRV_Arc
-@ cdecl BitBlt(ptr long long long long ptr long long long) X11DRV_BitBlt
@ cdecl ChoosePixelFormat(ptr ptr) X11DRV_ChoosePixelFormat
@ cdecl Chord(ptr long long long long long long long long) X11DRV_Chord
@ cdecl CreateBitmap(ptr long ptr) X11DRV_CreateBitmap
@@ -31,7 +30,6 @@
@ cdecl GetTextMetrics(ptr ptr) X11DRV_GetTextMetrics
@ cdecl LineTo(ptr long long) X11DRV_LineTo
@ cdecl PaintRgn(ptr long) X11DRV_PaintRgn
-@ cdecl PatBlt(ptr long long long long long) X11DRV_PatBlt
@ cdecl Pie(ptr long long long long long long long long) X11DRV_Pie
@ cdecl PolyPolygon(ptr ptr ptr long) X11DRV_PolyPolygon
@ cdecl PolyPolyline(ptr ptr ptr long) X11DRV_PolyPolyline
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/x11drv.h [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -138,7 +138,7 @@
/* X physical font */
typedef UINT X_PHYSFONT;
-typedef struct tagXRENDERINFO *XRENDERINFO;
+struct xrender_info;
/* X physical device */
typedef struct
@@ -163,7 +163,7 @@
Drawable gl_drawable;
Pixmap pixmap; /* Pixmap for a GLXPixmap gl_drawable */
int gl_copy;
- XRENDERINFO xrender;
+ struct xrender_info *xrender;
} X11DRV_PDEVICE;
@@ -178,9 +178,6 @@
INT widthDst, INT heightDst,
X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
INT widthSrc, INT heightSrc, BLENDFUNCTION blendfn
);
-extern BOOL CDECL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
- INT width, INT height, X11DRV_PDEVICE *physDevSrc,
- INT xSrc, INT ySrc, DWORD rop );
extern BOOL CDECL X11DRV_EnumDeviceFonts( X11DRV_PDEVICE *physDev, LPLOGFONTW plf,
FONTENUMPROCW dfeproc, LPARAM lp );
extern LONG CDECL X11DRV_GetBitmapBits( HBITMAP hbitmap, void *bits, LONG count );
@@ -190,8 +187,6 @@
extern BOOL CDECL X11DRV_GetTextExtentExPoint( X11DRV_PDEVICE *physDev, LPCWSTR str, INT
count,
INT maxExt, LPINT lpnFit, LPINT alpDx,
LPSIZE size );
extern BOOL CDECL X11DRV_GetTextMetrics(X11DRV_PDEVICE *physDev, TEXTMETRICW *metrics);
-extern BOOL CDECL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top,
- INT width, INT height, DWORD rop );
extern BOOL CDECL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
INT widthDst, INT heightDst,
X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
@@ -291,6 +286,7 @@
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr,
UINT count, const INT *lpDx);
+extern BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, const DIBSECTION
*dib);
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
*physDevDst,
Pixmap pixmap, GC gc,
INT widthSrc, INT heightSrc,
@@ -304,7 +300,7 @@
/* IME support */
extern void IME_UnregisterClasses(void);
extern void IME_SetOpenStatus(BOOL fOpen);
-extern INT IME_GetCursorPos();
+extern INT IME_GetCursorPos(void);
extern void IME_SetCursorPos(DWORD pos);
extern void IME_UpdateAssociation(HWND focus);
extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp,
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/xfont.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/xfont.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/xfont.c [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -34,7 +34,9 @@
#endif
#include <sys/types.h>
#include <fcntl.h>
+#include <errno.h>
#include <math.h>
+#include <limits.h>
#include "windef.h"
#include "winbase.h"
@@ -1828,18 +1830,10 @@
const char *confdir = "";//wine_get_config_dir();
const char *display_name = XDisplayName(NULL);
int len = strlen(confdir) + strlen(INIFontMetrics) + strlen(display_name) + 8;
- int display = 0;
- int screen = 0;
+ unsigned int display = 0;
+ unsigned int screen = 0;
char *p, *ext;
- /*
- ** Normalize the display name, since on Red Hat systems, DISPLAY
- ** is commonly set to one of either 'unix:0.0' or ':0' or
':0.0'.
- ** after this code, all of the above will resolve to ':0.0'.
- */
- if (!strncmp( display_name, "unix:", 5 )) display_name += 4;
- p = strchr(display_name, ':');
- if (p) sscanf(p + 1, "%d.%d", &display, &screen);
if ((len > *buf_size) &&
!(buffer = HeapReAlloc( GetProcessHeap(), 0, buffer, *buf_size = len )))
@@ -1852,8 +1846,46 @@
ext = buffer + strlen(buffer);
strcpy( ext, display_name );
- if (!(p = strchr( ext, ':' ))) p = ext + strlen(ext);
- sprintf( p, ":%d.%d", display, screen );
+ /*
+ ** Normalize the display name. The format of DISPLAY is
+ ** [protocol/] [hostname] :[:] num [.num]
+ **
+ ** - on Red Hat systems, DISPLAY is commonly set to one of
+ ** either 'unix:0.0' or ':0' or ':0.0'.
+ ** - on MacOS X systems, DISPLAY is commonly set to
+ ** /tmp/foo/:0
+ **
+ ** after this code, all of the above will resolve to ':0.0'.
+ */
+ p = strrchr(ext, ':');
+ if (p)
+ {
+ sscanf(p + 1, "%u.%u", &display, &screen);
+ *p = 0;
+ if (display > 9999)
+ {
+ WARN("unlikely X11 display number\n");
+ *buffer = 0;
+ return buffer;
+ }
+ }
+ if (!strcmp( ext, "unix" ) ||
+ !strcmp( ext, "localhost" ))
+ *ext = 0;
+ if (!strncmp( ext, "/tmp/", 5 ))
+ *ext = 0; /* assume pathnames are local */
+
+ /* Deal with the possibility of slashes in the display name */
+ for( p = ext; *p; p++ )
+ if ( *p == '/' )
+ *p = '_';
+
+ /* X11 fonts are per-display, not per-screen, so don't
+ ** include the screen number in the font cache filename */
+ sprintf( ext + strlen(ext), ":%u", display );
+
+ TRACE("display '%s' -> cachefile '%s'\n", display_name,
buffer);
+
return buffer;
}
@@ -2156,8 +2188,10 @@
*
* INIT ONLY
*/
-static BOOL XFONT_ReadCachedMetrics( int fd, int res, unsigned x_checksum, int x_count )
-{
+static BOOL XFONT_ReadCachedMetrics( const char *path, int res, unsigned x_checksum, int
x_count )
+{
+ int fd = open( path, O_RDONLY );
+
if( fd >= 0 )
{
unsigned u;
@@ -2270,6 +2304,8 @@
HeapFree( GetProcessHeap(), 0, fontList );
fontList = NULL;
close( fd );
+ } else {
+ TRACE("fontcache '%s': %s\n", path, strerror(errno));
}
return FALSE;
}
@@ -2855,7 +2891,7 @@
{
char** x_pattern;
unsigned x_checksum;
- int i, x_count, fd, buf_size;
+ int i, x_count, buf_size;
char *buffer;
HKEY hkey;
@@ -2879,7 +2915,7 @@
if( j ) x_checksum ^= __genericCheckSum( x_pattern[i], j );
}
x_checksum |= X_PFONT_MAGIC;
- buf_size = 128;
+ buf_size = PATH_MAX;
buffer = HeapAlloc( GetProcessHeap(), 0, buf_size );
/* deal with systemwide font metrics cache */
@@ -2895,8 +2931,8 @@
if( buffer[0] )
{
- fd = open( buffer, O_RDONLY );
- XFONT_ReadCachedMetrics(fd, DefResolution, x_checksum, x_count);
+ TRACE("system fontcache is '%s'\n", buffer);
+ XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count);
}
if (fontList == NULL)
{
@@ -2904,8 +2940,8 @@
buffer = XFONT_UserMetricsCache( buffer, &buf_size );
if( buffer[0] )
{
- fd = open( buffer, O_RDONLY );
- XFONT_ReadCachedMetrics(fd, DefResolution, x_checksum, x_count);
+ TRACE("user fontcache is '%s'\n", buffer);
+ XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count);
}
}
@@ -2914,11 +2950,15 @@
int n_ff = XFONT_BuildMetrics(x_pattern, DefResolution, x_checksum, x_count);
if( buffer[0] ) /* update cached metrics */
{
- fd = open( buffer, O_CREAT | O_TRUNC | O_RDWR, 0644 ); /* -rw-r--r-- */
- if( XFONT_WriteCachedMetrics( fd, x_checksum, x_count, n_ff ) == FALSE )
+ int fd = open( buffer, O_CREAT | O_TRUNC | O_RDWR, 0666 );
+ if ( fd < 0 )
+ {
+ WARN("Unable to create fontcache '%s': %s\n", buffer,
strerror(errno));
+ }
+ else if( XFONT_WriteCachedMetrics( fd, x_checksum, x_count, n_ff ) == FALSE )
{
WARN("Unable to write to fontcache '%s'\n", buffer);
- if( fd >= 0) remove( buffer ); /* couldn't write entire file */
+ remove( buffer ); /* couldn't write entire file */
}
}
}
Modified: branches/arwinss/reactos/dll/win32/winex11.drv/xrender.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winex…
==============================================================================
--- branches/arwinss/reactos/dll/win32/winex11.drv/xrender.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winex11.drv/xrender.c [iso-8859-1] Mon Oct 12
17:03:17 2009
@@ -2,6 +2,7 @@
* Functions to use the XRender extension
*
* Copyright 2001, 2002 Huw D M Davies for CodeWeavers
+ * Copyright 2009 Roderick Colenbrander
*
* Some parts also:
* Copyright 2000 Keith Packard, member of The XFree86 Project, Inc.
@@ -139,7 +140,7 @@
INT next;
} gsCacheEntry;
-struct tagXRENDERINFO
+struct xrender_info
{
int cache_index;
Picture pict;
@@ -205,6 +206,23 @@
#define get_be_word(x) RtlUshortByteSwap(x)
#define NATIVE_BYTE_ORDER LSBFirst
#endif
+
+static struct xrender_info *get_xrender_info(X11DRV_PDEVICE *physDev)
+{
+ if(!physDev->xrender)
+ {
+ physDev->xrender = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(*physDev->xrender));
+
+ if(!physDev->xrender)
+ {
+ ERR("Unable to allocate XRENDERINFO!\n");
+ return NULL;
+ }
+ physDev->xrender->cache_index = -1;
+ }
+
+ return physDev->xrender;
+}
static BOOL get_xrender_template(const WineXRenderFormatTemplate *fmt, XRenderPictFormat
*templ, unsigned long *mask)
{
@@ -794,6 +812,7 @@
BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE *physDev, HFONT hfont)
{
LFANDSIZE lfsz;
+ struct xrender_info *info;
GetObjectW(hfont, sizeof(lfsz.lf), &lfsz.lf);
TRACE("h=%d w=%d weight=%d it=%d charset=%d name=%s\n",
@@ -805,15 +824,13 @@
GetWorldTransform( physDev->hdc, &lfsz.xform );
lfsz_calc_hash(&lfsz);
+ info = get_xrender_info(physDev);
+ if (!info) return 0;
+
EnterCriticalSection(&xrender_cs);
- if(!physDev->xrender) {
- physDev->xrender = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(*physDev->xrender));
- physDev->xrender->cache_index = -1;
- }
- else if(physDev->xrender->cache_index != -1)
- dec_ref_cache(physDev->xrender->cache_index);
- physDev->xrender->cache_index = GetCacheEntry(physDev, &lfsz);
+ if(info->cache_index != -1)
+ dec_ref_cache(info->cache_index);
+ info->cache_index = GetCacheEntry(physDev, &lfsz);
LeaveCriticalSection(&xrender_cs);
return 0;
}
@@ -833,6 +850,33 @@
HeapFree(GetProcessHeap(), 0, physDev->xrender);
physDev->xrender = NULL;
return;
+}
+
+BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, const DIBSECTION *dib)
+{
+ WineXRenderFormat *fmt;
+ ColorShifts shifts;
+
+ /* When XRender is not around we can only use the screen_depth and when needed we
perform depth conversion
+ * in software. Further we also return the screen depth for paletted formats or
TrueColor formats with a low
+ * number of bits because XRender can't handle paletted formats and 8-bit
TrueColor does not exist for XRender. */
+ if(!X11DRV_XRender_Installed || dib->dsBm.bmBitsPixel <= 8)
+ return FALSE;
+
+ X11DRV_PALETTE_ComputeColorShifts(&shifts, dib->dsBitfields[0],
dib->dsBitfields[1], dib->dsBitfields[2]);
+
+ /* Common formats should be in our picture format table. */
+ fmt = get_xrender_format_from_color_shifts(dib->dsBm.bmBitsPixel, &shifts);
+ if(fmt)
+ {
+ physBitmap->pixmap_depth = fmt->pict_format->depth;
+ physBitmap->trueColor = TRUE;
+ physBitmap->pixmap_color_shifts = shifts;
+ return TRUE;
+ }
+ TRACE("Unhandled dibsection format bpp=%d, redMask=%x, greenMask=%x,
blueMask=%x\n",
+ dib->dsBm.bmBitsPixel, dib->dsBitfields[0], dib->dsBitfields[1],
dib->dsBitfields[2]);
+ return FALSE;
}
/***********************************************************************
@@ -2172,6 +2216,11 @@
wine_tsx11_unlock();
}
+BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, const DIBSECTION *dib)
+{
+ return FALSE;
+}
+
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE
*physDevDst,
Pixmap pixmap, GC gc,
INT widthSrc, INT heightSrc,