Huw Davies : gdiplus: Add some notes about the format of the data blob returned by GdipGetRegionData .

Alexandre Julliard julliard at winehq.org
Mon May 19 09:39:34 CDT 2008


Module: wine
Branch: master
Commit: a576c40372e55c251a39988f8d39d85437adf36b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a576c40372e55c251a39988f8d39d85437adf36b

Author: Huw Davies <huw at 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);




More information about the wine-cvs mailing list