1
0
mirror of https://github.com/wine-mirror/wine synced 2024-07-08 03:45:57 +00:00

gdiplus: Improve performance of GdipScaleMatrix.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53947
This commit is contained in:
Bartosz Kosiorek 2022-12-01 01:22:07 +01:00 committed by Alexandre Julliard
parent 96692a2c21
commit a97911fdfe
2 changed files with 55 additions and 11 deletions

View File

@ -287,24 +287,27 @@ GpStatus WINGDIPAPI GdipRotateMatrix(GpMatrix *matrix, REAL angle,
GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
GpMatrixOrder order)
{
REAL scale[6];
TRACE("(%p, %.2f, %.2f, %d)\n", matrix, scaleX, scaleY, order);
if(!matrix)
return InvalidParameter;
scale[0] = scaleX;
scale[1] = 0.0;
scale[2] = 0.0;
scale[3] = scaleY;
scale[4] = 0.0;
scale[5] = 0.0;
if(order == MatrixOrderAppend)
matrix_multiply(matrix->matrix, scale, matrix->matrix);
{
matrix->matrix[0] *= scaleX;
matrix->matrix[1] *= scaleY;
matrix->matrix[2] *= scaleX;
matrix->matrix[3] *= scaleY;
matrix->matrix[4] *= scaleX;
matrix->matrix[5] *= scaleY;
}
else if (order == MatrixOrderPrepend)
matrix_multiply(scale, matrix->matrix, matrix->matrix);
{
matrix->matrix[0] *= scaleX;
matrix->matrix[1] *= scaleX;
matrix->matrix[2] *= scaleY;
matrix->matrix[3] *= scaleY;
}
else
return InvalidParameter;

View File

@ -110,6 +110,46 @@ static void test_transform(void)
GdipDeleteMatrix(matrix);
}
static void test_scale(void)
{
GpStatus status;
GpMatrix *matrix = NULL;
REAL elems[6];
int i;
static const REAL expected_elem[] = {3.0, -4.0, 90.0, 80.0, -1500.0, 1200.0};
static const REAL expected_elem2[] = {3.0, -6.0, 60.0, 80.0, -500.0, 600.0};
GdipCreateMatrix2(1.0, -2.0, 30.0, 40.0, -500.0, 600.0, &matrix);
status = GdipScaleMatrix(NULL, 3, 2, MatrixOrderAppend);
expect(InvalidParameter, status);
status = GdipScaleMatrix(matrix, 3, 2, MatrixOrderAppend);
expect(Ok, status);
status = GdipGetMatrixElements(matrix, elems);
expect(Ok, status);
GdipDeleteMatrix(matrix);
for(i = 0; i < 6; i++)
ok(expected_elem[i] == elems[i], "Expected #%d to be (%.1f) but got (%.1f)\n", i,
expected_elem[i], elems[i]);
GdipCreateMatrix2(1.0, -2.0, 30.0, 40.0, -500.0, 600.0, &matrix);
status = GdipScaleMatrix(matrix, 3, 2, MatrixOrderPrepend);
expect(Ok, status);
status = GdipGetMatrixElements(matrix, elems);
expect(Ok, status);
GdipDeleteMatrix(matrix);
for(i = 0; i < 6; i++)
ok(expected_elem2[i] == elems[i], "Expected #%d to be (%.1f) but got (%.1f)\n", i,
expected_elem2[i], elems[i]);
}
static void test_isinvertible(void)
{
GpStatus status;
@ -390,6 +430,7 @@ START_TEST(matrix)
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
test_constructor_destructor();
test_scale();
test_transform();
test_isinvertible();
test_invert();