mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 09:55:50 +00:00
gdiplus: Improve performance of GdipScaleMatrix.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53947
This commit is contained in:
parent
96692a2c21
commit
a97911fdfe
|
@ -287,24 +287,27 @@ GpStatus WINGDIPAPI GdipRotateMatrix(GpMatrix *matrix, REAL angle,
|
||||||
GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
|
GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
|
||||||
GpMatrixOrder order)
|
GpMatrixOrder order)
|
||||||
{
|
{
|
||||||
REAL scale[6];
|
|
||||||
|
|
||||||
TRACE("(%p, %.2f, %.2f, %d)\n", matrix, scaleX, scaleY, order);
|
TRACE("(%p, %.2f, %.2f, %d)\n", matrix, scaleX, scaleY, order);
|
||||||
|
|
||||||
if(!matrix)
|
if(!matrix)
|
||||||
return InvalidParameter;
|
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)
|
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)
|
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
|
else
|
||||||
return InvalidParameter;
|
return InvalidParameter;
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,46 @@ static void test_transform(void)
|
||||||
GdipDeleteMatrix(matrix);
|
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)
|
static void test_isinvertible(void)
|
||||||
{
|
{
|
||||||
GpStatus status;
|
GpStatus status;
|
||||||
|
@ -390,6 +430,7 @@ START_TEST(matrix)
|
||||||
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
|
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
|
||||||
|
|
||||||
test_constructor_destructor();
|
test_constructor_destructor();
|
||||||
|
test_scale();
|
||||||
test_transform();
|
test_transform();
|
||||||
test_isinvertible();
|
test_isinvertible();
|
||||||
test_invert();
|
test_invert();
|
||||||
|
|
Loading…
Reference in a new issue