ReactOS 0.4.15-dev-7842-g558ab78
pathiterator.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "objbase.h"
#include "gdiplus.h"
#include "gdiplus_private.h"
#include "wine/debug.h"
Include dependency graph for pathiterator.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (gdiplus)
 
GpStatus WINGDIPAPI GdipCreatePathIter (GpPathIterator **iterator, GpPath *path)
 
GpStatus WINGDIPAPI GdipDeletePathIter (GpPathIterator *iter)
 
GpStatus WINGDIPAPI GdipPathIterCopyData (GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT startIndex, INT endIndex)
 
GpStatus WINGDIPAPI GdipPathIterHasCurve (GpPathIterator *iterator, BOOL *hasCurve)
 
GpStatus WINGDIPAPI GdipPathIterGetSubpathCount (GpPathIterator *iterator, INT *count)
 
GpStatus WINGDIPAPI GdipPathIterNextMarker (GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex)
 
GpStatus WINGDIPAPI GdipPathIterNextMarkerPath (GpPathIterator *iterator, INT *result, GpPath *path)
 
GpStatus WINGDIPAPI GdipPathIterNextSubpath (GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex, BOOL *isClosed)
 
GpStatus WINGDIPAPI GdipPathIterRewind (GpPathIterator *iterator)
 
GpStatus WINGDIPAPI GdipPathIterGetCount (GpPathIterator *iterator, INT *count)
 
GpStatus WINGDIPAPI GdipPathIterEnumerate (GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT count)
 
GpStatus WINGDIPAPI GdipPathIterIsValid (GpPathIterator *iterator, BOOL *valid)
 
GpStatus WINGDIPAPI GdipPathIterNextPathType (GpPathIterator *iter, INT *result, BYTE *type, INT *start, INT *end)
 
GpStatus WINGDIPAPI GdipPathIterNextSubpathPath (GpPathIterator *iter, INT *result, GpPath *path, BOOL *closed)
 

Function Documentation

◆ GdipCreatePathIter()

GpStatus WINGDIPAPI GdipCreatePathIter ( GpPathIterator **  iterator,
GpPath path 
)

Definition at line 34 of file pathiterator.c.

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}
#define NULL
Definition: types.h:112
@ Ok
Definition: gdiplustypes.h:26
@ InvalidParameter
Definition: gdiplustypes.h:28
@ OutOfMemory
Definition: gdiplustypes.h:29
GLsizeiptr size
Definition: glext.h:5919
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define TRACE(s)
Definition: solgame.cpp:4
int32_t INT
Definition: typedefs.h:58

Referenced by test_constructor_destructor(), test_getsubpathcount(), test_hascurve(), test_isvalid(), test_nextmarker(), test_nextmarkerpath(), test_nextpathtype(), test_nextsubpath(), and test_nextsubpathpath().

◆ GdipDeletePathIter()

GpStatus WINGDIPAPI GdipDeletePathIter ( GpPathIterator iter)

Definition at line 69 of file pathiterator.c.

70{
71 TRACE("(%p)\n", iter);
72
73 if(!iter)
74 return InvalidParameter;
75
78 heap_free(iter);
79
80 return Ok;
81}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
GpPathData pathdata
PointF * Points
Definition: gdiplustypes.h:655
BYTE * Types
Definition: gdiplustypes.h:656

Referenced by test_constructor_destructor(), test_getsubpathcount(), test_hascurve(), test_isvalid(), test_nextmarker(), test_nextmarkerpath(), test_nextpathtype(), test_nextsubpath(), and test_nextsubpathpath().

◆ GdipPathIterCopyData()

GpStatus WINGDIPAPI GdipPathIterCopyData ( GpPathIterator iterator,
INT resultCount,
GpPointF points,
BYTE types,
INT  startIndex,
INT  endIndex 
)

Definition at line 83 of file pathiterator.c.

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}
GLsizei const GLfloat * points
Definition: glext.h:8112
Definition: cmds.c:130

Referenced by GdipPathIterEnumerate().

◆ GdipPathIterEnumerate()

GpStatus WINGDIPAPI GdipPathIterEnumerate ( GpPathIterator iterator,
INT resultCount,
GpPointF points,
BYTE types,
INT  count 
)

Definition at line 267 of file pathiterator.c.

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}
GpStatus WINGDIPAPI GdipPathIterCopyData(GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT startIndex, INT endIndex)
Definition: pathiterator.c:83
GLuint GLuint GLsizei count
Definition: gl.h:1545

◆ GdipPathIterGetCount()

GpStatus WINGDIPAPI GdipPathIterGetCount ( GpPathIterator iterator,
INT count 
)

Definition at line 255 of file pathiterator.c.

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}

◆ GdipPathIterGetSubpathCount()

GpStatus WINGDIPAPI GdipPathIterGetSubpathCount ( GpPathIterator iterator,
INT count 
)

Definition at line 127 of file pathiterator.c.

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}
@ PathPointTypeStart
Definition: gdiplusenums.h:84
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

Referenced by test_getsubpathcount().

◆ GdipPathIterHasCurve()

GpStatus WINGDIPAPI GdipPathIterHasCurve ( GpPathIterator iterator,
BOOL hasCurve 
)

Definition at line 107 of file pathiterator.c.

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}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
@ PathPointTypePathTypeMask
Definition: gdiplusenums.h:87
@ PathPointTypeBezier
Definition: gdiplusenums.h:86

Referenced by test_hascurve().

◆ GdipPathIterIsValid()

GpStatus WINGDIPAPI GdipPathIterIsValid ( GpPathIterator iterator,
BOOL valid 
)

Definition at line 283 of file pathiterator.c.

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}
BOOLEAN valid

Referenced by test_isvalid().

◆ GdipPathIterNextMarker()

GpStatus WINGDIPAPI GdipPathIterNextMarker ( GpPathIterator iterator,
INT resultCount,
INT startIndex,
INT endIndex 
)

Definition at line 145 of file pathiterator.c.

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}
@ PathPointTypePathMarker
Definition: gdiplusenums.h:89

Referenced by GdipPathIterNextMarkerPath(), test_isvalid(), and test_nextmarker().

◆ GdipPathIterNextMarkerPath()

GpStatus WINGDIPAPI GdipPathIterNextMarkerPath ( GpPathIterator iterator,
INT result,
GpPath path 
)

Definition at line 173 of file pathiterator.c.

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}
GpStatus WINGDIPAPI GdipResetPath(GpPath *path)
GpStatus WINGDIPAPI GdipPathIterNextMarker(GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex)
Definition: pathiterator.c:145
BOOL lengthen_path(GpPath *path, INT len)
Definition: gdiplus.c:405
GLuint start
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLuint64EXT * result
Definition: glext.h:11304
unsigned char BYTE
Definition: xxhash.c:193

Referenced by test_nextmarkerpath().

◆ GdipPathIterNextPathType()

GpStatus WINGDIPAPI GdipPathIterNextPathType ( GpPathIterator iter,
INT result,
BYTE type,
INT start,
INT end 
)

Definition at line 295 of file pathiterator.c.

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}
#define FIXME(fmt,...)
Definition: debug.h:111
@ NotImplemented
Definition: gdiplustypes.h:32
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545

Referenced by test_nextpathtype().

◆ GdipPathIterNextSubpath()

GpStatus WINGDIPAPI GdipPathIterNextSubpath ( GpPathIterator iterator,
INT resultCount,
INT startIndex,
INT endIndex,
BOOL isClosed 
)

Definition at line 199 of file pathiterator.c.

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}
@ PathPointTypeCloseSubpath
Definition: gdiplusenums.h:90

Referenced by GdipPathIterNextSubpathPath(), and test_nextsubpath().

◆ GdipPathIterNextSubpathPath()

GpStatus WINGDIPAPI GdipPathIterNextSubpathPath ( GpPathIterator iter,
INT result,
GpPath path,
BOOL closed 
)

Definition at line 306 of file pathiterator.c.

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}
GpStatus WINGDIPAPI GdipPathIterNextSubpath(GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex, BOOL *isClosed)
Definition: pathiterator.c:199

Referenced by test_nextsubpathpath().

◆ GdipPathIterRewind()

GpStatus WINGDIPAPI GdipPathIterRewind ( GpPathIterator iterator)

Definition at line 241 of file pathiterator.c.

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}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( gdiplus  )