[2/4] gdiplus: GdipGetTextureTransform with test
Nikolay Sivov
bunglehead at gmail.com
Thu Sep 25 00:08:07 CDT 2008
Changelog:
- implement GdipGetTextureTransform with test
>From e92f3e56eea4afc3d2090468a128a2d2ef60a0c9 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Thu, 25 Sep 2008 08:54:24 +0400
Subject: Implement GdipGetTextureTransform with test
---
dlls/gdiplus/brush.c | 26 ++++++++++++++++++++++
dlls/gdiplus/gdiplus.spec | 2 +-
dlls/gdiplus/gdiplus_private.h | 1 +
dlls/gdiplus/tests/brush.c | 47 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 75 insertions(+), 1 deletions(-)
diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index 8df2a82..3f58db2 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -485,6 +485,7 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
INT n_x, n_y, n_width, n_height, abs_height, stride, image_stride, i, bytespp;
BOOL bm_is_selected;
BYTE *dibits, *buff, *textbits;
+ GpStatus status;
TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %p)\n", image, imageattr, x, y, width, height,
texture);
@@ -577,6 +578,13 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
*texture = GdipAlloc(sizeof(GpTexture));
if (!*texture) return OutOfMemory;
+ if((status = GdipCreateMatrix(&(*texture)->transform)) != Ok){
+ GdipFree(*texture);
+ GdipFree(dibits);
+ GdipFree(buff);
+ return status;
+ }
+
(*texture)->brush.lb.lbStyle = BS_DIBPATTERNPT;
(*texture)->brush.lb.lbColor = DIB_RGB_COLORS;
(*texture)->brush.lb.lbHatch = (ULONG_PTR)buff;
@@ -642,7 +650,10 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
break;
case BrushTypeSolidColor:
case BrushTypeLinearGradient:
+ break;
case BrushTypeTextureFill:
+ GdipDeleteMatrix(((GpTexture*)brush)->transform);
+ break;
default:
break;
}
@@ -872,6 +883,21 @@ GpStatus WINGDIPAPI GdipGetSolidFillColor(GpSolidFill *sf, ARGB *argb)
return Ok;
}
+/******************************************************************************
+ * GdipGetTextureTransform [GDIPLUS.@]
+ */
+GpStatus WINGDIPAPI GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix)
+{
+ TRACE("(%p, %p)\n", brush, matrix);
+
+ if(!brush || !matrix)
+ return InvalidParameter;
+
+ memcpy(matrix, brush->transform, sizeof(GpMatrix));
+
+ return Ok;
+}
+
GpStatus WINGDIPAPI GdipSetLineBlend(GpLineGradient *brush,
GDIPCONST REAL *blend, GDIPCONST REAL* positions, INT count)
{
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 8c59810..4558a6b 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -398,7 +398,7 @@
@ stub GdipGetTextContrast
@ stdcall GdipGetTextRenderingHint(ptr ptr)
@ stub GdipGetTextureImage
-@ stub GdipGetTextureTransform
+@ stdcall GdipGetTextureTransform(ptr ptr)
@ stub GdipGetTextureWrapMode
@ stub GdipGetVisibleClipBounds
@ stub GdipGetVisibleClipBoundsI
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 8a6ddec..0ca2714 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -138,6 +138,7 @@ struct GpLineGradient{
struct GpTexture{
GpBrush brush;
+ GpMatrix *transform;
};
struct GpPath{
diff --git a/dlls/gdiplus/tests/brush.c b/dlls/gdiplus/tests/brush.c
index c9f9826..8d1bd27 100644
--- a/dlls/gdiplus/tests/brush.c
+++ b/dlls/gdiplus/tests/brush.c
@@ -169,6 +169,52 @@ static void test_getgamma(void)
GdipDeleteBrush((GpBrush*)line);
}
+static void test_transform(void)
+{
+ GpStatus status;
+ GpTexture *texture;
+ GpGraphics *graphics = NULL;
+ GpBitmap *bitmap;
+ HDC hdc = GetDC(0);
+ GpMatrix *m;
+ BOOL res;
+
+ status = GdipCreateMatrix2(2.0, 0.0, 0.0, 0.0, 0.0, 0.0, &m);
+ expect(Ok, status);
+
+ status = GdipCreateFromHDC(hdc, &graphics);
+ expect(Ok, status);
+ status = GdipCreateBitmapFromGraphics(1, 1, graphics, &bitmap);
+ expect(Ok, status);
+
+ status = GdipCreateTexture((GpImage*)bitmap, WrapModeTile, &texture);
+ expect(Ok, status);
+
+ /* NULL */
+ status = GdipGetTextureTransform(NULL, NULL);
+ expect(InvalidParameter, status);
+ status = GdipGetTextureTransform(texture, NULL);
+ expect(InvalidParameter, status);
+
+ /* default value - identity matrix */
+ status = GdipGetTextureTransform(texture, m);
+ expect(Ok, status);
+ status = GdipIsMatrixIdentity(m, &res);
+ expect(Ok, status);
+ expect(TRUE, res);
+
+ status = GdipDeleteBrush((GpBrush*)texture);
+ expect(Ok, status);
+
+ status = GdipDeleteMatrix(m);
+ expect(Ok, status);
+ status = GdipDisposeImage((GpImage*)bitmap);
+ expect(Ok, status);
+ status = GdipDeleteGraphics(graphics);
+ expect(Ok, status);
+ ReleaseDC(0, hdc);
+}
+
START_TEST(brush)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -187,6 +233,7 @@ START_TEST(brush)
test_getblend();
test_getbounds();
test_getgamma();
+ test_transform();
GdiplusShutdown(gdiplusToken);
}
--
1.4.4.4
More information about the wine-patches
mailing list