ReactOS 0.4.16-dev-199-g898cc56
customlinecap.c
Go to the documentation of this file.
1/*
2 * Unit test suite for customlinecap
3 *
4 * Copyright (C) 2008 Nikolay Sivov
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20#include <limits.h>
21
22#include "objbase.h"
23#include "gdiplus.h"
24#include "wine/test.h"
25
26#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
27#define expectf(expected, got) ok(got == expected, "Expected %.2f, got %.2f\n", expected, got)
28
29static BOOL compare_float(float f, float g, unsigned int ulps)
30{
31 int x = *(int *)&f;
32 int y = *(int *)&g;
33
34 if (x < 0)
35 x = INT_MIN - x;
36 if (y < 0)
37 y = INT_MIN - y;
38
39 if (abs(x - y) > ulps)
40 return FALSE;
41
42 return TRUE;
43}
44
46{
47 GpCustomLineCap *custom;
48 GpPath *path, *path2;
50
52 expect(Ok, stat);
53 stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0);
54 expect(Ok, stat);
55
57 expect(Ok, stat);
58 stat = GdipAddPathRectangle(path2, 5.0, 5.0, 10.0, 10.0);
59 expect(Ok, stat);
60
61 /* NULL args */
72
73 /* valid args */
75 expect(Ok, stat);
77 expect(Ok, stat);
78 /* it's strange but native returns NotImplemented on stroke == NULL */
79 custom = NULL;
82 todo_wine ok(custom == NULL, "Expected a failure on creation\n");
83 if(stat == Ok) GdipDeleteCustomLineCap(custom);
84
87}
88
89static void test_linejoin(void)
90{
91 GpCustomLineCap *custom;
92 GpPath *path;
95
97 expect(Ok, stat);
98 stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0);
99 expect(Ok, stat);
100
102 expect(Ok, stat);
103
104 /* NULL args */
113
114 /* LineJoinMiter is default */
116 expect(Ok, stat);
118
119 /* set/get */
121 expect(Ok, stat);
123 expect(Ok, stat);
126 expect(Ok, stat);
128 expect(Ok, stat);
131 expect(Ok, stat);
133 expect(Ok, stat);
135
138}
139
140static void test_inset(void)
141{
142 GpCustomLineCap *custom;
143 GpPath *path;
144 REAL inset;
146
148 expect(Ok, stat);
149 stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0);
150 expect(Ok, stat);
151
153 expect(Ok, stat);
154
155 /* NULL args */
162 /* valid args */
163 inset = (REAL)0xdeadbeef;
164 stat = GdipGetCustomLineCapBaseInset(custom, &inset);
165 expect(Ok, stat);
166 expectf(0.0, inset);
167
170}
171
172static void test_scale(void)
173{
174 GpCustomLineCap *custom;
175 GpPath *path;
176 REAL scale;
178
180 expect(Ok, stat);
181 stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0);
182 expect(Ok, stat);
183
185 expect(Ok, stat);
186
187 /* NULL args */
194
197
198 /* valid args: read default */
199 scale = (REAL)0xdeadbeef;
201 expect(Ok, stat);
202 expectf(1.0, scale);
203
204 /* set and read back some scale values: there is no limit for the scale */
206 expect(Ok, stat);
207 scale = (REAL)0xdeadbeef;
209 expect(Ok, stat);
210 expectf(2.5, scale);
211
212 stat = GdipSetCustomLineCapWidthScale(custom, 42.0);
213 expect(Ok, stat);
214 scale = (REAL)0xdeadbeef;
216 expect(Ok, stat);
217 expectf(42.0, scale);
218
219 stat = GdipSetCustomLineCapWidthScale(custom, 3000.0);
220 expect(Ok, stat);
221 scale = (REAL)0xdeadbeef;
223 expect(Ok, stat);
224 expectf(3000.0, scale);
225
227 expect(Ok, stat);
228 scale = (REAL)0xdeadbeef;
230 expect(Ok, stat);
231 expectf(0.0, scale);
232
235}
236
238{
239 REAL inset, scale, height, width;
244 BOOL ret;
245
247 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
248
249 stat = GdipCreateAdjustableArrowCap(17.0, 15.0, TRUE, &cap);
250 ok(stat == Ok, "Failed to create adjustable cap, %d\n", stat);
251
253 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
254
255 ret = FALSE;
257 ok(stat == Ok, "Unexpected return code, %d\n", stat);
258 ok(ret, "Unexpected fill state %d\n", ret);
259
261 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
262
264 ok(stat == Ok, "Unexpected return code, %d\n", stat);
265 ok(height == 17.0, "Unexpected cap height %f\n", height);
266
268 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
269
271 ok(stat == Ok, "Unexpected return code, %d\n", stat);
272 ok(width == 15.0, "Unexpected cap width %f\n", width);
273
275 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
276
278 ok(stat == Ok, "Unexpected return code, %d\n", stat);
279 ok(inset == 0.0f, "Unexpected middle inset %f\n", inset);
280
282 ok(stat == Ok, "Unexpected return code, %d\n", stat);
283 ok(base == LineCapTriangle, "Unexpected base cap %d\n", base);
284
287 ok(stat == Ok, "Unexpected return code, %d\n", stat);
288
290 ok(stat == Ok, "Unexpected return code, %d\n", stat);
292 ok(base == LineCapSquare, "Unexpected base cap %d\n", base);
293
294 /* Base inset */
296 ok(stat == Ok, "Unexpected return code, %d\n", stat);
297
299 ok(stat == Ok, "Unexpected return code, %d\n", stat);
300
301 inset = 0.0;
303 ok(stat == Ok, "Unexpected return code, %d\n", stat);
304 ok(compare_float(inset, height / width, 1), "Unexpected inset %f\n", inset);
305
307 ok(stat == Ok, "Unexpected return code, %d\n", stat);
308
309 inset = 0.0;
311 ok(stat == Ok, "Unexpected return code, %d\n", stat);
312 ok(compare_float(inset, height / width, 1), "Unexpected inset %f\n", inset);
313
315 ok(stat == Ok, "Unexpected return code, %d\n", stat);
316
317 inset = 0.0;
319 ok(stat == Ok, "Unexpected return code, %d\n", stat);
320 ok(compare_float(inset, 2.0 * height / width, 1), "Unexpected inset %f\n", inset);
321
323 ok(stat == Ok, "Unexpected return code, %d\n", stat);
324 ok(scale == 1.0f, "Unexpected width scale %f\n", scale);
325
327 ok(stat == Ok, "Unexpected return code, %d\n", stat);
328 ok(join == LineJoinMiter, "Unexpected stroke join %d\n", join);
329
331}
332
333static void test_captype(void)
334{
335 GpAdjustableArrowCap *arrowcap;
336 GpCustomLineCap *custom;
339 GpPath *path;
340
342 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
343
344 type = 10;
346 ok(stat == InvalidParameter, "Unexpected return code, %d\n", stat);
347 ok(type == 10, "Unexpected cap type, %d\n", type);
348
349 /* default cap */
351 ok(stat == Ok, "Failed to create path, %d\n", stat);
352 stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0);
353 ok(stat == Ok, "AddPathRectangle failed, %d\n", stat);
354
356 ok(stat == Ok, "Failed to create cap, %d\n", stat);
358 ok(stat == Ok, "Failed to get cap type, %d\n", stat);
359 ok(type == CustomLineCapTypeDefault, "Unexpected cap type %d\n", stat);
362
363 /* arrow cap */
364 stat = GdipCreateAdjustableArrowCap(17.0, 15.0, TRUE, &arrowcap);
365 ok(stat == Ok, "Failed to create adjustable cap, %d\n", stat);
366
368 ok(stat == Ok, "Failed to get cap type, %d\n", stat);
369 ok(type == CustomLineCapTypeAdjustableArrow, "Unexpected cap type %d\n", stat);
370
372}
373
374START_TEST(customlinecap)
375{
376 struct GdiplusStartupInput gdiplusStartupInput;
377 ULONG_PTR gdiplusToken;
378 HMODULE hmsvcrt;
379 int (CDECL * _controlfp_s)(unsigned int *cur, unsigned int newval, unsigned int mask);
380
381 /* Enable all FP exceptions except _EM_INEXACT, which gdi32 can trigger */
382 hmsvcrt = LoadLibraryA("msvcrt");
383 _controlfp_s = (void*)GetProcAddress(hmsvcrt, "_controlfp_s");
384 if (_controlfp_s) _controlfp_s(0, 0, 0x0008001e);
385
386 gdiplusStartupInput.GdiplusVersion = 1;
387 gdiplusStartupInput.DebugEventCallback = NULL;
388 gdiplusStartupInput.SuppressBackgroundThread = 0;
389 gdiplusStartupInput.SuppressExternalCodecs = 0;
390
391 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
392
395 test_inset();
396 test_scale();
398 test_captype();
399
400 GdiplusShutdown(gdiplusToken);
401}
int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask)
Definition: _controlfp_s.c:19
#define stat
Definition: acwin.h:99
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
float REAL
Definition: types.h:41
#define CDECL
Definition: compat.h:29
#define GetProcAddress(x, y)
Definition: compat.h:753
GpStatus WINGDIPAPI GdipGetCustomLineCapBaseCap(GpCustomLineCap *customCap, GpLineCap *baseCap)
GpStatus WINGDIPAPI GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap *cap, BOOL *fill)
GpStatus WINGDIPAPI GdipSetCustomLineCapWidthScale(GpCustomLineCap *custom, REAL width)
GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath *fillPath, GpPath *strokePath, GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap)
GpStatus WINGDIPAPI GdipGetCustomLineCapBaseInset(GpCustomLineCap *custom, REAL *inset)
GpStatus WINGDIPAPI GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap *cap, REAL height)
GpStatus WINGDIPAPI GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap *cap, REAL *height)
GpStatus WINGDIPAPI GdipGetCustomLineCapStrokeJoin(GpCustomLineCap *customCap, GpLineJoin *lineJoin)
GpStatus WINGDIPAPI GdipSetCustomLineCapBaseCap(GpCustomLineCap *custom, GpLineCap base)
GpStatus WINGDIPAPI GdipGetCustomLineCapWidthScale(GpCustomLineCap *custom, REAL *widthScale)
GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap *customCap)
GpStatus WINGDIPAPI GdipGetCustomLineCapType(GpCustomLineCap *customCap, CustomLineCapType *type)
GpStatus WINGDIPAPI GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap *cap, REAL *width)
GpStatus WINGDIPAPI GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL fill, GpAdjustableArrowCap **cap)
GpStatus WINGDIPAPI GdipSetCustomLineCapStrokeJoin(GpCustomLineCap *custom, GpLineJoin join)
GpStatus WINGDIPAPI GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap *cap, REAL *middle)
GpStatus WINGDIPAPI GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap *cap, REAL middle)
GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path)
GpStatus WINGDIPAPI GdipDeletePath(GpPath *path)
GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define abs(i)
Definition: fconv.c:206
unsigned int BOOL
Definition: ntddk_ex.h:94
FxCollectionEntry * cur
Status WINAPI GdiplusStartup(ULONG_PTR *token, const struct GdiplusStartupInput *input, struct GdiplusStartupOutput *output)
Definition: gdiplus.c:81
LineJoin
Definition: gdiplusenums.h:105
@ LineJoinMiter
Definition: gdiplusenums.h:106
@ LineJoinMiterClipped
Definition: gdiplusenums.h:109
@ LineJoinBevel
Definition: gdiplusenums.h:107
@ LineJoinRound
Definition: gdiplusenums.h:108
CustomLineCapType
Definition: gdiplusenums.h:77
@ CustomLineCapTypeAdjustableArrow
Definition: gdiplusenums.h:79
@ CustomLineCapTypeDefault
Definition: gdiplusenums.h:78
LineCap
Definition: gdiplusenums.h:60
@ LineCapTriangle
Definition: gdiplusenums.h:64
@ LineCapSquare
Definition: gdiplusenums.h:62
@ LineCapFlat
Definition: gdiplusenums.h:61
@ FillModeAlternate
Definition: gdiplusenums.h:55
void WINAPI GdiplusShutdown(ULONG_PTR)
Status
Definition: gdiplustypes.h:25
@ Ok
Definition: gdiplustypes.h:26
@ InvalidParameter
Definition: gdiplustypes.h:28
@ NotImplemented
Definition: gdiplustypes.h:32
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLenum GLint GLuint mask
Definition: glext.h:6028
GLfloat f
Definition: glext.h:7540
GLboolean GLboolean g
Definition: glext.h:6204
GLenum cap
Definition: glext.h:9639
#define INT_MIN
Definition: limits.h:39
LOCAL int join(int *aux, int a, int b)
Definition: match.c:560
unsigned int ulps
Definition: effect.c:4332
#define compare_float(got, exp)
Definition: mesh.c:52
static void test_inset(void)
static void test_scale(void)
static void test_linejoin(void)
Definition: customlinecap.c:89
static void test_captype(void)
static void test_create_adjustable_cap(void)
#define expect(expected, got)
Definition: customlinecap.c:26
#define expectf(expected, got)
Definition: customlinecap.c:27
static void test_constructor_destructor(void)
Definition: customlinecap.c:45
#define todo_wine
Definition: custom.c:89
static const WCHAR path2[]
Definition: path.c:29
#define cap
Definition: glfuncs.h:226
BOOL SuppressBackgroundThread
Definition: gdiplusinit.h:36
DebugEventProc DebugEventCallback
Definition: gdiplusinit.h:35
Definition: stat.h:55
uint32_t ULONG_PTR
Definition: typedefs.h:65
int ret