riched20: Fix typo.
[wine] / dlls / gdiplus / region.c
1 /*
2  * Copyright (C) 2008 Google (Lei Zhang)
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdarg.h>
20
21 #include "windef.h"
22 #include "winbase.h"
23 #include "wingdi.h"
24
25 #include "objbase.h"
26
27 #include "gdiplus.h"
28 #include "gdiplus_private.h"
29 #include "wine/debug.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
32
33 /**********************************************************
34  *
35  * Data returned by GdipGetRegionData (for rectangle based regions)
36  * looks something like this:
37  *
38  * struct region_data_header
39  * {
40  *   DWORD size;     size in bytes of the data - 8.
41  *   DWORD magic1;   probably a checksum.
42  *   DWORD magic2;   always seems to be 0xdbc01001 - version?
43  *   DWORD num_ops;  number of combining ops * 2
44  * };
45  *
46  * Then follows a sequence of combining ops and RECTFs.
47  *
48  * Combining ops are just stored as their CombineMode value.
49  *
50  * Each RECTF is preceded by the DWORD 0x10000000.  An empty rect is
51  * stored as 0x10000002 (with no following RECTF) and an infinite rect
52  * is stored as 0x10000003 (again with no following RECTF).
53  *
54  * The combining ops are stored in the reverse order to the RECTFs and in the
55  * reverse order to which the region was constructed.
56  *
57  * When two or more complex regions (ie those with more than one rect)
58  * are combined, the combining op for the two regions comes first,
59  * then the combining ops for the rects in region 1, followed by the
60  * rects for region 1, then follows the combining ops for region 2 and
61  * finally region 2's rects.  Presumably you're supposed to use the
62  * 0x10000000 rect header to find the end of the op list (the count of
63  * the rects in each region is not stored).
64  *
65  * When a simple region (1 rect) is combined, it's treated as if a single rect
66  * is being combined.
67  *
68  */
69
70 GpStatus WINGDIPAPI GdipCloneRegion(GpRegion *region, GpRegion **clone)
71 {
72     FIXME("(%p %p): stub\n", region, clone);
73
74     *clone = NULL;
75     return NotImplemented;
76 }
77
78 GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode mode)
79 {
80     FIXME("(%p %p %d): stub\n", region, path, mode);
81     return NotImplemented;
82 }
83
84 GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,
85                                           CombineMode mode)
86 {
87     FIXME("(%p %p %d): stub\n", region, rect, mode);
88     return NotImplemented;
89 }
90
91 GpStatus WINGDIPAPI GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,
92                                            CombineMode mode)
93 {
94     FIXME("(%p %p %d): stub\n", region, rect, mode);
95     return NotImplemented;
96 }
97
98 GpStatus WINGDIPAPI GdipCombineRegionRegion(GpRegion *region1, GpRegion *region2,
99                                             CombineMode mode)
100 {
101     FIXME("(%p %p %d): stub\n", region1, region2, mode);
102     return NotImplemented;
103 }
104
105 GpStatus WINGDIPAPI GdipCreateRegion(GpRegion **region)
106 {
107     FIXME("(%p): stub\n", region);
108
109     *region = NULL;
110     return NotImplemented;
111 }
112
113 GpStatus WINGDIPAPI GdipCreateRegionPath(GpPath *path, GpRegion **region)
114 {
115     FIXME("(%p, %p): stub\n", path, region);
116
117     *region = NULL;
118     return NotImplemented;
119 }
120
121 GpStatus WINGDIPAPI GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region)
122 {
123     FIXME("(%p, %p): stub\n", rect, region);
124
125     *region = NULL;
126     return NotImplemented;
127 }
128
129 GpStatus WINGDIPAPI GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region)
130 {
131     FIXME("(%p, %p): stub\n", rect, region);
132
133     *region = NULL;
134     return NotImplemented;
135 }
136
137 GpStatus WINGDIPAPI GdipCreateRegionRgnData(GDIPCONST BYTE *data, INT size, GpRegion **region)
138 {
139     FIXME("(%p, %d, %p): stub\n", data, size, region);
140
141     *region = NULL;
142     return NotImplemented;
143 }
144
145 GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region)
146 {
147     FIXME("(%p, %p): stub\n", hrgn, region);
148
149     *region = NULL;
150     return NotImplemented;
151 }
152
153 GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region)
154 {
155     FIXME("(%p): stub\n", region);
156     return NotImplemented;
157 }
158
159 GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect)
160 {
161     FIXME("(%p, %p, %p): stub\n", region, graphics, rect);
162
163     return NotImplemented;
164 }
165
166 GpStatus WINGDIPAPI GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics, GpRect *rect)
167 {
168     FIXME("(%p, %p, %p): stub\n", region, graphics, rect);
169
170     return NotImplemented;
171 }
172
173 GpStatus WINGDIPAPI GdipGetRegionData(GpRegion *region, BYTE *buffer, UINT size, UINT *needed)
174 {
175     FIXME("(%p, %p, %d, %p): stub\n", region, buffer, size, needed);
176
177     return NotImplemented;
178 }
179
180 GpStatus WINGDIPAPI GdipGetRegionDataSize(GpRegion *region, UINT *needed)
181 {
182     FIXME("(%p, %p): stub\n", region, needed);
183
184     return NotImplemented;
185 }
186
187 GpStatus WINGDIPAPI GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hrgn)
188 {
189     FIXME("(%p, %p, %p): stub\n", region, graphics, hrgn);
190
191     *hrgn = NULL;
192     return NotImplemented;
193 }
194
195 GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BOOL *res)
196 {
197     FIXME("(%p, %p, %p): stub\n", region, graphics, res);
198
199     return NotImplemented;
200 }
201
202 GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics,
203                                       BOOL *res)
204 {
205     FIXME("(%p, %p, %p, %p): stub\n", region, region2, graphics, res);
206
207     return NotImplemented;
208 }
209
210 GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics, BOOL *res)
211 {
212     FIXME("(%p, %p, %p): stub\n", region, graphics, res);
213
214     return NotImplemented;
215 }
216
217 GpStatus WINGDIPAPI GdipSetEmpty(GpRegion *region)
218 {
219     static int calls;
220
221     if(!(calls++))
222         FIXME("not implemented\n");
223
224     return NotImplemented;
225 }
226
227 GpStatus WINGDIPAPI GdipSetInfinite(GpRegion *region)
228 {
229     static int calls;
230
231     if(!(calls++))
232         FIXME("not implemented\n");
233
234     return NotImplemented;
235 }
236
237 GpStatus WINGDIPAPI GdipTransformRegion(GpRegion *region, GpMatrix *matrix)
238 {
239     FIXME("(%p, %p): stub\n", region, matrix);
240
241     return NotImplemented;
242 }
243
244 GpStatus WINGDIPAPI GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy)
245 {
246     FIXME("(%p, %f, %f): stub\n", region, dx, dy);
247
248     return NotImplemented;
249 }
250
251 GpStatus WINGDIPAPI GdipTranslateRegionI(GpRegion *region, INT dx, INT dy)
252 {
253     FIXME("(%p, %d, %d): stub\n", region, dx, dy);
254
255     return NotImplemented;
256 }