[ros-diffs] [fireball] 42158: - Convert color from COLORREF to device's color space. Fixes RGB/BGR issue with text output, brushes and pens. - Don't use a stack allocated BRUSHOBJ for text output, because other routines may rely on it being a real BRUSHGDI object. Create a pen for text output instead (once per TextOut call, an optimisation could be to move that to DC structure and create once).

fireball at svn.reactos.org fireball at svn.reactos.org
Thu Jul 23 21:20:00 CEST 2009


Author: fireball
Date: Thu Jul 23 21:20:00 2009
New Revision: 42158

URL: http://svn.reactos.org/svn/reactos?rev=42158&view=rev
Log:
- Convert color from COLORREF to device's color space. Fixes RGB/BGR issue with text output, brushes and pens.
- Don't use a stack allocated BRUSHOBJ for text output, because other routines may rely on it being a real BRUSHGDI object. Create a pen for text output instead (once per TextOut call, an optimisation could be to move that to DC structure and create once).

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c?rev=42158&r1=42157&r2=42158&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/brushobj.c [iso-8859-1] Thu Jul 23 21:20:00 2009
@@ -34,6 +34,8 @@
     static const BYTE PatternDashDot[] = {0xFF, 0x81, 0xC0};
     static const BYTE PatternDashDotDot[] = {0xFF, 0x8E, 0x38};*/
     PBRUSHGDI pBrush;
+    XLATEOBJ *pXlate;
+    HPALETTE hPalette;
 
     /* Allocate memory for the object */
     pBrush = EngAllocMem(FL_ZERO_MEMORY, sizeof(BRUSHGDI), TAG_BRUSHOBJ);
@@ -82,7 +84,12 @@
 
     case PS_SOLID:
         pBrush->flAttrs |= GDIBRUSH_IS_SOLID;
-        pBrush->BrushObj.iSolidColor = ulColor;
+
+        // FIXME: Take hDIBPalette in account if it exists!
+        hPalette = pPrimarySurface->DevInfo.hpalDefault;
+        pXlate = IntEngCreateXlate(0, PAL_RGB, hPalette, NULL);
+        pBrush->BrushObj.iSolidColor = XLATEOBJ_iXlate(pXlate, ulColor);
+        EngDeleteXlate(pXlate);
         break;
 
     case PS_ALTERNATE:
@@ -135,6 +142,8 @@
 GreCreateSolidBrush(COLORREF crColor)
 {
     PBRUSHGDI pBrush;
+    XLATEOBJ *pXlate;
+    HPALETTE hPalette;
 
     /* Allocate memory for the object */
     pBrush = EngAllocMem(FL_ZERO_MEMORY, sizeof(BRUSHGDI), TAG_BRUSHOBJ);
@@ -144,7 +153,11 @@
     pBrush->flAttrs |= GDIBRUSH_IS_SOLID;
 
     /* Set color */
-    pBrush->BrushObj.iSolidColor = crColor;
+    // FIXME: Take hDIBPalette in account if it exists!
+    hPalette = pPrimarySurface->DevInfo.hpalDefault;
+    pXlate = IntEngCreateXlate(0, PAL_RGB, hPalette, NULL);
+    pBrush->BrushObj.iSolidColor = XLATEOBJ_iXlate(pXlate, crColor);
+    EngDeleteXlate(pXlate);
 
     /* Return newly created brush */
     return pBrush;

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c?rev=42158&r1=42157&r2=42158&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c [iso-8859-1] Thu Jul 23 21:20:00 2009
@@ -15,7 +15,7 @@
 /* PRIVATE FUNCTIONS *********************************************************/
 
 static void SharpGlyphMono(PDC physDev, INT x, INT y,
-                           void *bitmap, GlyphInfo *gi)
+                           void *bitmap, GlyphInfo *gi, BRUSHGDI *pTextBrush)
 {
 #if 1
     unsigned char   *srcLine = bitmap, *src;
@@ -26,10 +26,6 @@
     int             w;
     int             xspan, lenspan;
     RECTL           rcBounds;
-    BRUSHOBJ        textBrush;
-
-    RtlZeroMemory(&textBrush, sizeof(textBrush));
-    textBrush.iSolidColor = physDev->crForegroundClr;
 
     x -= gi->x;
     y -= gi->y;
@@ -64,7 +60,7 @@
                 rcBounds.right = xspan+lenspan; rcBounds.bottom = y+1;
                 GreLineTo(&physDev->pBitmap->SurfObj,
                     NULL,
-                    &textBrush,
+                    &pTextBrush->BrushObj,
                     xspan,
                     y,
                     xspan + lenspan,
@@ -143,13 +139,14 @@
     AA_Type aa_type = AA_None;
     INT idx;
     /*double*/ int cosEsc = 1, sinEsc = 0;
-
-    //wine_tsx11_lock();
-    //XSetForeground( gdi_display, physDev->gc, textPixel );
+    BRUSHGDI *pTextPen;
+
+    /* Create pen for text output */
+    pTextPen = GreCreatePen(PS_SOLID, 1, 0, pDC->crForegroundClr, 0, 0, 0, NULL, 0, TRUE);
 
     if(aa_type == AA_None || pDC->pBitmap->SurfObj.iBitmapFormat == BMF_1BPP)
     {
-        void (* sharp_glyph_fn)(PDC, INT, INT, void *, GlyphInfo *);
+        void (* sharp_glyph_fn)(PDC, INT, INT, void *, GlyphInfo *, BRUSHGDI *);
 
         //if(aa_type == AA_None)
             sharp_glyph_fn = SharpGlyphMono;
@@ -160,7 +157,8 @@
             sharp_glyph_fn(pDC, pDC->rcDcRect.left + pDC->rcVport.left + x + xoff,
                 pDC->rcDcRect.top + pDC->rcVport.top + y + yoff,
                 formatEntry->bitmaps[wstr[idx]],
-                &formatEntry->gis[wstr[idx]]);
+                &formatEntry->gis[wstr[idx]],
+                pTextPen);
             if(lpDx) {
                 offset += lpDx[idx];
                 xoff = offset * cosEsc;
@@ -282,7 +280,8 @@
 #endif
     }
 //no_image:
-    //wine_tsx11_unlock();
+
+    GreFreeBrush(pTextPen);
 }
 
 /* EOF */




More information about the Ros-diffs mailing list