gdiplus: Implement GdipIsVisibleRegionPoint.

This commit is contained in:
Andrew Eikum 2009-08-25 13:39:12 -05:00 committed by Alexandre Julliard
parent 227cbdea9b
commit 32996e0a11
5 changed files with 246 additions and 10 deletions

View file

@ -431,7 +431,7 @@
@ stdcall GdipIsVisiblePointI(ptr long long ptr)
@ stub GdipIsVisibleRect
@ stdcall GdipIsVisibleRectI(ptr long long long long ptr)
@ stub GdipIsVisibleRegionPoint
@ stdcall GdipIsVisibleRegionPoint(ptr long long ptr ptr)
@ stdcall GdipIsVisibleRegionPointI(ptr long long ptr ptr)
@ stub GdipIsVisibleRegionRect
@ stub GdipIsVisibleRegionRectI

View file

@ -4150,15 +4150,6 @@ GpStatus WINGDIPAPI GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT16
return NotImplemented;
}
/*****************************************************************************
* GdipIsVisibleRegionPointI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y, GpGraphics *graphics, BOOL *result)
{
FIXME("(%p %d %d %p %p): stub\n", region, x, y, graphics, result);
return NotImplemented;
}
/*****************************************************************************
* GdipRecordMetafileI [GDIPLUS.@]
*/

View file

@ -1127,6 +1127,45 @@ GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
return Ok;
}
/*****************************************************************************
* GdipIsVisibleRegionPoint [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipIsVisibleRegionPoint(GpRegion* region, REAL x, REAL y, GpGraphics *graphics, BOOL *res)
{
HRGN hrgn;
GpStatus stat;
TRACE("(%p, %.2f, %.2f, %p, %p)\n", region, x, y, graphics, res);
if(!region || !res)
return InvalidParameter;
if((stat = GdipGetRegionHRgn(region, NULL, &hrgn)) != Ok)
return stat;
/* infinite */
if(!hrgn){
*res = TRUE;
return Ok;
}
*res = PtInRegion(hrgn, roundr(x), roundr(y));
DeleteObject(hrgn);
return Ok;
}
/*****************************************************************************
* GdipIsVisibleRegionPointI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipIsVisibleRegionPointI(GpRegion* region, INT x, INT y, GpGraphics *graphics, BOOL *res)
{
TRACE("(%p, %d, %d, %p, %p)\n", region, x, y, graphics, res);
return GdipIsVisibleRegionPoint(region, (REAL)x, (REAL)y, graphics, res);
}
/*****************************************************************************
* GdipSetEmpty [GDIPLUS.@]
*/

View file

@ -1204,6 +1204,209 @@ static void test_getbounds(void)
ReleaseDC(0, hdc);
}
static void test_isvisiblepoint(void)
{
HDC hdc = GetDC(0);
GpGraphics* graphics;
GpRegion* region;
GpPath* path;
GpRectF rectf;
GpStatus status;
BOOL res;
REAL x, y;
status = GdipCreateFromHDC(hdc, &graphics);
expect(Ok, status);
status = GdipCreateRegion(&region);
expect(Ok, status);
/* null parameters */
status = GdipIsVisibleRegionPoint(NULL, 0, 0, graphics, &res);
expect(InvalidParameter, status);
status = GdipIsVisibleRegionPointI(NULL, 0, 0, graphics, &res);
expect(InvalidParameter, status);
status = GdipIsVisibleRegionPoint(region, 0, 0, NULL, &res);
expect(Ok, status);
status = GdipIsVisibleRegionPointI(region, 0, 0, NULL, &res);
expect(Ok, status);
status = GdipIsVisibleRegionPoint(region, 0, 0, graphics, NULL);
expect(InvalidParameter, status);
status = GdipIsVisibleRegionPointI(region, 0, 0, graphics, NULL);
expect(InvalidParameter, status);
/* infinite region */
status = GdipIsInfiniteRegion(region, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Region should be infinite\n");
x = 10;
y = 10;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%d, %d) to be visible\n", (INT)x, (INT)y);
x = -10;
y = -10;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%d, %d) to be visible\n", (INT)x, (INT)y);
/* rectangular region */
rectf.X = 10;
rectf.Y = 20;
rectf.Width = 30;
rectf.Height = 40;
status = GdipCombineRegionRect(region, &rectf, CombineModeReplace);
expect(Ok, status);
x = 0;
y = 0;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
x = 9;
y = 19;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) to be visible\n", x, y);
x = 9.25;
y = 19.25;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) to be visible\n", x, y);
x = 9.5;
y = 19.5;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
x = 9.75;
y = 19.75;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
x = 10;
y = 20;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
x = 25;
y = 40;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%d, %d) to be visible\n", (INT)x, (INT)y);
x = 40;
y = 60;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
/* translate into the center of the rectangle */
status = GdipTranslateWorldTransform(graphics, 25, 40, MatrixOrderAppend);
expect(Ok, status);
/* native ignores the world transform, so treat these as if
* no transform exists */
x = -20;
y = -30;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
x = 0;
y = 0;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
x = 25;
y = 40;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%d, %d) to be visible\n", (INT)x, (INT)y);
/* translate back to origin */
status = GdipTranslateWorldTransform(graphics, -25, -40, MatrixOrderAppend);
expect(Ok, status);
/* region from path */
status = GdipCreatePath(FillModeAlternate, &path);
expect(Ok, status);
status = GdipAddPathEllipse(path, 10, 20, 30, 40);
expect(Ok, status);
status = GdipCombineRegionPath(region, path, CombineModeReplace);
expect(Ok, status);
x = 11;
y = 21;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
x = 25;
y = 40;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%.2f, %.2f) to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == TRUE, "Expected (%d, %d) to be visible\n", (INT)x, (INT)y);
x = 40;
y = 60;
status = GdipIsVisibleRegionPoint(region, x, y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%.2f, %.2f) not to be visible\n", x, y);
status = GdipIsVisibleRegionPointI(region, (INT)x, (INT)y, graphics, &res);
expect(Ok, status);
ok(res == FALSE, "Expected (%d, %d) not to be visible\n", (INT)x, (INT)y);
GdipDeletePath(path);
GdipDeleteRegion(region);
GdipDeleteGraphics(graphics);
ReleaseDC(0, hdc);
}
START_TEST(region)
{
struct GdiplusStartupInput gdiplusStartupInput;
@ -1225,6 +1428,7 @@ START_TEST(region)
test_isequal();
test_translate();
test_getbounds();
test_isvisiblepoint();
GdiplusShutdown(gdiplusToken);
}

View file

@ -565,6 +565,8 @@ GpStatus WINGDIPAPI GdipGetRegionHRgn(GpRegion *, GpGraphics *, HRGN *);
GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *, GpGraphics *, BOOL *);
GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *, GpRegion *, GpGraphics *, BOOL *);
GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *, GpGraphics *, BOOL *);
GpStatus WINGDIPAPI GdipIsVisibleRegionPoint(GpRegion *, REAL, REAL, GpGraphics *, BOOL *);
GpStatus WINGDIPAPI GdipIsVisibleRegionPointI(GpRegion *, INT, INT, GpGraphics *, BOOL *);
GpStatus WINGDIPAPI GdipSetEmpty(GpRegion *);
GpStatus WINGDIPAPI GdipSetInfinite(GpRegion *);
GpStatus WINGDIPAPI GdipTransformRegion(GpRegion *, GpMatrix *);