/* NULL args */
stat = GdipCreatePathIter(NULL, NULL);
expect(InvalidParameter, stat);
+ iter = NULL;
stat = GdipCreatePathIter(&iter, NULL);
- expect(InvalidParameter, stat);
+ expect(Ok, stat);
+ ok(iter != NULL, "Expected iterator to be created\n");
+ GdipDeletePathIter(iter);
stat = GdipCreatePathIter(NULL, path);
expect(InvalidParameter, stat);
stat = GdipDeletePathIter(NULL);
GdipDeletePath(path);
}
+static void test_nextmarker(void)
+{
+ GpPath *path;
+ GpPathIterator *iter;
+ GpStatus stat;
+ INT start, end;
+ INT result;
+
+ /* NULL args
+ BOOL out argument is local in wrapper class method,
+ so it always has not-NULL address */
+ stat = GdipPathIterNextMarker(NULL, &result, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextMarker(NULL, &result, &start, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextMarker(NULL, &result, NULL, &end);
+ expect(InvalidParameter, stat);
+
+ GdipCreatePath(FillModeAlternate, &path);
+ GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0);
+
+ /* no markers */
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect(0, start);
+ expect(3, end);
+ expect(4, result);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ /* start/end remain unchanged */
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(0, result);
+ GdipDeletePathIter(iter);
+
+ /* one marker */
+ GdipSetPathMarker(path);
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect(0, start);
+ expect(3, end);
+ expect(4, result);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(0, result);
+ GdipDeletePathIter(iter);
+
+ /* two markers */
+ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0);
+ GdipSetPathMarker(path);
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect(0, start);
+ expect(3, end);
+ expect(4, result);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect(4, start);
+ expect(5, end);
+ expect(2, result);
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+ expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(0, result);
+ GdipDeletePathIter(iter);
+
+ GdipDeletePath(path);
+}
+
+static void test_nextmarkerpath(void)
+{
+ GpPath *path, *retpath;
+ GpPathIterator *iter;
+ GpStatus stat;
+ INT result, count;
+
+ GdipCreatePath(FillModeAlternate, &path);
+
+ /* NULL */
+ stat = GdipPathIterNextMarkerPath(NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextMarkerPath(NULL, &result, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextMarkerPath(NULL, &result, path);
+ expect(InvalidParameter, stat);
+
+ GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0);
+
+ /* no markers */
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(4, result);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(4, count);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(0, result);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(4, count);
+ GdipDeletePathIter(iter);
+ GdipDeletePath(retpath);
+
+ /* one marker */
+ GdipSetPathMarker(path);
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(4, result);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(4, count);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(0, result);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(4, count);
+ GdipDeletePathIter(iter);
+ GdipDeletePath(retpath);
+
+ /* two markers */
+ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0);
+ GdipSetPathMarker(path);
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(4, result);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(2, result);
+ result = -1;
+ stat = GdipPathIterNextMarkerPath(iter, &result, retpath);
+ expect(Ok, stat);
+ expect(0, result);
+ GdipDeletePathIter(iter);
+ GdipDeletePath(retpath);
+
+ GdipDeletePath(path);
+}
+
+static void test_getsubpathcount(void)
+{
+ GpPath *path;
+ GpPathIterator *iter;
+ GpStatus stat;
+ INT count;
+
+ /* NULL args */
+ stat = GdipPathIterGetSubpathCount(NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterGetSubpathCount(NULL, &count);
+ expect(InvalidParameter, stat);
+
+ GdipCreatePath(FillModeAlternate, &path);
+
+ /* empty path */
+ GdipCreatePathIter(&iter, path);
+ stat = GdipPathIterGetSubpathCount(iter, &count);
+ expect(Ok, stat);
+ expect(0, count);
+ GdipDeletePathIter(iter);
+
+ GdipAddPathLine(path, 5.0, 5.0, 100.0, 50.0);
+
+ /* open figure */
+ GdipCreatePathIter(&iter, path);
+ stat = GdipPathIterGetSubpathCount(iter, &count);
+ expect(Ok, stat);
+ expect(1, count);
+ GdipDeletePathIter(iter);
+
+ /* manually start new figure */
+ GdipStartPathFigure(path);
+ GdipAddPathLine(path, 50.0, 50.0, 110.0, 40.0);
+ GdipCreatePathIter(&iter, path);
+ stat = GdipPathIterGetSubpathCount(iter, &count);
+ expect(Ok, stat);
+ expect(2, count);
+ GdipDeletePathIter(iter);
+
+ GdipDeletePath(path);
+}
+
+static void test_isvalid(void)
+{
+ GpPath *path;
+ GpPathIterator *iter;
+ GpStatus stat;
+ BOOL isvalid;
+ INT start, end, result;
+
+ GdipCreatePath(FillModeAlternate, &path);
+
+ /* NULL args */
+ GdipCreatePathIter(&iter, path);
+ stat = GdipPathIterIsValid(NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterIsValid(iter, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterIsValid(NULL, &isvalid);
+ expect(InvalidParameter, stat);
+ GdipDeletePathIter(iter);
+
+ /* on empty path */
+ GdipCreatePathIter(&iter, path);
+ isvalid = FALSE;
+ stat = GdipPathIterIsValid(iter, &isvalid);
+ expect(Ok, stat);
+ expect(TRUE, isvalid);
+ GdipDeletePathIter(iter);
+
+ /* no markers */
+ GdipAddPathLine(path, 50.0, 50.0, 110.0, 40.0);
+ GdipCreatePathIter(&iter, path);
+ GdipPathIterNextMarker(iter, &result, &start, &end);
+ isvalid = FALSE;
+ stat = GdipPathIterIsValid(iter, &isvalid);
+ expect(Ok, stat);
+ expect(TRUE, isvalid);
+ GdipDeletePathIter(iter);
+
+ GdipDeletePath(path);
+}
+
+static void test_nextsubpathpath(void)
+{
+ GpPath *path, *retpath;
+ GpPathIterator *iter;
+ GpStatus stat;
+ BOOL closed;
+ INT count, result;
+
+ GdipCreatePath(FillModeAlternate, &path);
+
+ /* NULL args */
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ stat = GdipPathIterNextSubpathPath(NULL, NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextSubpathPath(iter, NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextSubpathPath(NULL, &result, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextSubpathPath(iter, &result, NULL, &closed);
+ expect(Ok, stat);
+ stat = GdipPathIterNextSubpathPath(iter, NULL, NULL, &closed);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextSubpathPath(iter, NULL, retpath, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, NULL);
+ expect(InvalidParameter, stat);
+ GdipDeletePathIter(iter);
+ GdipDeletePath(retpath);
+
+ /* empty path */
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ result = -2;
+ closed = TRUE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(0, result);
+ expect(TRUE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(0, count);
+ GdipDeletePathIter(iter);
+ GdipDeletePath(retpath);
+
+ /* open figure */
+ GdipAddPathLine(path, 5.0, 5.0, 100.0, 50.0);
+
+ GdipCreatePath(FillModeAlternate, &retpath);
+ GdipCreatePathIter(&iter, path);
+ result = -2;
+ closed = TRUE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(2, result);
+ expect(FALSE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(2, count);
+ /* subsequent call */
+ result = -2;
+ closed = TRUE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(0, result);
+ expect(TRUE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(2, count);
+ GdipDeletePathIter(iter);
+
+ /* closed figure, check does it extend retpath or reset it */
+ GdipAddPathLine(retpath, 50.0, 55.0, 200.0, 150.0);
+
+ GdipClosePathFigure(path);
+ GdipAddPathLine(path, 50.0, 55.0, 200.0, 150.0);
+ GdipClosePathFigure(path);
+
+ GdipCreatePathIter(&iter, path);
+ result = -2;
+ closed = FALSE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(2, result);
+ expect(TRUE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(2, count);
+ /* subsequent call */
+ result = -2;
+ closed = FALSE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(2, result);
+ expect(TRUE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(2, count);
+ result = -2;
+ closed = FALSE;
+ stat = GdipPathIterNextSubpathPath(iter, &result, retpath, &closed);
+ expect(Ok, stat);
+ expect(0, result);
+ expect(TRUE, closed);
+ count = -1;
+ GdipGetPointCount(retpath, &count);
+ expect(2, count);
+ GdipDeletePathIter(iter);
+
+ GdipDeletePath(retpath);
+ GdipDeletePath(path);
+}
+
+static void test_nextsubpath(void)
+{
+ GpPath *path;
+ GpPathIterator *iter;
+ GpStatus stat;
+ INT start, end, result;
+ BOOL closed;
+
+ /* empty path */
+ GdipCreatePath(FillModeAlternate, &path);
+ GdipCreatePathIter(&iter, path);
+
+ result = -2;
+ closed = TRUE;
+ stat = GdipPathIterNextSubpath(iter, &result, &start, &end, &closed);
+ expect(Ok, stat);
+ expect(0, result);
+ expect(TRUE, closed);
+
+ GdipDeletePathIter(iter);
+ GdipDeletePath(path);
+}
+
+static void test_nextpathtype(void)
+{
+ GpPath *path;
+ GpPathIterator *iter;
+ GpStatus stat;
+ INT start, end, result;
+ BYTE type;
+
+ GdipCreatePath(FillModeAlternate, &path);
+ GdipCreatePathIter(&iter, path);
+
+ /* NULL arguments */
+ stat = GdipPathIterNextPathType(NULL, NULL, NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, NULL, NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, &result, NULL, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, NULL, &type, NULL, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, NULL, NULL, &start, &end);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, NULL, &type, &start, &end);
+ expect(InvalidParameter, stat);
+ stat = GdipPathIterNextPathType(iter, &result, &type, NULL, NULL);
+ expect(InvalidParameter, stat);
+
+ /* empty path */
+ start = end = result = (INT)0xdeadbeef;
+ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end);
+ todo_wine expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ todo_wine expect(0, result);
+ GdipDeletePathIter(iter);
+
+ /* single figure */
+ GdipAddPathLine(path, 0.0, 0.0, 10.0, 30.0);
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ type = 255; /* out of range */
+ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end);
+ todo_wine expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(255, type);
+ todo_wine expect(0, result);
+ GdipDeletePathIter(iter);
+
+ GdipAddPathEllipse(path, 0.0, 0.0, 35.0, 70.0);
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ type = 255; /* out of range */
+ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end);
+ todo_wine expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(255, type);
+ todo_wine expect(0, result);
+ GdipDeletePathIter(iter);
+
+ /* closed */
+ GdipClosePathFigure(path);
+ GdipCreatePathIter(&iter, path);
+ start = end = result = (INT)0xdeadbeef;
+ type = 255; /* out of range */
+ stat = GdipPathIterNextPathType(iter, &result, &type, &start, &end);
+ todo_wine expect(Ok, stat);
+ expect((INT)0xdeadbeef, start);
+ expect((INT)0xdeadbeef, end);
+ expect(255, type);
+ todo_wine expect(0, result);
+ GdipDeletePathIter(iter);
+
+ GdipDeletePath(path);
+}
+
START_TEST(pathiterator)
{
struct GdiplusStartupInput gdiplusStartupInput;
test_constructor_destructor();
test_hascurve();
+ test_nextmarker();
+ test_nextmarkerpath();
+ test_getsubpathcount();
+ test_isvalid();
+ test_nextsubpathpath();
+ test_nextsubpath();
+ test_nextpathtype();
GdiplusShutdown(gdiplusToken);
}