- Sync gdiplus with Wine head
authorDmitry Chapyshev <dmitry@reactos.org>
Tue, 27 Jan 2009 18:03:33 +0000 (18:03 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Tue, 27 Jan 2009 18:03:33 +0000 (18:03 +0000)
svn path=/trunk/; revision=39144

reactos/dll/win32/gdiplus/brush.c
reactos/dll/win32/gdiplus/gdiplus.spec
reactos/dll/win32/gdiplus/gdiplus_private.h
reactos/dll/win32/gdiplus/graphics.c
reactos/dll/win32/gdiplus/image.c
reactos/dll/win32/gdiplus/pen.c
reactos/dll/win32/gdiplus/region.c
reactos/include/psdk/gdiplusenums.h
reactos/include/psdk/gdiplusgpstubs.h

index a24f54e..f0c9b20 100644 (file)
@@ -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 WINGDIPAPI 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.@]
  */
@@ -648,6 +717,39 @@ GpStatus WINGDIPAPI GdipGetBrushType(GpBrush *brush, GpBrushType *type)
     return Ok;
 }
 
+GpStatus WINGDIPAPI GdipGetHatchBackgroundColor(GpHatch *brush, ARGB *backcol)
+{
+    TRACE("(%p, %p)\n", brush, backcol);
+
+    if(!brush || !backcol)  return InvalidParameter;
+
+    *backcol = brush->backcol;
+
+    return Ok;
+}
+
+GpStatus WINGDIPAPI GdipGetHatchForegroundColor(GpHatch *brush, ARGB *forecol)
+{
+    TRACE("(%p, %p)\n", brush, forecol);
+
+    if(!brush || !forecol)  return InvalidParameter;
+
+    *forecol = brush->forecol;
+
+    return Ok;
+}
+
+GpStatus WINGDIPAPI GdipGetHatchStyle(GpHatch *brush, HatchStyle *hatchstyle)
+{
+    TRACE("(%p, %p)\n", brush, hatchstyle);
+
+    if(!brush || !hatchstyle)  return InvalidParameter;
+
+    *hatchstyle = brush->hatchstyle;
+
+    return Ok;
+}
+
 GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
 {
     TRACE("(%p)\n", brush);
@@ -1331,3 +1433,17 @@ GpStatus WINGDIPAPI GdipGetLineRectI(GpLineGradient *brush, GpRect *rect)
 
     return ret;
 }
+
+GpStatus WINGDIPAPI GdipRotateLineTransform(GpLineGradient* brush,
+    REAL angle, GpMatrixOrder order)
+{
+    static int calls;
+
+    if(!brush)
+        return InvalidParameter;
+
+    if(!(calls++))
+        FIXME("(%p, %.2f, %d) stub\n", brush, angle, order);
+
+    return NotImplemented;
+}
index d380d74..3716207 100644 (file)
@@ -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)
 @ stdcall GdipGetGenericFontFamilyMonospace(ptr)
 @ stdcall GdipGetGenericFontFamilySansSerif(ptr)
 @ stdcall GdipGetGenericFontFamilySerif(ptr)
-@ stub GdipGetHatchBackgroundColor
-@ stub GdipGetHatchForegroundColor
-@ stub GdipGetHatchStyle
+@ stdcall GdipGetHatchBackgroundColor(ptr ptr)
+@ stdcall GdipGetHatchForegroundColor(ptr ptr)
+@ stdcall GdipGetHatchStyle(ptr ptr)
 @ stub GdipGetHemfFromMetafile
 @ stub GdipGetImageAttributesAdjustedPalette
 @ stdcall GdipGetImageBounds(ptr ptr ptr)
 @ stub GdipResetPageTransform
 @ stdcall GdipResetPath(ptr)
 @ stub GdipResetPathGradientTransform
-@ stub GdipResetPenTransform
+@ stdcall GdipResetPenTransform(ptr)
 @ stdcall GdipResetTextureTransform(ptr)
 @ stdcall GdipResetWorldTransform(ptr)
 @ stdcall GdipRestoreGraphics(ptr long)
 @ stdcall GdipReversePath(ptr)
-@ stub GdipRotateLineTransform
+@ stdcall GdipRotateLineTransform(ptr long long)
 @ stdcall GdipRotateMatrix(ptr long long)
 @ stub GdipRotatePathGradientTransform
 @ stub GdipRotatePenTransform
 @ stub GdipScaleLineTransform
 @ stdcall GdipScaleMatrix(ptr long long long)
 @ stub GdipScalePathGradientTransform
-@ stub GdipScalePenTransform
+@ stdcall GdipScalePenTransform(ptr long long long)
 @ stdcall GdipScaleTextureTransform(ptr long long long)
 @ stdcall GdipScaleWorldTransform(ptr long long long)
 @ stdcall GdipSetAdjustableArrowCapFillState(ptr long)
index 965265f..658f15e 100644 (file)
@@ -111,6 +111,13 @@ struct GpBrush{
     LOGBRUSH lb;
 };
 
+struct GpHatch{
+    GpBrush brush;
+    HatchStyle hatchstyle;
+    ARGB forecol;
+    ARGB backcol;
+};
+
 struct GpSolidFill{
     GpBrush brush;
     ARGB color;
index 35db94f..e892183 100644 (file)
@@ -3229,7 +3229,7 @@ GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST G
 
     m = *(graphics->worldtrans);
 
-    ret = GdipMultiplyMatrix(&m, (GpMatrix*)matrix, order);
+    ret = GdipMultiplyMatrix(&m, matrix, order);
     if(ret == Ok)
         *(graphics->worldtrans) = m;
 
index 0c61056..02f8f5a 100644 (file)
@@ -1068,7 +1068,35 @@ GpStatus WINGDIPAPI GdipLoadImageFromStream(IStream* stream, GpImage **image)
         else
             GetDIBits(hdc, hbm, 0, 0, NULL, pbmi, DIB_RGB_COLORS);
 
-        (*((GpBitmap**) image))->format = (bmch->bcBitCount << 8) | PixelFormatGDI;
+        switch(bmch->bcBitCount)
+        {
+            case 1:
+                (*((GpBitmap**) image))->format = PixelFormat1bppIndexed;
+                break;
+            case 4:
+                (*((GpBitmap**) image))->format = PixelFormat4bppIndexed;
+                break;
+            case 8:
+                (*((GpBitmap**) image))->format = PixelFormat8bppIndexed;
+                break;
+            case 16:
+                (*((GpBitmap**) image))->format = PixelFormat16bppRGB565;
+                break;
+            case 24:
+                (*((GpBitmap**) image))->format = PixelFormat24bppRGB;
+                break;
+            case 32:
+                (*((GpBitmap**) image))->format = PixelFormat32bppRGB;
+                break;
+            case 48:
+                (*((GpBitmap**) image))->format = PixelFormat48bppRGB;
+                break;
+            default:
+                FIXME("Bit depth %d is not fully supported yet\n", bmch->bcBitCount);
+                (*((GpBitmap**) image))->format = (bmch->bcBitCount << 8) | PixelFormatGDI;
+                break;
+        }
+
         GdipFree(pbmi);
     }
     else if(type == PICTYPE_METAFILE || type == PICTYPE_ENHMETAFILE){
@@ -1180,7 +1208,7 @@ static GpStatus encode_image_BMP(LPVOID bitmap_bits, LPBITMAPINFO bitmap_info,
 
     *output = GdipAlloc(*output_size);
 
-    bmp_file_hdr = (BITMAPFILEHEADER*) *output;
+    bmp_file_hdr = *output;
     bmp_file_hdr->bfType = BITMAP_FORMAT_BMP;
     bmp_file_hdr->bfSize = *output_size;
     bmp_file_hdr->bfOffBits =
index b2d6dab..4a68a27 100644 (file)
@@ -385,6 +385,32 @@ GpStatus WINGDIPAPI GdipGetPenWidth(GpPen *pen, REAL *width)
     return Ok;
 }
 
+GpStatus WINGDIPAPI GdipResetPenTransform(GpPen *pen)
+{
+    static int calls;
+
+    if(!pen)
+        return InvalidParameter;
+
+    if(!(calls++))
+        FIXME("(%p) stub\n", pen);
+
+    return NotImplemented;
+}
+
+GpStatus WINGDIPAPI GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy, GpMatrixOrder order)
+{
+    static int calls;
+
+    if(!pen)
+        return InvalidParameter;
+
+    if(!(calls++))
+        FIXME("(%p, %.2f, %.2f, %d) stub\n", pen, sx, sy, order);
+
+    return NotImplemented;
+}
+
 GpStatus WINGDIPAPI GdipSetPenBrushFill(GpPen *pen, GpBrush *brush)
 {
     TRACE("(%p, %p)\n", pen, brush);
index 4d694f4..89b107f 100644 (file)
@@ -268,7 +268,6 @@ GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, Combin
 
 out:
     GdipFree(left);
-    delete_element(right);
     GdipDeleteRegion(path_region);
     return stat;
 }
@@ -315,7 +314,6 @@ GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region,
 
 out:
     GdipFree(left);
-    delete_element(right);
     GdipDeleteRegion(rect_region);
     return stat;
 }
@@ -373,7 +371,6 @@ GpStatus WINGDIPAPI GdipCombineRegionRegion(GpRegion *region1,
     if (stat != Ok)
     {
         GdipFree(left);
-        delete_element(right);
         return OutOfMemory;
     }
 
index 8f7470d..c989000 100644 (file)
@@ -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 */
 
index a768638..3edc1f4 100644 (file)
@@ -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;