mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-15 20:44:52 +00:00
sw_engine raster: code refactoring
keep it neat & clean code with descriptions.
This commit is contained in:
parent
d73ecc5524
commit
205e463160
1 changed files with 23 additions and 19 deletions
|
@ -1337,53 +1337,57 @@ bool rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, co
|
||||||
auto scale = 1.0f;
|
auto scale = 1.0f;
|
||||||
bool transformed = false;
|
bool transformed = false;
|
||||||
|
|
||||||
|
//Figure out the scale factor by transform matrix
|
||||||
if (transform) {
|
if (transform) {
|
||||||
if (!mathInverse(transform, &itransform)) return false;
|
if (!mathInverse(transform, &itransform)) return false;
|
||||||
scale = sqrtf((transform->e11 * transform->e11) + (transform->e21 * transform->e21));
|
scale = sqrtf((transform->e11 * transform->e11) + (transform->e21 * transform->e21));
|
||||||
auto scaleY = sqrtf((transform->e22 * transform->e22) + (transform->e12 * transform->e12));
|
auto scaleY = sqrtf((transform->e22 * transform->e22) + (transform->e12 * transform->e12));
|
||||||
//TODO:If the x and y axis scale is different, a separate algorithm for each axis should be applied.
|
//TODO:If the x and y axis scale is different, a separate interpolation algorithm for each axis should be applied.
|
||||||
if (fabsf(scale - scaleY) > FLT_EPSILON) scale = 1.0f;
|
if (fabsf(scale - scaleY) > FLT_EPSILON) scale = 1.0f;
|
||||||
else transformed = true;
|
if (!mathIdentity(transform)) transformed = true;
|
||||||
|
//TODO: Figure out the scale factor by the image size & drawing region
|
||||||
} else {
|
} else {
|
||||||
mathIdentity(&itransform);
|
mathIdentity(&itransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto translucent = _translucent(surface, opacity);
|
auto translucent = _translucent(surface, opacity);
|
||||||
auto downScalingFactor = 0.5f;
|
auto downScaleTolerance = 0.5f;
|
||||||
|
|
||||||
|
//Clipped Image
|
||||||
if (image->rle) {
|
if (image->rle) {
|
||||||
//Fast track
|
if (transformed) {
|
||||||
if (!transformed) {
|
|
||||||
//OPTIMIZE ME: Support non transformed image. Only shifted image can use these routines.
|
|
||||||
if (translucent) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity);
|
|
||||||
return _rasterImageRle(surface, image->rle, image->data, image->w, image->h);
|
|
||||||
} else {
|
|
||||||
if (translucent) {
|
if (translucent) {
|
||||||
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform);
|
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform);
|
||||||
else if (scale < downScalingFactor) return _rasterTranslucentDownScaleImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform, scale);
|
else if (scale < downScaleTolerance) return _rasterTranslucentDownScaleImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform, scale);
|
||||||
else return _rasterTranslucentUpScaleImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform);
|
else return _rasterTranslucentUpScaleImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &itransform);
|
||||||
} else {
|
} else {
|
||||||
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterImageRle(surface, image->rle, image->data, image->w, image->h, &itransform);
|
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterImageRle(surface, image->rle, image->data, image->w, image->h, &itransform);
|
||||||
else if (scale < downScalingFactor) return _rasterDownScaleImageRle(surface, image->rle, image->data, image->w, image->h, &itransform, scale);
|
else if (scale < downScaleTolerance) return _rasterDownScaleImageRle(surface, image->rle, image->data, image->w, image->h, &itransform, scale);
|
||||||
else return _rasterUpScaleImageRle(surface, image->rle, image->data, image->w, image->h, &itransform);
|
else return _rasterUpScaleImageRle(surface, image->rle, image->data, image->w, image->h, &itransform);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//Fast track
|
//Fast track
|
||||||
if (!transformed) {
|
|
||||||
//OPTIMIZE ME: Support non transformed image. Only shifted image can use these routines.
|
//OPTIMIZE ME: Support non transformed image. Only shifted image can use these routines.
|
||||||
if (translucent) return _rasterTranslucentImage(surface, image->data, image->w, image->h, opacity, bbox);
|
|
||||||
return _rasterImage(surface, image->data, image->w, image->h, bbox);
|
|
||||||
} else {
|
} else {
|
||||||
|
if (translucent) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity);
|
||||||
|
return _rasterImageRle(surface, image->rle, image->data, image->w, image->h);
|
||||||
|
}
|
||||||
|
//Whole Image
|
||||||
|
} else {
|
||||||
|
if (transformed) {
|
||||||
if (translucent) {
|
if (translucent) {
|
||||||
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterTranslucentImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform);
|
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterTranslucentImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform);
|
||||||
else if (scale < downScalingFactor) return _rasterTranslucentDownScaleImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform, scale);
|
else if (scale < downScaleTolerance) return _rasterTranslucentDownScaleImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform, scale);
|
||||||
else return _rasterTranslucentUpScaleImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform);
|
else return _rasterTranslucentUpScaleImage(surface, image->data, image->w, image->h, opacity, bbox, &itransform);
|
||||||
} else {
|
} else {
|
||||||
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterImage(surface, image->data, image->w, image->h, bbox, &itransform);
|
if (fabsf(scale - 1.0f) <= FLT_EPSILON) return _rasterImage(surface, image->data, image->w, image->h, bbox, &itransform);
|
||||||
else if (scale < downScalingFactor) return _rasterDownScaleImage(surface, image->data, image->w, image->h, bbox, &itransform, scale);
|
else if (scale < downScaleTolerance) return _rasterDownScaleImage(surface, image->data, image->w, image->h, bbox, &itransform, scale);
|
||||||
else return _rasterUpScaleImage(surface, image->data, image->w, image->h, bbox, &itransform);
|
else return _rasterUpScaleImage(surface, image->data, image->w, image->h, bbox, &itransform);
|
||||||
}
|
}
|
||||||
|
//Fast track
|
||||||
|
} else {
|
||||||
|
//OPTIMIZE ME: Support non transformed image. Only shifted image can use these routines.
|
||||||
|
if (translucent) return _rasterTranslucentImage(surface, image->data, image->w, image->h, opacity, bbox);
|
||||||
|
return _rasterImage(surface, image->data, image->w, image->h, bbox);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue