From a2a94a49bc2f433890aba98193a39f0992a8e49e Mon Sep 17 00:00:00 2001 From: Chris Wulff Date: Sat, 10 Jan 2009 18:45:11 -0500 Subject: [PATCH] gdiplus: Partial implementation of GdipCreateHatchBrush. --- dlls/gdiplus/brush.c | 69 ++++++++++++++++++++++++++++++++++ dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/gdiplus_private.h | 7 ++++ include/gdiplusenums.h | 62 ++++++++++++++++++++++++++++++ include/gdiplusgpstubs.h | 2 + 5 files changed, 141 insertions(+), 1 deletion(-) diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c index 9a513e122dd..59d3aa2b497 100644 --- a/dlls/gdiplus/brush.c +++ b/dlls/gdiplus/brush.c @@ -51,6 +51,14 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone) memcpy(*clone, brush, sizeof(GpSolidFill)); + (*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:{ @@ -124,6 +132,67 @@ 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; + } +} + +/****************************************************************************** + * GdipCreateHatchBrush [GDIPLUS.@] + */ +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 12a23167017..e7ddc2ad65c 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 714739c2b7a..dbeebe3380e 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 8f7470d5dbe..c989000f12d 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 a768638e0ad..3edc1f4b7b4 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;