mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-15 20:44:52 +00:00
sw_engine raster: adding rastering functions for image without transformation
Added rastering functions for the image (transparent and not) for the fast track option - identity transform.
This commit is contained in:
parent
e154bfb264
commit
46f8945028
1 changed files with 34 additions and 6 deletions
|
@ -321,6 +321,22 @@ static bool _rasterSolidRle(SwSurface* surface, SwRleData* rle, uint32_t color)
|
||||||
/* Image */
|
/* Image */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
|
static bool _rasterTranslucentImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h, uint32_t opacity)
|
||||||
|
{
|
||||||
|
auto span = rle->spans;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < rle->size; ++i, ++span) {
|
||||||
|
auto dst = &surface->buffer[span->y * surface->stride + span->x];
|
||||||
|
auto src = img + span->x + span->y * w; //TODO: need to use image's stride
|
||||||
|
for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src) {
|
||||||
|
auto alpha = ALPHA_MULTIPLY(span->coverage, opacity);
|
||||||
|
*src = ALPHA_BLEND(*src, alpha);
|
||||||
|
*dst = *src + ALPHA_BLEND(*dst, 255 - surface->blender.alpha(*src));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool _rasterTranslucentImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h, uint32_t opacity, const Matrix* invTransform)
|
static bool _rasterTranslucentImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h, uint32_t opacity, const Matrix* invTransform)
|
||||||
{
|
{
|
||||||
|
@ -344,6 +360,22 @@ static bool _rasterTranslucentImageRle(SwSurface* surface, SwRleData* rle, uint3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool _rasterImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h)
|
||||||
|
{
|
||||||
|
auto span = rle->spans;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < rle->size; ++i, ++span) {
|
||||||
|
auto dst = &surface->buffer[span->y * surface->stride + span->x];
|
||||||
|
auto src = img + span->x + span->y * w; //TODO: need to use image's stride
|
||||||
|
for (uint32_t x = 0; x < span->len; ++x, ++dst, ++src) {
|
||||||
|
*src = ALPHA_BLEND(*src, span->coverage);
|
||||||
|
*dst = *src + ALPHA_BLEND(*dst, 255 - surface->blender.alpha(*src));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool _rasterImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h, const Matrix* invTransform)
|
static bool _rasterImageRle(SwSurface* surface, SwRleData* rle, uint32_t *img, uint32_t w, uint32_t h, const Matrix* invTransform)
|
||||||
{
|
{
|
||||||
auto span = rle->spans;
|
auto span = rle->spans;
|
||||||
|
@ -809,12 +841,8 @@ bool rasterImage(SwSurface* surface, SwImage* image, const Matrix* transform, Sw
|
||||||
//Fast track
|
//Fast track
|
||||||
if (_identify(transform)) {
|
if (_identify(transform)) {
|
||||||
//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.
|
||||||
#ifdef THORVG_LOG_ENABLED
|
if (translucent) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity);
|
||||||
printf("SW_ENGINE: implementation is missing!\n");
|
return _rasterImageRle(surface, image->rle, image->data, image->w, image->h);
|
||||||
#endif
|
|
||||||
//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);
|
|
||||||
return false;
|
|
||||||
} else {
|
} else {
|
||||||
if (translucent) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &invTransform);
|
if (translucent) return _rasterTranslucentImageRle(surface, image->rle, image->data, image->w, image->h, opacity, &invTransform);
|
||||||
return _rasterImageRle(surface, image->rle, image->data, image->w, image->h, &invTransform);
|
return _rasterImageRle(surface, image->rle, image->data, image->w, image->h, &invTransform);
|
||||||
|
|
Loading…
Add table
Reference in a new issue