From: Bartosz Kosiorek gang65@poczta.onet.pl
--- dlls/gdiplus/customlinecap.c | 5 ++-- dlls/gdiplus/tests/customlinecap.c | 43 ++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/dlls/gdiplus/customlinecap.c b/dlls/gdiplus/customlinecap.c index f35fea90eba..e767f20e4b3 100644 --- a/dlls/gdiplus/customlinecap.c +++ b/dlls/gdiplus/customlinecap.c @@ -105,8 +105,9 @@ static GpStatus init_custom_linecap(GpCustomLineCap *cap, GpPathData *pathdata, return Ok; }
-/* FIXME: Sometimes when fillPath is non-null and stroke path is null, the native - * version of this function returns NotImplemented. I cannot figure out why. */ +/* Custom line cap position (0, 0) is a place corresponding to the end of line. +* If Custom Line Cap is too big and too far from position (0, 0), +* then NotImplemented will be returned, due to floating point precision limitation. */ GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath, GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap) { diff --git a/dlls/gdiplus/tests/customlinecap.c b/dlls/gdiplus/tests/customlinecap.c index a8bb5cf371b..e3f1c331d0b 100644 --- a/dlls/gdiplus/tests/customlinecap.c +++ b/dlls/gdiplus/tests/customlinecap.c @@ -49,17 +49,22 @@ static BOOL compare_float(float f, float g, unsigned int ulps) static void test_constructor_destructor(void) { GpCustomLineCap *custom; - GpPath *path, *path2; + GpPath *path, *path2, *path3; GpStatus stat;
stat = GdipCreatePath(FillModeAlternate, &path); expect(Ok, stat); - stat = GdipAddPathRectangle(path, 5.0, 5.0, 10.0, 10.0); + stat = GdipAddPathRectangle(path, -5.0, -4.0, 10.0, 8.0); expect(Ok, stat);
stat = GdipCreatePath(FillModeAlternate, &path2); expect(Ok, stat); - stat = GdipAddPathRectangle(path2, 5.0, 5.0, 10.0, 10.0); + stat = GdipAddPathRectangle(path2, -5.0, -5.0, 10.0, 10.0); + expect(Ok, stat); + + stat = GdipCreatePath(FillModeAlternate, &path3); + expect(Ok, stat); + stat = GdipAddPathRectangle(path3, 5.0, 5.0, 10.0, 10.0); expect(Ok, stat);
/* NULL args */ @@ -74,18 +79,40 @@ static void test_constructor_destructor(void) stat = GdipDeleteCustomLineCap(NULL); expect(InvalidParameter, stat);
+ /* If both parameters is provided, then fillPath will be ignored. */ + custom = NULL; + stat = GdipCreateCustomLineCap(path, path2, LineCapFlat, 0.0, &custom); + expect(Ok, stat); + ok(custom != NULL, "Custom line cap was not created\n"); + stat = GdipDeleteCustomLineCap(custom); + expect(Ok, stat); + /* valid args */ + custom = NULL; stat = GdipCreateCustomLineCap(NULL, path2, LineCapFlat, 0.0, &custom); expect(Ok, stat); + ok(custom != NULL, "Custom line cap was not created\n"); stat = GdipDeleteCustomLineCap(custom); expect(Ok, stat); - /* it's strange but native returns NotImplemented on stroke == NULL */ + custom = NULL; - stat = GdipCreateCustomLineCap(path, NULL, LineCapFlat, 10.0, &custom); - todo_wine expect(NotImplemented, stat); - todo_wine ok(custom == NULL, "Expected a failure on creation\n"); - if(stat == Ok) GdipDeleteCustomLineCap(custom); + stat = GdipCreateCustomLineCap(path, NULL, LineCapFlat, 0.0, &custom); + expect(Ok, stat); + ok(custom != NULL, "Custom line cap was not created\n"); + stat = GdipDeleteCustomLineCap(custom); + expect(Ok, stat); + + /* Custom line cap position (0, 0) is a place corresponding to the end of line. + * If Custom Line Cap is too big and too far from position (0, 0), + * then NotImplemented will be returned, due to floating point precision limitation. */ + custom = NULL; + stat = GdipCreateCustomLineCap(path3, NULL, LineCapFlat, 10.0, &custom); + expect(Ok, stat); + ok(custom != NULL, "Custom line cap was not created\n"); + stat = GdipDeleteCustomLineCap(custom); + expect(Ok, stat);
+ GdipDeletePath(path3); GdipDeletePath(path2); GdipDeletePath(path); }