Module: wine Branch: master Commit: 9a946476564758faddd04982497ddea87329dc7c URL: https://gitlab.winehq.org/wine/wine/-/commit/9a946476564758faddd04982497ddea...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Sun May 14 22:04:22 2023 +0200
gdiplus: Improve performance of GdipInvertMatrix.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53947
---
dlls/gdiplus/matrix.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-)
diff --git a/dlls/gdiplus/matrix.c b/dlls/gdiplus/matrix.c index d69672bddcf..c5d5d70c648 100644 --- a/dlls/gdiplus/matrix.c +++ b/dlls/gdiplus/matrix.c @@ -182,38 +182,41 @@ GpStatus WINGDIPAPI GdipInvertMatrix(GpMatrix *matrix) { GpMatrix copy; REAL det; - BOOL invertible;
TRACE("(%p)\n", matrix);
if(!matrix) return InvalidParameter;
- GdipIsMatrixInvertible(matrix, &invertible); - if(!invertible) - return InvalidParameter; - /* optimize inverting simple scaling and translation matrices */ if(matrix->matrix[1] == 0 && matrix->matrix[2] == 0) { - matrix->matrix[4] = -matrix->matrix[4] / matrix->matrix[0]; - matrix->matrix[5] = -matrix->matrix[5] / matrix->matrix[3]; - matrix->matrix[0] = 1 / matrix->matrix[0]; - matrix->matrix[3] = 1 / matrix->matrix[3]; - - return Ok; + if (matrix->matrix[0] != 0 && matrix->matrix[3] != 0) + { + matrix->matrix[4] = -matrix->matrix[4] / matrix->matrix[0]; + matrix->matrix[5] = -matrix->matrix[5] / matrix->matrix[3]; + matrix->matrix[0] = 1 / matrix->matrix[0]; + matrix->matrix[3] = 1 / matrix->matrix[3]; + + return Ok; + } + else + return InvalidParameter; } - det = matrix_det(matrix); + if (!(fabs(det) >= 1e-5)) + return InvalidParameter; + + det = 1 / det;
copy = *matrix; /* store result */ - matrix->matrix[0] = copy.matrix[3] / det; - matrix->matrix[1] = -copy.matrix[1] / det; - matrix->matrix[2] = -copy.matrix[2] / det; - matrix->matrix[3] = copy.matrix[0] / det; - matrix->matrix[4] = (copy.matrix[2]*copy.matrix[5]-copy.matrix[3]*copy.matrix[4]) / det; - matrix->matrix[5] = -(copy.matrix[0]*copy.matrix[5]-copy.matrix[1]*copy.matrix[4]) / det; + matrix->matrix[0] = copy.matrix[3] * det; + matrix->matrix[1] = -copy.matrix[1] * det; + matrix->matrix[2] = -copy.matrix[2] * det; + matrix->matrix[3] = copy.matrix[0] * det; + matrix->matrix[4] = (copy.matrix[2]*copy.matrix[5]-copy.matrix[3]*copy.matrix[4]) * det; + matrix->matrix[5] = -(copy.matrix[0]*copy.matrix[5]-copy.matrix[1]*copy.matrix[4]) * det;
return Ok; }