sw_engine raster: code refactoring.

Move partial region in rasterClear()
This commit is contained in:
Hermet Park 2023-05-04 18:33:41 +09:00 committed by Hermet Park
parent 0ce2208be0
commit f18d2557e3
3 changed files with 13 additions and 15 deletions

View file

@ -357,7 +357,7 @@ bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8
bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint32_t opacity); bool rasterImage(SwSurface* surface, SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox& bbox, uint32_t opacity);
bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a); bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id); bool rasterGradientStroke(SwSurface* surface, SwShape* shape, unsigned id);
bool rasterClear(SwSurface* surface); bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
void rasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len); void rasterRGBA32(uint32_t *dst, uint32_t val, uint32_t offset, int32_t len);
void rasterUnpremultiply(Surface* surface); void rasterUnpremultiply(Surface* surface);
void rasterPremultiply(Surface* surface); void rasterPremultiply(Surface* surface);

View file

@ -1466,15 +1466,18 @@ bool rasterCompositor(SwSurface* surface)
} }
bool rasterClear(SwSurface* surface) bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
{ {
if (!surface || !surface->buffer || surface->stride <= 0 || surface->w <= 0 || surface->h <= 0) return false; if (!surface || !surface->buffer || surface->stride == 0 || surface->w == 0 || surface->h == 0) return false;
//full clear
if (surface->w == surface->stride) { if (surface->w == surface->stride) {
rasterRGBA32(surface->buffer, 0x00000000, 0, surface->w * surface->h); rasterRGBA32(surface->buffer + (surface->stride * y + x), 0x00000000, x, w * h);
//partial clear
} else { } else {
for (uint32_t i = 0; i < surface->h; i++) { auto offset = surface->stride * y + x;
rasterRGBA32(surface->buffer + surface->stride * i, 0x00000000, 0, surface->w); for (uint32_t i = 0; i < h; i++) {
rasterRGBA32(surface->buffer + (offset * i), 0x00000000, x, w);
} }
} }
return true; return true;

View file

@ -449,9 +449,10 @@ bool SwRenderer::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t
bool SwRenderer::preRender() bool SwRenderer::preRender()
{ {
return rasterClear(surface); return rasterClear(surface, 0, 0, surface->w, surface->h);
} }
void SwRenderer::clearCompositors() void SwRenderer::clearCompositors()
{ {
//Free Composite Caches //Free Composite Caches
@ -631,18 +632,12 @@ Compositor* SwRenderer::target(const RenderRegion& region, ColorSpace cs)
cmp->compositor->image.h = surface->h; cmp->compositor->image.h = surface->h;
cmp->compositor->image.direct = true; cmp->compositor->image.direct = true;
//We know partial clear region
cmp->buffer = cmp->compositor->image.data + (cmp->stride * y + x);
cmp->w = w;
cmp->h = h;
rasterClear(cmp);
//Recover context
cmp->buffer = cmp->compositor->image.data; cmp->buffer = cmp->compositor->image.data;
cmp->w = cmp->compositor->image.w; cmp->w = cmp->compositor->image.w;
cmp->h = cmp->compositor->image.h; cmp->h = cmp->compositor->image.h;
rasterClear(cmp, x, y, w, h);
//Switch render target //Switch render target
surface = cmp; surface = cmp;