Add a partial implementation of GdipCreateHatchBrush.

Chris Wulff crwulff at rochester.rr.com
Sat Jan 10 17:45:11 CST 2009


---
 dlls/gdiplus/brush.c           |   65 ++++++++++++++++++++++++++++++++++++++++
 dlls/gdiplus/gdiplus.spec      |    2 +-
 dlls/gdiplus/gdiplus_private.h |    7 ++++
 include/gdiplusenums.h         |   62 ++++++++++++++++++++++++++++++++++++++
 include/gdiplusgpstubs.h       |    2 +
 5 files changed, 137 insertions(+), 1 deletions(-)

diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index 9a513e1..dd938ca 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -53,6 +53,14 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
 
             (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
             break;
+        case BrushTypeHatchFill:
+            *clone = GdipAlloc(sizeof(GpHatch));
+            if (!*clone) return OutOfMemory;
+
+            memcpy(*clone, brush, sizeof(GpHatch));
+
+            (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
+            break;
         case BrushTypePathGradient:{
             GpPathGradient *src, *dest;
             INT count;
@@ -124,6 +132,63 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
     return Ok;
 }
 
+static LONG HatchStyleToHatch(HatchStyle hatchstyle)
+{
+    switch (hatchstyle)
+    {
+        case HatchStyleHorizontal:        return HS_HORIZONTAL;
+        case HatchStyleVertical:          return HS_VERTICAL;
+        case HatchStyleForwardDiagonal:   return HS_FDIAGONAL;
+        case HatchStyleBackwardDiagonal:  return HS_BDIAGONAL;
+        case HatchStyleCross:             return HS_CROSS;
+        case HatchStyleDiagonalCross:     return HS_DIAGCROSS;
+        default:                          return 0;
+    }
+}
+GpStatus WINGDIAPI GdipCreateHatchBrush(HatchStyle hatchstyle, ARGB forecol, ARGB backcol, GpHatch **brush)
+{
+    COLORREF fgcol = ARGB2COLORREF(forecol);
+
+    TRACE("(%d, %d, %d, %p)\n", hatchstyle, forecol, backcol, brush);
+
+    if(!brush)  return InvalidParameter;
+
+    *brush = GdipAlloc(sizeof(GpHatch));
+    if (!*brush) return OutOfMemory;
+
+    switch (hatchstyle)
+    {
+        case HatchStyleHorizontal:
+        case HatchStyleVertical:
+        case HatchStyleForwardDiagonal:
+        case HatchStyleBackwardDiagonal:
+        case HatchStyleCross:
+        case HatchStyleDiagonalCross:
+            /* Brushes that map to BS_HATCHED */
+            (*brush)->brush.lb.lbStyle = BS_HATCHED;
+            (*brush)->brush.lb.lbColor = fgcol;
+            (*brush)->brush.lb.lbHatch = HatchStyleToHatch(hatchstyle);
+            break;
+
+        default:
+            FIXME("Unimplemented hatch style %d\n", hatchstyle);
+
+            (*brush)->brush.lb.lbStyle = BS_SOLID;
+            (*brush)->brush.lb.lbColor = fgcol;
+            (*brush)->brush.lb.lbHatch = 0;
+            break;
+    }
+
+
+    (*brush)->brush.gdibrush = CreateBrushIndirect(&(*brush)->brush.lb);
+    (*brush)->brush.bt = BrushTypeHatchFill;
+    (*brush)->forecol = forecol;
+    (*brush)->backcol = backcol;
+    (*brush)->hatchstyle = hatchstyle;
+
+    return Ok;
+}
+
 /******************************************************************************
  * GdipCreateLineBrush [GDIPLUS.@]
  */
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 12a2316..e7ddc2a 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -96,7 +96,7 @@
 @ stdcall GdipCreateHBITMAPFromBitmap(ptr ptr long)
 @ stub GdipCreateHICONFromBitmap
 @ stdcall GdipCreateHalftonePalette()
-@ stub GdipCreateHatchBrush
+@ stdcall GdipCreateHatchBrush(long long long ptr)
 @ stdcall GdipCreateImageAttributes(ptr)
 @ stdcall GdipCreateLineBrush(ptr ptr long long long ptr)
 @ stdcall GdipCreateLineBrushFromRect(ptr long long long long ptr)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 714739c..dbeebe3 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -111,6 +111,13 @@ struct GpBrush{
     LOGBRUSH lb;
 };
 
+struct GpHatch{
+    GpBrush brush;
+    HatchStyle hatchstyle;
+    ARGB forecol;
+    ARGB backcol;
+};
+
 struct GpSolidFill{
     GpBrush brush;
     ARGB color;
diff --git a/include/gdiplusenums.h b/include/gdiplusenums.h
index 8f7470d..c989000 100644
--- a/include/gdiplusenums.h
+++ b/include/gdiplusenums.h
@@ -357,6 +357,67 @@ enum MetafileFrameUnit
     MetafileFrameUnitGdi
 };
 
+enum HatchStyle
+{
+	HatchStyleHorizontal = 0,
+	HatchStyleVertical = 1,
+	HatchStyleForwardDiagonal = 2,
+	HatchStyleBackwardDiagonal = 3,
+	HatchStyleCross = 4,
+	HatchStyleDiagonalCross = 5,
+	HatchStyle05Percent = 6,
+	HatchStyle10Percent = 7,
+	HatchStyle20Percent = 8,
+	HatchStyle25Percent = 9,
+	HatchStyle30Percent = 10,
+	HatchStyle40Percent = 11,
+	HatchStyle50Percent = 12,
+	HatchStyle60Percent = 13,
+	HatchStyle70Percent = 14,
+	HatchStyle75Percent = 15,
+	HatchStyle80Percent = 16,
+	HatchStyle90Percent = 17,
+	HatchStyleLightDownwardDiagonal = 18,
+	HatchStyleLightUpwardDiagonal = 19,
+	HatchStyleDarkDownwardDiagonal = 20,
+	HatchStyleDarkUpwardDiagonal = 21,
+	HatchStyleWideDownwardDiagonal = 22,
+	HatchStyleWideUpwardDiagonal = 23,
+	HatchStyleLightVertical = 24,
+	HatchStyleLightHorizontal = 25,
+	HatchStyleNarrowVertical = 26,
+	HatchStyleNarrowHorizontal = 27,
+	HatchStyleDarkVertical = 28,
+	HatchStyleDarkHorizontal = 29,
+	HatchStyleDashedDownwardDiagonal = 30,
+	HatchStyleDashedUpwardDiagonal = 31,
+	HatchStyleDashedHorizontal = 32,
+	HatchStyleDashedVertical = 33,
+	HatchStyleSmallConfetti = 34,
+	HatchStyleLargeConfetti = 35,
+	HatchStyleZigZag = 36,
+	HatchStyleWave = 37,
+	HatchStyleDiagonalBrick = 38,
+	HatchStyleHorizontalBrick = 39,
+	HatchStyleWeave = 40,
+	HatchStylePlaid = 41,
+	HatchStyleDivot = 42,
+	HatchStyleDottedGrid = 43,
+	HatchStyleDottedDiamond = 44,
+	HatchStyleShingle = 45,
+	HatchStyleTrellis = 46,
+	HatchStyleSphere = 47,
+	HatchStyleSmallGrid = 48,
+	HatchStyleSmallCheckerBoard = 49,
+	HatchStyleLargeCheckerBoard = 50,
+	HatchStyleOutlinedDiamond = 51,
+	HatchStyleSolidDiamond = 52,
+	HatchStyleTotal = 53,
+	HatchStyleLargeGrid = HatchStyleCross,
+	HatchStyleMin = HatchStyleHorizontal,
+	HatchStyleMax = HatchStyleTotal - 1
+};
+
 #ifndef __cplusplus
 
 typedef enum Unit Unit;
@@ -395,6 +456,7 @@ typedef enum CoordinateSpace CoordinateSpace;
 typedef enum GpTestControlEnum GpTestControlEnum;
 typedef enum MetafileFrameUnit MetafileFrameUnit;
 typedef enum PenType PenType;
+typedef enum HatchStyle HatchStyle;
 
 #endif /* end of c typedefs */
 
diff --git a/include/gdiplusgpstubs.h b/include/gdiplusgpstubs.h
index a768638..3edc1f4 100644
--- a/include/gdiplusgpstubs.h
+++ b/include/gdiplusgpstubs.h
@@ -23,6 +23,7 @@
 
 class GpGraphics {};
 class GpBrush {};
+class GpHatch : public GpBrush {};
 class GpSolidFill : public GpBrush {};
 class GpPath {};
 class GpMatrix {};
@@ -49,6 +50,7 @@ class CGpEffect {};
 typedef struct GpGraphics GpGraphics;
 typedef struct GpPen GpPen;
 typedef struct GpBrush GpBrush;
+typedef struct GpHatch GpHatch;
 typedef struct GpSolidFill GpSolidFill;
 typedef struct GpPath GpPath;
 typedef struct GpMatrix GpMatrix;
-- 
1.5.6.3


--=-BMOidjFEI59XQqxxYGYd--




More information about the wine-patches mailing list