Module: wine
Branch: master
Commit: a576c40372e55c251a39988f8d39d85437adf36b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a576c40372e55c251a39988f8…
Author: Huw Davies <huw(a)codeweavers.com>
Date: Thu May 15 13:47:47 2008 +0100
gdiplus: Add some notes about the format of the data blob returned by GdipGetRegionData.
---
dlls/gdiplus/region.c | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c
index 4286b47..46e9919 100644
--- a/dlls/gdiplus/region.c
+++ b/dlls/gdiplus/region.c
@@ -30,6 +30,43 @@
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
+/**********************************************************
+ *
+ * Data returned by GdipGetRegionData (for rectangle based regions)
+ * looks something like this:
+ *
+ * struct region_data_header
+ * {
+ * DWORD size; size in bytes of the data - 8.
+ * DWORD magic1; probably a checksum.
+ * DWORD magic2; always seems to be 0xdbc01001 - version?
+ * DWORD num_ops; number of combining ops * 2
+ * };
+ *
+ * Then follows a sequence of combining ops and RECTFs.
+ *
+ * Combining ops are just stored as their CombineMode value.
+ *
+ * Each RECTF is preceded by the DWORD 0x10000000. An empty rect is
+ * stored as 0x10000002 (with no following RECTF) and an infinite rect
+ * is stored as 0x10000003 (again with no following RECTF).
+ *
+ * The combining ops are stored in the reverse order to the RECTFs and in the
+ * reverse order to which the region was constructed.
+ *
+ * When two or more complex regions (ie those with more than one rect)
+ * are combined, the combining op for the two regions comes first,
+ * then the combining ops for the rects in region 1, followed by the
+ * rects for region 1, then follows the combining ops for region 2 and
+ * finally region 2's rects. Presumably you're supposed to use the
+ * 0x10000000 rect header to find the end of the op list (the count of
+ * the rects in each region is not stored).
+ *
+ * When a simple region (1 rect) is combined, it's treated as if a single rect
+ * is being combined.
+ *
+ */
+
GpStatus WINGDIPAPI GdipCreateRegion(GpRegion **region)
{
FIXME("(%p): stub\n", region);