- Sync gdiplus with Wine head
[reactos.git] / reactos / dll / win32 / gdiplus / gdiplus_private.h
index ed76375..658f15e 100644 (file)
@@ -37,6 +37,9 @@
 #define MAX_DASHLEN (16) /* this is a limitation of gdi */
 #define INCH_HIMETRIC (2540)
 
+#define VERSION_MAGIC 0xdbc01001
+#define TENSION_CONST (0.3)
+
 COLORREF ARGB2COLORREF(ARGB color);
 extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
     REAL startAngle, REAL sweepAngle);
@@ -44,6 +47,18 @@ extern REAL gdiplus_atan2(REAL dy, REAL dx);
 extern GpStatus hresult_to_status(HRESULT res);
 extern REAL convert_unit(HDC hdc, GpUnit unit);
 
+extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
+    REAL *y1, REAL *x2, REAL *y2);
+extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
+    REAL tension, REAL *x, REAL *y);
+
+extern BOOL lengthen_path(GpPath *path, INT len);
+
+extern GpStatus trace_path(GpGraphics *graphics, GpPath *path);
+
+typedef struct region_element region_element;
+extern inline void delete_element(region_element *element);
+
 static inline INT roundr(REAL x)
 {
     return (INT) floor(x + 0.5);
@@ -70,6 +85,7 @@ struct GpPen{
     INT numdashes;
     REAL offset;    /* dash offset */
     GpBrush *brush;
+    GpPenAlignment align;
 };
 
 struct GpGraphics{
@@ -84,6 +100,9 @@ struct GpGraphics{
     GpUnit unit;    /* page unit */
     REAL scale;     /* page scale */
     GpMatrix * worldtrans; /* world transform */
+    BOOL busy;      /* hdc handle obtained by GdipGetDC */
+    GpRegion *clip;
+    UINT textcontrast; /* not used yet. get/set only */
 };
 
 struct GpBrush{
@@ -92,6 +111,13 @@ struct GpBrush{
     LOGBRUSH lb;
 };
 
+struct GpHatch{
+    GpBrush brush;
+    HatchStyle hatchstyle;
+    ARGB forecol;
+    ARGB backcol;
+};
+
 struct GpSolidFill{
     GpBrush brush;
     ARGB color;
@@ -105,6 +131,9 @@ struct GpPathGradient{
     BOOL gamma;
     GpPointF center;
     GpPointF focus;
+    REAL* blendfac;  /* blend factors */
+    REAL* blendpos;  /* blend positions */
+    INT blendcount;
 };
 
 struct GpLineGradient{
@@ -119,6 +148,8 @@ struct GpLineGradient{
 
 struct GpTexture{
     GpBrush brush;
+    GpMatrix *transform;
+    WrapMode wrap;  /* not used yet */
 };
 
 struct GpPath{
@@ -144,6 +175,12 @@ struct GpCustomLineCap{
     BOOL fill;      /* TRUE for fill, FALSE for stroke */
     GpLineCap cap;  /* as far as I can tell, this value is ignored */
     REAL inset;     /* how much to adjust the end of the line */
+    GpLineJoin join;
+    REAL scale;
+};
+
+struct GpAdustableArrowCap{
+    GpCustomLineCap cap;
 };
 
 struct GpImage{
@@ -168,6 +205,10 @@ struct GpBitmap{
     BYTE *bitmapbits;   /* pointer to the buffer we passed in BitmapLockBits */
 };
 
+struct GpCachedBitmap{
+    GpImage *image;
+};
+
 struct GpImageAttributes{
     WrapMode wrap;
 };
@@ -175,25 +216,78 @@ struct GpImageAttributes{
 struct GpFont{
     LOGFONTW lfw;
     REAL emSize;
+    UINT height;
+    LONG line_spacing;
     Unit unit;
 };
 
 struct GpStringFormat{
     INT attr;
     LANGID lang;
+    LANGID digitlang;
     StringAlignment align;
     StringTrimming trimming;
     HotkeyPrefix hkprefix;
     StringAlignment vertalign;
+    StringDigitSubstitute digitsub;
+    INT tabcount;
+    REAL firsttab;
+    REAL *tabs;
 };
 
 struct GpFontCollection{
-    GpFontFamily* FontFamilies;
+    GpFontFamily **FontFamilies;
+    INT count;
 };
 
 struct GpFontFamily{
-    TEXTMETRICW tmw;
-    WCHAR* FamilyName;
+    NEWTEXTMETRICW tmw;
+    WCHAR FamilyName[LF_FACESIZE];
+};
+
+/* internal use */
+typedef enum RegionType
+{
+    RegionDataRect          = 0x10000000,
+    RegionDataPath          = 0x10000001,
+    RegionDataEmptyRect     = 0x10000002,
+    RegionDataInfiniteRect  = 0x10000003,
+} RegionType;
+
+struct region_element
+{
+    DWORD type; /* Rectangle, Path, SpecialRectangle, or CombineMode */
+    union
+    {
+        GpRectF rect;
+        struct
+        {
+            GpPath* path;
+            struct
+            {
+                DWORD size;
+                DWORD magic;
+                DWORD count;
+                DWORD flags;
+            } pathheader;
+        } pathdata;
+        struct
+        {
+            struct region_element *left;  /* the original region */
+            struct region_element *right; /* what *left was combined with */
+        } combine;
+    } elementdata;
+};
+
+struct GpRegion{
+    struct
+    {
+        DWORD size;
+        DWORD checksum;
+        DWORD magic;
+        DWORD num_children;
+    } header;
+    region_element node;
 };
 
 #endif