mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 11:36:25 +00:00
sw_engine raster: checking zero division while inverting the transform matrix
In case the user has provided the transformation matrix, it is possible that the inverse matrix does not exist.
This commit is contained in:
parent
46f8945028
commit
6925f6c272
1 changed files with 8 additions and 2 deletions
|
@ -46,13 +46,15 @@ static uint32_t _argbJoin(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
|||
}
|
||||
|
||||
|
||||
static void _inverse(const Matrix* transform, Matrix* invM)
|
||||
static bool _inverse(const Matrix* transform, Matrix* invM)
|
||||
{
|
||||
// computes the inverse of a matrix m
|
||||
auto det = transform->e11 * (transform->e22 * transform->e33 - transform->e32 * transform->e23) -
|
||||
transform->e12 * (transform->e21 * transform->e33 - transform->e23 * transform->e31) +
|
||||
transform->e13 * (transform->e21 * transform->e32 - transform->e22 * transform->e31);
|
||||
|
||||
if (fabsf(det) < FLT_EPSILON) return false;
|
||||
|
||||
auto invDet = 1 / det;
|
||||
|
||||
invM->e11 = (transform->e22 * transform->e33 - transform->e32 * transform->e23) * invDet;
|
||||
|
@ -64,6 +66,8 @@ static void _inverse(const Matrix* transform, Matrix* invM)
|
|||
invM->e31 = (transform->e21 * transform->e32 - transform->e31 * transform->e22) * invDet;
|
||||
invM->e32 = (transform->e31 * transform->e12 - transform->e11 * transform->e32) * invDet;
|
||||
invM->e33 = (transform->e11 * transform->e22 - transform->e21 * transform->e12) * invDet;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -832,7 +836,9 @@ bool rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, Sw
|
|||
{
|
||||
Matrix invTransform;
|
||||
|
||||
if (transform) _inverse(transform, &invTransform);
|
||||
if (transform) {
|
||||
if (!_inverse(transform, &invTransform)) return false;
|
||||
}
|
||||
else invTransform = {1, 0, 0, 0, 1, 0, 0, 0, 1};
|
||||
|
||||
auto translucent = _translucent(surface, opacity);
|
||||
|
|
Loading…
Add table
Reference in a new issue