ReactOS 0.4.15-dev-5666-gc548b97
pathiterator.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2007 Google (Evan Stade)
3 * Copyright (C) 2008 Nikolay Sivov <bunglehead at gmail dot com>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include <stdarg.h>
21
22#include "windef.h"
23#include "winbase.h"
24#include "wingdi.h"
25
26#include "objbase.h"
27
28#include "gdiplus.h"
29#include "gdiplus_private.h"
30#include "wine/debug.h"
31
33
35{
36 INT size;
37
38 TRACE("(%p, %p)\n", iterator, path);
39
40 if(!iterator)
41 return InvalidParameter;
42
43 *iterator = heap_alloc_zero(sizeof(GpPathIterator));
44 if(!*iterator) return OutOfMemory;
45
46 if(path){
47 size = path->pathdata.Count;
48
49 (*iterator)->pathdata.Types = heap_alloc_zero(size);
50 (*iterator)->pathdata.Points = heap_alloc_zero(size * sizeof(PointF));
51
52 memcpy((*iterator)->pathdata.Types, path->pathdata.Types, size);
53 memcpy((*iterator)->pathdata.Points, path->pathdata.Points,size * sizeof(PointF));
54 (*iterator)->pathdata.Count = size;
55 }
56 else{
57 (*iterator)->pathdata.Types = NULL;
58 (*iterator)->pathdata.Points = NULL;
59 (*iterator)->pathdata.Count = 0;
60 }
61
62 (*iterator)->subpath_pos = 0;
63 (*iterator)->marker_pos = 0;
64 (*iterator)->pathtype_pos = 0;
65
66 return Ok;
67}
68
70{
71 TRACE("(%p)\n", iter);
72
73 if(!iter)
74 return InvalidParameter;
75
78 heap_free(iter);
79
80 return Ok;
81}
82
84 INT* resultCount, GpPointF* points, BYTE* types, INT startIndex, INT endIndex)
85{
86 TRACE("(%p, %p, %p, %p, %d, %d)\n", iterator, resultCount, points, types,
87 startIndex, endIndex);
88
89 if(!iterator || !types || !points)
90 return InvalidParameter;
91
92 if(endIndex > iterator->pathdata.Count - 1 || startIndex < 0 ||
93 endIndex < startIndex){
94 *resultCount = 0;
95 return Ok;
96 }
97
98 *resultCount = endIndex - startIndex + 1;
99
100 memcpy(types, &(iterator->pathdata.Types[startIndex]), *resultCount);
101 memcpy(points, &(iterator->pathdata.Points[startIndex]),
102 *resultCount * sizeof(PointF));
103
104 return Ok;
105}
106
108{
109 INT i;
110
111 TRACE("(%p, %p)\n", iterator, hasCurve);
112
113 if(!iterator)
114 return InvalidParameter;
115
116 *hasCurve = FALSE;
117
118 for(i = 0; i < iterator->pathdata.Count; i++)
119 if((iterator->pathdata.Types[i] & PathPointTypePathTypeMask) == PathPointTypeBezier){
120 *hasCurve = TRUE;
121 break;
122 }
123
124 return Ok;
125}
126
128{
129 INT i;
130
131 TRACE("(%p, %p)\n", iterator, count);
132
133 if(!iterator || !count)
134 return InvalidParameter;
135
136 *count = 0;
137 for(i = 0; i < iterator->pathdata.Count; i++){
138 if(iterator->pathdata.Types[i] == PathPointTypeStart)
139 (*count)++;
140 }
141
142 return Ok;
143}
144
146 INT* startIndex, INT* endIndex)
147{
148 INT i;
149
150 TRACE("(%p, %p, %p, %p)\n", iterator, resultCount, startIndex, endIndex);
151
152 if(!iterator || !startIndex || !endIndex)
153 return InvalidParameter;
154
155 *resultCount = 0;
156
157 /* first call could start with second point as all subsequent, cause
158 path couldn't contain only one */
159 for(i = iterator->marker_pos + 1; i < iterator->pathdata.Count; i++){
160 if((iterator->pathdata.Types[i] & PathPointTypePathMarker) ||
161 (i == iterator->pathdata.Count - 1)){
162 *startIndex = iterator->marker_pos;
163 if(iterator->marker_pos > 0) (*startIndex)++;
164 *endIndex = iterator->marker_pos = i;
165 *resultCount= *endIndex - *startIndex + 1;
166 break;
167 }
168 }
169
170 return Ok;
171}
172
174 GpPath* path)
175{
176 INT start, end;
177
178 TRACE("(%p, %p, %p)\n", iterator, result, path);
179
180 if(!iterator || !result)
181 return InvalidParameter;
182
184 /* return path */
185 if(((*result) > 0) && path){
187
189 return OutOfMemory;
190
191 memcpy(path->pathdata.Points, &(iterator->pathdata.Points[start]), sizeof(GpPointF)*(*result));
192 memcpy(path->pathdata.Types, &(iterator->pathdata.Types[start]), sizeof(BYTE)*(*result));
193 path->pathdata.Count = *result;
194 }
195
196 return Ok;
197}
198
200 INT *resultCount, INT* startIndex, INT* endIndex, BOOL* isClosed)
201{
202 INT i, count;
203
204 TRACE("(%p, %p, %p, %p, %p)\n", iterator, resultCount, startIndex,
205 endIndex, isClosed);
206
207 if(!iterator || !startIndex || !endIndex || !isClosed || !resultCount)
208 return InvalidParameter;
209
210 count = iterator->pathdata.Count;
211
212 /* iterator created with NULL path */
213 if(count == 0){
214 *resultCount = 0;
215 return Ok;
216 }
217
218 if(iterator->subpath_pos == count){
219 *startIndex = *endIndex = *resultCount = 0;
220 *isClosed = TRUE;
221 return Ok;
222 }
223
224 *startIndex = iterator->subpath_pos;
225
226 for(i = iterator->subpath_pos + 1; i < count &&
227 !(iterator->pathdata.Types[i] == PathPointTypeStart); i++);
228
229 *endIndex = i - 1;
230 iterator->subpath_pos = i;
231
232 *resultCount = *endIndex - *startIndex + 1;
233
234 if(iterator->pathdata.Types[*endIndex] & PathPointTypeCloseSubpath)
235 *isClosed = TRUE;
236 else
237 *isClosed = FALSE;
238
239 return Ok;
240}
242{
243 TRACE("(%p)\n", iterator);
244
245 if(!iterator)
246 return InvalidParameter;
247
248 iterator->subpath_pos = 0;
249 iterator->marker_pos = 0;
250 iterator->pathtype_pos = 0;
251
252 return Ok;
253}
254
256{
257 TRACE("(%p, %p)\n", iterator, count);
258
259 if(!iterator || !count)
260 return InvalidParameter;
261
262 *count = iterator->pathdata.Count;
263
264 return Ok;
265}
266
269{
270 TRACE("(%p, %p, %p, %p, %d)\n", iterator, resultCount, points, types, count);
271
272 if((count < 0) || !resultCount)
273 return InvalidParameter;
274
275 if(count == 0){
276 *resultCount = 0;
277 return Ok;
278 }
279
280 return GdipPathIterCopyData(iterator, resultCount, points, types, 0, count-1);
281}
282
284{
285 TRACE("(%p, %p)\n", iterator, valid);
286
287 if(!iterator || !valid)
288 return InvalidParameter;
289
290 *valid = TRUE;
291
292 return Ok;
293}
294
296 BYTE* type, INT* start, INT* end)
297{
298 FIXME("(%p, %p, %p, %p, %p) stub\n", iter, result, type, start, end);
299
300 if(!iter || !result || !type || !start || !end)
301 return InvalidParameter;
302
303 return NotImplemented;
304}
305
307 GpPath* path, BOOL* closed)
308{
309 INT start, end;
310
311 TRACE("(%p, %p, %p, %p)\n", iter, result, path, closed);
312
313 if(!iter || !result || !closed)
314 return InvalidParameter;
315
316 GdipPathIterNextSubpath(iter, result, &start, &end, closed);
317 /* return path */
318 if(((*result) > 0) && path){
320
322 return OutOfMemory;
323
324 memcpy(path->pathdata.Points, &(iter->pathdata.Points[start]), sizeof(GpPointF)*(*result));
325 memcpy(path->pathdata.Types, &(iter->pathdata.Types[start]), sizeof(BYTE)*(*result));
326 path->pathdata.Count = *result;
327 }
328
329 return Ok;
330}
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: debug.h:111
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GpStatus WINGDIPAPI GdipResetPath(GpPath *path)
GpStatus WINGDIPAPI GdipPathIterNextMarkerPath(GpPathIterator *iterator, INT *result, GpPath *path)
Definition: pathiterator.c:173
GpStatus WINGDIPAPI GdipPathIterGetCount(GpPathIterator *iterator, INT *count)
Definition: pathiterator.c:255
GpStatus WINGDIPAPI GdipPathIterGetSubpathCount(GpPathIterator *iterator, INT *count)
Definition: pathiterator.c:127
GpStatus WINGDIPAPI GdipDeletePathIter(GpPathIterator *iter)
Definition: pathiterator.c:69
GpStatus WINGDIPAPI GdipPathIterHasCurve(GpPathIterator *iterator, BOOL *hasCurve)
Definition: pathiterator.c:107
GpStatus WINGDIPAPI GdipPathIterEnumerate(GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT count)
Definition: pathiterator.c:267
GpStatus WINGDIPAPI GdipPathIterNextSubpath(GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex, BOOL *isClosed)
Definition: pathiterator.c:199
GpStatus WINGDIPAPI GdipCreatePathIter(GpPathIterator **iterator, GpPath *path)
Definition: pathiterator.c:34
GpStatus WINGDIPAPI GdipPathIterNextSubpathPath(GpPathIterator *iter, INT *result, GpPath *path, BOOL *closed)
Definition: pathiterator.c:306
GpStatus WINGDIPAPI GdipPathIterIsValid(GpPathIterator *iterator, BOOL *valid)
Definition: pathiterator.c:283
GpStatus WINGDIPAPI GdipPathIterRewind(GpPathIterator *iterator)
Definition: pathiterator.c:241
GpStatus WINGDIPAPI GdipPathIterNextPathType(GpPathIterator *iter, INT *result, BYTE *type, INT *start, INT *end)
Definition: pathiterator.c:295
GpStatus WINGDIPAPI GdipPathIterCopyData(GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT startIndex, INT endIndex)
Definition: pathiterator.c:83
GpStatus WINGDIPAPI GdipPathIterNextMarker(GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex)
Definition: pathiterator.c:145
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOLEAN valid
BOOL lengthen_path(GpPath *path, INT len)
Definition: gdiplus.c:405
@ PathPointTypePathMarker
Definition: gdiplusenums.h:89
@ PathPointTypePathTypeMask
Definition: gdiplusenums.h:87
@ PathPointTypeBezier
Definition: gdiplusenums.h:86
@ PathPointTypeCloseSubpath
Definition: gdiplusenums.h:90
@ PathPointTypeStart
Definition: gdiplusenums.h:84
#define WINGDIPAPI
Definition: gdiplusflat.h:22
Status
Definition: gdiplustypes.h:25
@ Ok
Definition: gdiplustypes.h:26
@ InvalidParameter
Definition: gdiplustypes.h:28
@ OutOfMemory
Definition: gdiplustypes.h:29
@ NotImplemented
Definition: gdiplustypes.h:32
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLuint64EXT * result
Definition: glext.h:11304
GLsizei const GLfloat * points
Definition: glext.h:8112
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define TRACE(s)
Definition: solgame.cpp:4
GpPathData pathdata
PointF * Points
Definition: gdiplustypes.h:655
BYTE * Types
Definition: gdiplustypes.h:656
Definition: cmds.c:130
int32_t INT
Definition: typedefs.h:58
unsigned char BYTE
Definition: xxhash.c:193