Alexandre Julliard : wineps: Use the brush information passed in SelectBrush for pattern brushes.

Alexandre Julliard julliard at winehq.org
Tue Nov 8 12:23:08 CST 2011


Module: wine
Branch: master
Commit: 0a189ffaf06db8e3b3d235bf872093ec2330e6a5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0a189ffaf06db8e3b3d235bf872093ec2330e6a5

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  3 19:56:48 2011 +0100

wineps: Use the brush information passed in SelectBrush for pattern brushes.

---

 dlls/wineps.drv/brush.c |   48 ++++++++++------------------------------
 dlls/wineps.drv/ps.c    |   55 ++--------------------------------------------
 dlls/wineps.drv/psdrv.h |    6 +++-
 3 files changed, 19 insertions(+), 90 deletions(-)

diff --git a/dlls/wineps.drv/brush.c b/dlls/wineps.drv/brush.c
index 624e1b1..706af2f 100644
--- a/dlls/wineps.drv/brush.c
+++ b/dlls/wineps.drv/brush.c
@@ -55,6 +55,9 @@ HBRUSH PSDRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
 
     case BS_PATTERN:
     case BS_DIBPATTERN:
+        physDev->brush.info  = info;
+        physDev->brush.bits  = bits;
+        physDev->brush.usage = usage;
 	break;
 
     default:
@@ -232,43 +235,16 @@ BOOL PSDRV_Brush(PHYSDEV dev, BOOL EO)
 	break;
 
     case BS_PATTERN:
-        {
-	    BITMAP bm;
-	    BYTE *bits;
-	    GetObjectA( (HBITMAP)logbrush.lbHatch, sizeof(BITMAP), &bm);
-	    TRACE("BS_PATTERN %dx%d %d bpp\n", bm.bmWidth, bm.bmHeight,
-		  bm.bmBitsPixel);
-	    bits = HeapAlloc(PSDRV_Heap, 0, bm.bmWidthBytes * bm.bmHeight);
-	    GetBitmapBits( (HBITMAP)logbrush.lbHatch, bm.bmWidthBytes * bm.bmHeight, bits);
-
-	    if(physDev->pi->ppd->LanguageLevel > 1) {
-	        PSDRV_WriteGSave(dev);
-	        PSDRV_WritePatternDict(dev, &bm, bits);
-		PSDRV_Fill(dev, EO);
-		PSDRV_WriteGRestore(dev);
-	    } else {
-	        FIXME("Trying to set a pattern brush on a level 1 printer\n");
-		ret = FALSE;
-	    }
-	    HeapFree(PSDRV_Heap, 0, bits);
-	}
-	break;
-
     case BS_DIBPATTERN:
-        {
-	    BITMAPINFO *bmi = (BITMAPINFO *)logbrush.lbHatch;
-	    UINT usage = logbrush.lbColor;
-	    TRACE("size %dx%dx%d\n", bmi->bmiHeader.biWidth,
-		  bmi->bmiHeader.biHeight, bmi->bmiHeader.biBitCount);
-	    if(physDev->pi->ppd->LanguageLevel > 1) {
-	        PSDRV_WriteGSave(dev);
-		ret = PSDRV_WriteDIBPatternDict(dev, bmi, usage);
-		PSDRV_Fill(dev, EO);
-		PSDRV_WriteGRestore(dev);
-	    } else {
-	        FIXME("Trying to set a pattern brush on a level 1 printer\n");
-		ret = FALSE;
-	    }
+        if(physDev->pi->ppd->LanguageLevel > 1) {
+            PSDRV_WriteGSave(dev);
+            ret = PSDRV_WriteDIBPatternDict(dev, physDev->brush.info,
+                                            physDev->brush.bits, physDev->brush.usage );
+            PSDRV_Fill(dev, EO);
+            PSDRV_WriteGRestore(dev);
+        } else {
+            FIXME("Trying to set a pattern brush on a level 1 printer\n");
+            ret = FALSE;
 	}
 	break;
 
diff --git a/dlls/wineps.drv/ps.c b/dlls/wineps.drv/ps.c
index a456253..19784f3 100644
--- a/dlls/wineps.drv/ps.c
+++ b/dlls/wineps.drv/ps.c
@@ -843,74 +843,25 @@ BOOL PSDRV_WriteRectClip2(PHYSDEV dev, CHAR *pszArrayName)
     return PSDRV_WriteSpool(dev, buf, strlen(buf));
 }
 
-BOOL PSDRV_WritePatternDict(PHYSDEV dev, BITMAP *bm, BYTE *bits)
+BOOL PSDRV_WriteDIBPatternDict(PHYSDEV dev, const BITMAPINFO *bmi, BYTE *bits, UINT usage)
 {
     static const char mypat[] = "/mypat\n";
     static const char do_pattern[] = "<<\n /PaintType 1\n /PatternType 1\n /TilingType 1\n "
       "/BBox [0 0 %d %d]\n /XStep %d\n /YStep %d\n /PaintProc {\n  begin\n  0 0 translate\n"
       "  %d %d scale\n  mypat image\n  end\n }\n>>\n matrix makepattern setpattern\n";
-
     PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
     char *buf, *ptr;
     INT w, h, x, y, w_mult, h_mult;
     COLORREF map[2];
 
-    w = bm->bmWidth & ~0x7;
-    h = bm->bmHeight & ~0x7;
-
-    buf = HeapAlloc(PSDRV_Heap, 0, sizeof(do_pattern) + 100);
-    ptr = buf;
-    for(y = h-1; y >= 0; y--) {
-        for(x = 0; x < w/8; x++) {
-	    sprintf(ptr, "%02x", *(bits + x/8 + y * bm->bmWidthBytes));
-	    ptr += 2;
-	}
-    }
-    PSDRV_WriteSpool(dev, mypat, sizeof(mypat) - 1);
-    PSDRV_WriteImageDict(dev, 1, 8, 8, buf, FALSE);
-    PSDRV_WriteSpool(dev, "def\n", 4);
-
-    PSDRV_WriteIndexColorSpaceBegin(dev, 1);
-    map[0] = GetTextColor( dev->hdc );
-    map[1] = GetBkColor( dev->hdc );
-    PSDRV_WriteRGB(dev, map, 2);
-    PSDRV_WriteIndexColorSpaceEnd(dev);
-
-    /* Windows seems to scale patterns so that a one pixel corresponds to 1/300" */
-    w_mult = (physDev->logPixelsX + 150) / 300;
-    h_mult = (physDev->logPixelsY + 150) / 300;
-    sprintf(buf, do_pattern, w * w_mult, h * h_mult, w * w_mult, h * h_mult, w * w_mult, h * h_mult);
-    PSDRV_WriteSpool(dev,  buf, strlen(buf));
-
-    HeapFree(PSDRV_Heap, 0, buf);
-    return TRUE;
-}
-
-BOOL PSDRV_WriteDIBPatternDict(PHYSDEV dev, BITMAPINFO *bmi, UINT usage)
-{
-    static const char mypat[] = "/mypat\n";
-    static const char do_pattern[] = "<<\n /PaintType 1\n /PatternType 1\n /TilingType 1\n "
-      "/BBox [0 0 %d %d]\n /XStep %d\n /YStep %d\n /PaintProc {\n  begin\n  0 0 translate\n"
-      "  %d %d scale\n  mypat image\n  end\n }\n>>\n matrix makepattern setpattern\n";
-    PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
-    char *buf, *ptr;
-    BYTE *bits;
-    INT w, h, x, y, colours, w_mult, h_mult;
-    COLORREF map[2];
+    TRACE( "size %dx%dx%d\n",
+           bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, bmi->bmiHeader.biBitCount);
 
     if(bmi->bmiHeader.biBitCount != 1) {
         FIXME("dib depth %d not supported\n", bmi->bmiHeader.biBitCount);
 	return FALSE;
     }
 
-    bits = (LPBYTE)bmi + bmi->bmiHeader.biSize;
-    colours = bmi->bmiHeader.biClrUsed;
-    if (colours > 256) colours = 256;
-    if(!colours && bmi->bmiHeader.biBitCount <= 8)
-        colours = 1 << bmi->bmiHeader.biBitCount;
-    bits += colours * ((usage == DIB_RGB_COLORS) ?
-		       sizeof(RGBQUAD) : sizeof(WORD));
-
     w = bmi->bmiHeader.biWidth & ~0x7;
     h = bmi->bmiHeader.biHeight & ~0x7;
 
diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h
index 1b3bb61..b86f527 100644
--- a/dlls/wineps.drv/psdrv.h
+++ b/dlls/wineps.drv/psdrv.h
@@ -327,6 +327,9 @@ typedef struct {
 typedef struct {
     PSCOLOR		color;
     BOOL		set;
+    const BITMAPINFO   *info;
+    void               *bits;
+    UINT                usage;
 } PSBRUSH;
 
 #define MAX_DASHLEN 16
@@ -531,8 +534,7 @@ extern BOOL PSDRV_WriteImage(PHYSDEV dev, WORD depth, INT xDst, INT yDst,
 extern BOOL PSDRV_WriteBytes(PHYSDEV dev, const BYTE *bytes, DWORD number) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteData(PHYSDEV dev, const BYTE *byte, DWORD number) DECLSPEC_HIDDEN;
 extern DWORD PSDRV_WriteSpool(PHYSDEV dev, LPCSTR lpData, DWORD cch) DECLSPEC_HIDDEN;
-extern BOOL PSDRV_WritePatternDict(PHYSDEV dev, BITMAP *bm, BYTE *bits) DECLSPEC_HIDDEN;
-extern BOOL PSDRV_WriteDIBPatternDict(PHYSDEV dev, BITMAPINFO *bmi, UINT usage) DECLSPEC_HIDDEN;
+extern BOOL PSDRV_WriteDIBPatternDict(PHYSDEV dev, const BITMAPINFO *bmi, BYTE *bits, UINT usage) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteArrayPut(PHYSDEV dev, CHAR *pszArrayName, INT nIndex, LONG lCoord) DECLSPEC_HIDDEN;
 extern BOOL PSDRV_WriteArrayDef(PHYSDEV dev, CHAR *pszArrayName, INT nSize) DECLSPEC_HIDDEN;
 




More information about the wine-cvs mailing list