Commit b5046c28 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

gdiplus: Added GdipAddPathRectangle with tests.

parent 22c6e576
......@@ -25,8 +25,8 @@
@ stub GdipAddPathPieI
@ stub GdipAddPathPolygon
@ stub GdipAddPathPolygonI
@ stub GdipAddPathRectangle
@ stub GdipAddPathRectangleI
@ stdcall GdipAddPathRectangle(ptr long long long long)
@ stdcall GdipAddPathRectangleI(ptr long long long long)
@ stub GdipAddPathRectangles
@ stub GdipAddPathRectanglesI
@ stub GdipAddPathString
......
......@@ -708,3 +708,53 @@ GpStatus WINGDIPAPI GdipTransformPath(GpPath *path, GpMatrix *matrix)
return GdipTransformMatrixPoints(matrix, path->pathdata.Points,
path->pathdata.Count);
}
GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath *path, REAL x, REAL y,
REAL width, REAL height)
{
GpPath *backup;
GpPointF ptf[2];
GpStatus retstat;
BOOL old_new;
if(!path || width < 0.0 || height < 0.0)
return InvalidParameter;
/* make a backup copy of path data */
if((retstat = GdipClonePath(path, &backup)) != Ok)
return retstat;
/* rectangle should start as new path */
old_new = path->newfigure;
path->newfigure = TRUE;
if((retstat = GdipAddPathLine(path,x,y,x+width,y)) != Ok){
path->newfigure = old_new;
goto fail;
}
ptf[0].X = x+width;
ptf[0].Y = y+height;
ptf[1].X = x;
ptf[1].Y = y+height;
if((retstat = GdipAddPathLine2(path,(GDIPCONST GpPointF*)&ptf,2)) != Ok) goto fail;
path->pathdata.Types[path->pathdata.Count-1] |= PathPointTypeCloseSubpath;
/* free backup */
GdipDeletePath(backup);
return Ok;
fail:
/* reverting */
GdipDeletePath(path);
GdipClonePath(backup, &path);
GdipDeletePath(backup);
return retstat;
}
GpStatus WINGDIPAPI GdipAddPathRectangleI(GpPath *path, INT x, INT y,
INT width, INT height)
{
return GdipAddPathRectangle(path,(REAL)x,(REAL)y,(REAL)width,(REAL)height);
}
......@@ -545,6 +545,34 @@ static void test_linei(void)
GdipDeletePath(path);
}
static path_test_t rect_path[] = {
{5.0, 5.0, PathPointTypeStart, 0, 0}, /*0*/
{105.0, 5.0, PathPointTypeLine, 0, 0}, /*1*/
{105.0, 55.0, PathPointTypeLine, 0, 0}, /*2*/
{5.0, 55.0, PathPointTypeLine | PathPointTypeCloseSubpath, 0, 0}, /*3*/
{100.0, 50.0, PathPointTypeStart, 0, 0}, /*4*/
{220.0, 50.0, PathPointTypeLine, 0, 0}, /*5*/
{220.0, 80.0, PathPointTypeLine, 0, 0}, /*6*/
{100.0, 80.0, PathPointTypeLine | PathPointTypeCloseSubpath, 0, 0} /*7*/
};
static void test_rect(void)
{
GpStatus status;
GpPath *path;
GdipCreatePath(FillModeAlternate, &path);
status = GdipAddPathRectangle(path, 5.0, 5.0, 100.0, 50.0);
expect(Ok, status);
status = GdipAddPathRectangle(path, 100.0, 50.0, 120.0, 30.0);
expect(Ok, status);
ok_path(path, rect_path, sizeof(rect_path)/sizeof(path_test_t), FALSE);
GdipDeletePath(path);
}
START_TEST(graphicspath)
{
struct GdiplusStartupInput gdiplusStartupInput;
......@@ -564,6 +592,7 @@ START_TEST(graphicspath)
test_pathpath();
test_ellipse();
test_linei();
test_rect();
GdiplusShutdown(gdiplusToken);
}
......@@ -213,6 +213,8 @@ GpStatus WINGDIPAPI GdipAddPathLine2(GpPath*,GDIPCONST GpPointF*,INT);
GpStatus WINGDIPAPI GdipAddPathLine2I(GpPath*,GDIPCONST GpPoint*,INT);
GpStatus WINGDIPAPI GdipAddPathLineI(GpPath*,INT,INT,INT,INT);
GpStatus WINGDIPAPI GdipAddPathPath(GpPath*,GDIPCONST GpPath*,BOOL);
GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath*,REAL,REAL,REAL,REAL);
GpStatus WINGDIPAPI GdipAddPathRectangleI(GpPath*,INT,INT,INT,INT);
GpStatus WINGDIPAPI GdipClonePath(GpPath*,GpPath**);
GpStatus WINGDIPAPI GdipClosePathFigure(GpPath*);
GpStatus WINGDIPAPI GdipClosePathFigures(GpPath*);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment