sw_engine raster: code refactoring

keep it neat & clean code with descriptions.
This commit is contained in:
Hermet Park 2021-11-10 18:24:45 +09:00
parent d73ecc5524
commit 205e463160

View file

@ -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);
} }
} }
} }