Module: wine Branch: master Commit: 5887e661b7a3ead57e3eb7dd31b0068a9c3c8cd9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5887e661b7a3ead57e3eb7dd31...
Author: Nikolay Sivov bunglehead@gmail.com Date: Mon Aug 4 21:45:05 2008 +0400
gdiplus: Implemented GdipReversePath with tests.
---
dlls/gdiplus/gdiplus.spec | 2 +- dlls/gdiplus/graphicspath.c | 54 +++++++++++++++++++++++++++++++++++++ dlls/gdiplus/tests/graphicspath.c | 44 ++++++++++++++++++++++++++++++ include/gdiplusflat.h | 1 + 4 files changed, 100 insertions(+), 1 deletions(-)
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 18e7eeb..add7b0e 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -484,7 +484,7 @@ @ stub GdipResetTextureTransform @ stub GdipResetWorldTransform @ stdcall GdipRestoreGraphics(ptr long) -@ stub GdipReversePath +@ stdcall GdipReversePath(ptr) @ stub GdipRotateLineTransform @ stdcall GdipRotateMatrix(ptr long long) @ stub GdipRotatePathGradientTransform diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 136afe7..c5925b6 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -927,6 +927,60 @@ GpStatus WINGDIPAPI GdipGetPointCount(GpPath *path, INT *count) return Ok; }
+GpStatus WINGDIPAPI GdipReversePath(GpPath* path) +{ + INT i, count; + INT start = 0; /* position in reversed path */ + GpPathData revpath; + + if(!path) + return InvalidParameter; + + count = path->pathdata.Count; + + if(count == 0) return Ok; + + revpath.Points = GdipAlloc(sizeof(GpPointF)*count); + revpath.Types = GdipAlloc(sizeof(BYTE)*count); + revpath.Count = count; + if(!revpath.Points || !revpath.Types){ + GdipFree(revpath.Points); + GdipFree(revpath.Types); + return OutOfMemory; + } + + for(i = 0; i < count; i++){ + + /* find next start point */ + if(path->pathdata.Types[count-i-1] == PathPointTypeStart){ + INT j; + for(j = start; j <= i; j++){ + revpath.Points[j] = path->pathdata.Points[count-j-1]; + revpath.Types[j] = path->pathdata.Types[count-j-1]; + } + /* mark start point */ + revpath.Types[start] = PathPointTypeStart; + /* set 'figure' endpoint type */ + if(i-start > 1){ + revpath.Types[i] = path->pathdata.Types[count-start-1] & ~PathPointTypePathTypeMask; + revpath.Types[i] |= revpath.Types[i-1]; + } + else + revpath.Types[i] = path->pathdata.Types[start]; + + start = i+1; + } + } + + memcpy(path->pathdata.Points, revpath.Points, sizeof(GpPointF)*count); + memcpy(path->pathdata.Types, revpath.Types, sizeof(BYTE)*count); + + GdipFree(revpath.Points); + GdipFree(revpath.Types); + + return Ok; +} + GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen, GpGraphics *graphics, BOOL *result) { diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index eb7e2de..97e92fa 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -813,6 +813,49 @@ static void test_addclosedcurve(void) GdipDeletePath(path); }
+static path_test_t reverse_path[] = { + {0.0, 20.0, PathPointTypeStart, 0, 0}, /*0*/ + {25.0, 25.0, PathPointTypeLine, 0, 0}, /*1*/ + {0.0, 30.0, PathPointTypeLine, 0, 0}, /*2*/ + {15.0, 35.0, PathPointTypeStart, 0, 0}, /*3*/ + {0.0, 40.0, PathPointTypeLine, 0, 0}, /*4*/ + {5.0, 45.0, PathPointTypeLine, 0, 0}, /*5*/ + {0.0, 50.0, PathPointTypeLine | PathPointTypeCloseSubpath, 0, 0} /*6*/ + }; + +static void test_reverse(void) +{ + GpStatus status; + GpPath *path; + GpPointF pts[7]; + INT i; + + for(i = 0; i < 7; i++){ + pts[i].X = i * 5.0 * (REAL)(i % 2); + pts[i].Y = 50.0 - i * 5.0; + } + + GdipCreatePath(FillModeAlternate, &path); + + /* NULL argument */ + status = GdipReversePath(NULL); + expect(InvalidParameter, status); + + /* empty path */ + status = GdipReversePath(path); + expect(Ok, status); + + GdipAddPathLine2(path, pts, 4); + GdipClosePathFigure(path); + GdipAddPathLine2(path, &(pts[4]), 3); + + status = GdipReversePath(path); + expect(Ok, status); + ok_path(path, reverse_path, sizeof(reverse_path)/sizeof(path_test_t), FALSE); + + GdipDeletePath(path); +} + START_TEST(graphicspath) { struct GdiplusStartupInput gdiplusStartupInput; @@ -838,6 +881,7 @@ START_TEST(graphicspath) test_lastpoint(); test_addcurve(); test_addclosedcurve(); + test_reverse();
GdiplusShutdown(gdiplusToken); } diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index dc938ac..4203e16 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -291,6 +291,7 @@ GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPointI(GpPath*,INT,INT,GpPen*, GpStatus WINGDIPAPI GdipIsVisiblePathPoint(GpPath*,REAL,REAL,GpGraphics*,BOOL*); GpStatus WINGDIPAPI GdipIsVisiblePathPointI(GpPath*,INT,INT,GpGraphics*,BOOL*); GpStatus WINGDIPAPI GdipResetPath(GpPath*); +GpStatus WINGDIPAPI GdipReversePath(GpPath*); GpStatus WINGDIPAPI GdipSetPathFillMode(GpPath*,GpFillMode); GpStatus WINGDIPAPI GdipStartPathFigure(GpPath*); GpStatus WINGDIPAPI GdipTransformPath(GpPath*,GpMatrix*);