mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-09 06:04:03 +00:00
common engines: optimizing data packing for compactness.
Standardized the opacity data type to use 1 byte across all instances to maintain consistency and reduce scattered usage.
This commit is contained in:
parent
e1d73b2c2e
commit
814d87626c
16 changed files with 99 additions and 99 deletions
|
@ -109,7 +109,7 @@ Compositor* GlRenderer::target(TVG_UNUSED const RenderRegion& region, TVG_UNUSED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GlRenderer::beginComposite(TVG_UNUSED Compositor* cmp, CompositeMethod method, uint32_t opacity)
|
bool GlRenderer::beginComposite(TVG_UNUSED Compositor* cmp, CompositeMethod method, uint8_t opacity)
|
||||||
{
|
{
|
||||||
//TODO: delete the given compositor and restore the context
|
//TODO: delete the given compositor and restore the context
|
||||||
return false;
|
return false;
|
||||||
|
@ -188,21 +188,21 @@ bool GlRenderer::dispose(RenderData data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData GlRenderer::prepare(TVG_UNUSED Surface* surface, TVG_UNUSED const RenderMesh* mesh, TVG_UNUSED RenderData data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, TVG_UNUSED Array<RenderData>& clips, TVG_UNUSED RenderUpdateFlag flags)
|
RenderData GlRenderer::prepare(TVG_UNUSED Surface* surface, TVG_UNUSED const RenderMesh* mesh, TVG_UNUSED RenderData data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED Array<RenderData>& clips, TVG_UNUSED uint8_t opacity, TVG_UNUSED RenderUpdateFlag flags)
|
||||||
{
|
{
|
||||||
//TODO:
|
//TODO:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData GlRenderer::prepare(TVG_UNUSED const Array<RenderData>& scene, TVG_UNUSED RenderData data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, TVG_UNUSED Array<RenderData>& clips, TVG_UNUSED RenderUpdateFlag flags)
|
RenderData GlRenderer::prepare(TVG_UNUSED const Array<RenderData>& scene, TVG_UNUSED RenderData data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED Array<RenderData>& clips, TVG_UNUSED uint8_t opacity, TVG_UNUSED RenderUpdateFlag flags)
|
||||||
{
|
{
|
||||||
//TODO:
|
//TODO:
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData GlRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, TVG_UNUSED uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, TVG_UNUSED bool clipper)
|
RenderData GlRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, TVG_UNUSED uint8_t opacity, RenderUpdateFlag flags, TVG_UNUSED bool clipper)
|
||||||
{
|
{
|
||||||
//prepare shape data
|
//prepare shape data
|
||||||
GlShape* sdata = static_cast<GlShape*>(data);
|
GlShape* sdata = static_cast<GlShape*>(data);
|
||||||
|
|
|
@ -30,9 +30,9 @@ class GlRenderer : public RenderMethod
|
||||||
public:
|
public:
|
||||||
Surface surface = {nullptr, 0, 0, 0, ColorSpace::Unsupported, true};
|
Surface surface = {nullptr, 0, 0, 0, ColorSpace::Unsupported, true};
|
||||||
|
|
||||||
RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) override;
|
RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override;
|
||||||
RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override;
|
RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) override;
|
||||||
RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override;
|
RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) override;
|
||||||
bool preRender() override;
|
bool preRender() override;
|
||||||
bool renderShape(RenderData data) override;
|
bool renderShape(RenderData data) override;
|
||||||
bool renderImage(RenderData data) override;
|
bool renderImage(RenderData data) override;
|
||||||
|
@ -48,7 +48,7 @@ public:
|
||||||
bool clear() override;
|
bool clear() override;
|
||||||
|
|
||||||
Compositor* target(const RenderRegion& region, ColorSpace cs) override;
|
Compositor* target(const RenderRegion& region, ColorSpace cs) override;
|
||||||
bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override;
|
bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) override;
|
||||||
bool endComposite(Compositor* cmp) override;
|
bool endComposite(Compositor* cmp) override;
|
||||||
|
|
||||||
static GlRenderer* gen();
|
static GlRenderer* gen();
|
||||||
|
|
|
@ -390,8 +390,8 @@ void shapeResetStroke(SwShape* shape, const RenderShape* rshape, const Matrix* t
|
||||||
bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid);
|
bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix* transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid);
|
||||||
void shapeFree(SwShape* shape);
|
void shapeFree(SwShape* shape);
|
||||||
void shapeDelStroke(SwShape* shape);
|
void shapeDelStroke(SwShape* shape);
|
||||||
bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable);
|
bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable);
|
||||||
bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable);
|
bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable);
|
||||||
void shapeResetFill(SwShape* shape);
|
void shapeResetFill(SwShape* shape);
|
||||||
void shapeResetStrokeFill(SwShape* shape);
|
void shapeResetStrokeFill(SwShape* shape);
|
||||||
void shapeDelFill(SwShape* shape);
|
void shapeDelFill(SwShape* shape);
|
||||||
|
@ -408,7 +408,7 @@ void imageDelOutline(SwImage* image, SwMpool* mpool, uint32_t tid);
|
||||||
void imageReset(SwImage* image);
|
void imageReset(SwImage* image);
|
||||||
void imageFree(SwImage* image);
|
void imageFree(SwImage* image);
|
||||||
|
|
||||||
bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable);
|
bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable);
|
||||||
void fillReset(SwFill* fill);
|
void fillReset(SwFill* fill);
|
||||||
void fillFree(SwFill* fill);
|
void fillFree(SwFill* fill);
|
||||||
//OPTIMIZE_ME: Skip the function pointer access
|
//OPTIMIZE_ME: Skip the function pointer access
|
||||||
|
@ -436,7 +436,7 @@ void mpoolRetStrokeOutline(SwMpool* mpool, unsigned idx);
|
||||||
bool rasterCompositor(SwSurface* surface);
|
bool rasterCompositor(SwSurface* surface);
|
||||||
bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id);
|
bool rasterGradientShape(SwSurface* surface, SwShape* shape, unsigned id);
|
||||||
bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
|
bool rasterShape(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint8_t b, uint8_t a);
|
||||||
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, uint8_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, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
|
bool rasterClear(SwSurface* surface, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#define FIXPT_SIZE (1<<FIXPT_BITS)
|
#define FIXPT_SIZE (1<<FIXPT_BITS)
|
||||||
|
|
||||||
|
|
||||||
static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface* surface, uint32_t opacity)
|
static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface* surface, uint8_t opacity)
|
||||||
{
|
{
|
||||||
if (!fill->ctable) {
|
if (!fill->ctable) {
|
||||||
fill->ctable = static_cast<uint32_t*>(malloc(GRADIENT_STOP_SIZE * sizeof(uint32_t)));
|
fill->ctable = static_cast<uint32_t*>(malloc(GRADIENT_STOP_SIZE * sizeof(uint32_t)));
|
||||||
|
@ -46,7 +46,7 @@ static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface*
|
||||||
|
|
||||||
auto pColors = colors;
|
auto pColors = colors;
|
||||||
|
|
||||||
auto a = (pColors->a * opacity) / 255;
|
auto a = MULTIPLY(pColors->a, opacity);
|
||||||
if (a < 255) fill->translucent = true;
|
if (a < 255) fill->translucent = true;
|
||||||
|
|
||||||
auto r = pColors->r;
|
auto r = pColors->r;
|
||||||
|
@ -70,7 +70,7 @@ static bool _updateColorTable(SwFill* fill, const Fill* fdata, const SwSurface*
|
||||||
auto curr = colors + j;
|
auto curr = colors + j;
|
||||||
auto next = curr + 1;
|
auto next = curr + 1;
|
||||||
auto delta = 1.0f / (next->offset - curr->offset);
|
auto delta = 1.0f / (next->offset - curr->offset);
|
||||||
auto a2 = (next->a * opacity) / 255;
|
auto a2 = MULTIPLY(next->a, opacity);
|
||||||
if (!fill->translucent && a2 < 255) fill->translucent = true;
|
if (!fill->translucent && a2 < 255) fill->translucent = true;
|
||||||
|
|
||||||
auto rgba2 = surface->blender.join(next->r, next->g, next->b, a2);
|
auto rgba2 = surface->blender.join(next->r, next->g, next->b, a2);
|
||||||
|
@ -397,7 +397,7 @@ void fillLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, uint3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable)
|
bool fillGenColorTable(SwFill* fill, const Fill* fdata, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable)
|
||||||
{
|
{
|
||||||
if (!fill) return false;
|
if (!fill) return false;
|
||||||
|
|
||||||
|
|
|
@ -951,7 +951,7 @@ static bool _transformedRGBAImage(SwSurface* surface, const SwImage* image, cons
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool _transformedRGBAImageMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint32_t opacity)
|
static bool _transformedRGBAImageMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint8_t opacity)
|
||||||
{
|
{
|
||||||
//TODO: Not completed for all cases.
|
//TODO: Not completed for all cases.
|
||||||
return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity);
|
return _rasterTexmapPolygonMesh(surface, image, mesh, transform, region, opacity);
|
||||||
|
@ -1805,7 +1805,7 @@ bool rasterStroke(SwSurface* surface, SwShape* shape, uint8_t r, uint8_t g, uint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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, uint8_t opacity)
|
||||||
{
|
{
|
||||||
if (surface->channelSize == sizeof(uint8_t)) {
|
if (surface->channelSize == sizeof(uint8_t)) {
|
||||||
TVGERR("SW_ENGINE", "Not supported grayscale image!");
|
TVGERR("SW_ENGINE", "Not supported grayscale image!");
|
||||||
|
|
|
@ -70,7 +70,7 @@ static bool _arrange(const SwImage* image, const SwBBox* region, int& yStart, in
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _rasterMaskedPolygonImageSegmentInt(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, AASpans* aaSpans, uint8_t dirFlag)
|
static void _rasterMaskedPolygonImageSegmentInt(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, uint8_t dirFlag)
|
||||||
{
|
{
|
||||||
float _dudx = dudx, _dvdx = dvdx;
|
float _dudx = dudx, _dvdx = dvdx;
|
||||||
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
||||||
|
@ -247,7 +247,7 @@ static void _rasterMaskedPolygonImageSegmentInt(SwSurface* surface, const SwImag
|
||||||
|
|
||||||
|
|
||||||
template<typename maskOp, typename amaskOp>
|
template<typename maskOp, typename amaskOp>
|
||||||
static void _rasterMaskedPolygonImageSegmentDup(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, AASpans* aaSpans)
|
static void _rasterMaskedPolygonImageSegmentDup(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity)
|
||||||
{
|
{
|
||||||
float _dudx = dudx, _dvdx = dvdx;
|
float _dudx = dudx, _dvdx = dvdx;
|
||||||
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
||||||
|
@ -420,18 +420,18 @@ static void _rasterMaskedPolygonImageSegmentDup(SwSurface* surface, const SwImag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _rasterMaskedPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, AASpans* aaSpans, uint8_t dirFlag = 0)
|
static void _rasterMaskedPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, uint8_t dirFlag = 0)
|
||||||
{
|
{
|
||||||
auto method = surface->compositor->method;
|
auto method = surface->compositor->method;
|
||||||
|
|
||||||
if (method == CompositeMethod::AddMask) _rasterMaskedPolygonImageSegmentDup<AddMaskOp, AddMaskAOp>(surface, image, region, yStart, yEnd, opacity, aaSpans);
|
if (method == CompositeMethod::AddMask) _rasterMaskedPolygonImageSegmentDup<AddMaskOp, AddMaskAOp>(surface, image, region, yStart, yEnd, aaSpans, opacity);
|
||||||
else if (method == CompositeMethod::SubtractMask) _rasterMaskedPolygonImageSegmentDup<SubMaskOp, SubMaskAOp>(surface, image, region, yStart, yEnd, opacity, aaSpans);
|
else if (method == CompositeMethod::SubtractMask) _rasterMaskedPolygonImageSegmentDup<SubMaskOp, SubMaskAOp>(surface, image, region, yStart, yEnd, aaSpans, opacity);
|
||||||
else if (method == CompositeMethod::DifferenceMask) _rasterMaskedPolygonImageSegmentDup<DifMaskOp, DifMaskAOp>(surface, image, region, yStart, yEnd, opacity, aaSpans);
|
else if (method == CompositeMethod::DifferenceMask) _rasterMaskedPolygonImageSegmentDup<DifMaskOp, DifMaskAOp>(surface, image, region, yStart, yEnd, aaSpans, opacity);
|
||||||
else if (method == CompositeMethod::IntersectMask) _rasterMaskedPolygonImageSegmentInt(surface, image, region, yStart, yEnd, opacity, aaSpans, dirFlag);
|
else if (method == CompositeMethod::IntersectMask) _rasterMaskedPolygonImageSegmentInt(surface, image, region, yStart, yEnd, aaSpans, opacity, dirFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, uint32_t opacity, AASpans* aaSpans, bool matting)
|
static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, bool matting)
|
||||||
{
|
{
|
||||||
float _dudx = dudx, _dvdx = dvdx;
|
float _dudx = dudx, _dvdx = dvdx;
|
||||||
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
||||||
|
@ -629,7 +629,7 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
||||||
|
|
||||||
|
|
||||||
/* This mapping algorithm is based on Mikael Kalms's. */
|
/* This mapping algorithm is based on Mikael Kalms's. */
|
||||||
static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, uint32_t opacity, Polygon& polygon, AASpans* aaSpans)
|
static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const SwBBox* region, Polygon& polygon, AASpans* aaSpans, uint8_t opacity)
|
||||||
{
|
{
|
||||||
float x[3] = {polygon.vertex[0].pt.x, polygon.vertex[1].pt.x, polygon.vertex[2].pt.x};
|
float x[3] = {polygon.vertex[0].pt.x, polygon.vertex[1].pt.x, polygon.vertex[2].pt.x};
|
||||||
float y[3] = {polygon.vertex[0].pt.y, polygon.vertex[1].pt.y, polygon.vertex[2].pt.y};
|
float y[3] = {polygon.vertex[0].pt.y, polygon.vertex[1].pt.y, polygon.vertex[2].pt.y};
|
||||||
|
@ -719,9 +719,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const
|
||||||
xb = x[0] + dy * dxdyb + (off_y * dxdyb);
|
xb = x[0] + dy * dxdyb + (off_y * dxdyb);
|
||||||
|
|
||||||
if (compositing) {
|
if (compositing) {
|
||||||
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, true);
|
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true);
|
||||||
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, 1);
|
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 1);
|
||||||
} else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, false);
|
} else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false);
|
||||||
|
|
||||||
upper = true;
|
upper = true;
|
||||||
}
|
}
|
||||||
|
@ -737,9 +737,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const
|
||||||
dxdyb = dxdy[2];
|
dxdyb = dxdy[2];
|
||||||
xb = x[1] + (1 - (y[1] - yi[1])) * dxdyb + (off_y * dxdyb);
|
xb = x[1] + (1 - (y[1] - yi[1])) * dxdyb + (off_y * dxdyb);
|
||||||
if (compositing) {
|
if (compositing) {
|
||||||
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, true);
|
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true);
|
||||||
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, 2);
|
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 2);
|
||||||
} else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, false);
|
} else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false);
|
||||||
}
|
}
|
||||||
//Longer edge is on the right side
|
//Longer edge is on the right side
|
||||||
} else {
|
} else {
|
||||||
|
@ -763,9 +763,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const
|
||||||
va = v[0] + dy * dvdya + (off_y * dvdya);
|
va = v[0] + dy * dvdya + (off_y * dvdya);
|
||||||
|
|
||||||
if (compositing) {
|
if (compositing) {
|
||||||
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, true);
|
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, true);
|
||||||
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, 3);
|
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, 3);
|
||||||
} else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], opacity, aaSpans, false);
|
} else _rasterPolygonImageSegment(surface, image, region, yi[0], yi[1], aaSpans, opacity, false);
|
||||||
|
|
||||||
upper = true;
|
upper = true;
|
||||||
}
|
}
|
||||||
|
@ -784,9 +784,9 @@ static void _rasterPolygonImage(SwSurface* surface, const SwImage* image, const
|
||||||
va = v[1] + dy * dvdya + (off_y * dvdya);
|
va = v[1] + dy * dvdya + (off_y * dvdya);
|
||||||
|
|
||||||
if (compositing) {
|
if (compositing) {
|
||||||
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, true);
|
if (_matting(surface)) _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, true);
|
||||||
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, 4);
|
else _rasterMaskedPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, 4);
|
||||||
} else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], opacity, aaSpans, false);
|
} else _rasterPolygonImageSegment(surface, image, region, yi[1], yi[2], aaSpans, opacity, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1061,7 +1061,7 @@ static bool _apply(SwSurface* surface, AASpans* aaSpans)
|
||||||
| / |
|
| / |
|
||||||
3 -- 2
|
3 -- 2
|
||||||
*/
|
*/
|
||||||
static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint32_t opacity)
|
static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const Matrix* transform, const SwBBox* region, uint8_t opacity)
|
||||||
{
|
{
|
||||||
//Exceptions: No dedicated drawing area?
|
//Exceptions: No dedicated drawing area?
|
||||||
if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false;
|
if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false;
|
||||||
|
@ -1092,14 +1092,14 @@ static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const
|
||||||
polygon.vertex[1] = vertices[1];
|
polygon.vertex[1] = vertices[1];
|
||||||
polygon.vertex[2] = vertices[3];
|
polygon.vertex[2] = vertices[3];
|
||||||
|
|
||||||
_rasterPolygonImage(surface, image, region, opacity, polygon, aaSpans);
|
_rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity);
|
||||||
|
|
||||||
//Draw the second polygon
|
//Draw the second polygon
|
||||||
polygon.vertex[0] = vertices[1];
|
polygon.vertex[0] = vertices[1];
|
||||||
polygon.vertex[1] = vertices[2];
|
polygon.vertex[1] = vertices[2];
|
||||||
polygon.vertex[2] = vertices[3];
|
polygon.vertex[2] = vertices[3];
|
||||||
|
|
||||||
_rasterPolygonImage(surface, image, region, opacity, polygon, aaSpans);
|
_rasterPolygonImage(surface, image, region, polygon, aaSpans, opacity);
|
||||||
|
|
||||||
return _apply(surface, aaSpans);
|
return _apply(surface, aaSpans);
|
||||||
}
|
}
|
||||||
|
@ -1118,7 +1118,7 @@ static bool _rasterTexmapPolygon(SwSurface* surface, const SwImage* image, const
|
||||||
Should provide two Polygons, one for each triangle.
|
Should provide two Polygons, one for each triangle.
|
||||||
// TODO: region?
|
// TODO: region?
|
||||||
*/
|
*/
|
||||||
static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint32_t opacity)
|
static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, const RenderMesh* mesh, const Matrix* transform, const SwBBox* region, uint8_t opacity)
|
||||||
{
|
{
|
||||||
//Exceptions: No dedicated drawing area?
|
//Exceptions: No dedicated drawing area?
|
||||||
if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false;
|
if ((!image->rle && !region) || (image->rle && image->rle->size == 0)) return false;
|
||||||
|
@ -1152,7 +1152,7 @@ static bool _rasterTexmapPolygonMesh(SwSurface* surface, const SwImage* image, c
|
||||||
auto aaSpans = _AASpans(ys, ye, image, region);
|
auto aaSpans = _AASpans(ys, ye, image, region);
|
||||||
if (aaSpans) {
|
if (aaSpans) {
|
||||||
for (uint32_t i = 0; i < mesh->triangleCnt; i++) {
|
for (uint32_t i = 0; i < mesh->triangleCnt; i++) {
|
||||||
_rasterPolygonImage(surface, image, region, opacity, transformedTris[i], aaSpans);
|
_rasterPolygonImage(surface, image, region, transformedTris[i], aaSpans, opacity);
|
||||||
}
|
}
|
||||||
// Apply to surface (note: frees the AA spans)
|
// Apply to surface (note: frees the AA spans)
|
||||||
_apply(surface, aaSpans);
|
_apply(surface, aaSpans);
|
||||||
|
|
|
@ -35,13 +35,13 @@ static uint32_t threadsCnt = 0;
|
||||||
|
|
||||||
struct SwTask : Task
|
struct SwTask : Task
|
||||||
{
|
{
|
||||||
Matrix* transform = nullptr;
|
|
||||||
SwSurface* surface = nullptr;
|
SwSurface* surface = nullptr;
|
||||||
SwMpool* mpool = nullptr;
|
SwMpool* mpool = nullptr;
|
||||||
RenderUpdateFlag flags = RenderUpdateFlag::None;
|
|
||||||
Array<RenderData> clips;
|
|
||||||
uint32_t opacity;
|
|
||||||
SwBBox bbox = {{0, 0}, {0, 0}}; //Whole Rendering Region
|
SwBBox bbox = {{0, 0}, {0, 0}}; //Whole Rendering Region
|
||||||
|
Matrix* transform = nullptr;
|
||||||
|
Array<RenderData> clips;
|
||||||
|
RenderUpdateFlag flags = RenderUpdateFlag::None;
|
||||||
|
uint8_t opacity;
|
||||||
bool pushed = false; //Pushed into task list?
|
bool pushed = false; //Pushed into task list?
|
||||||
bool disposed = false; //Disposed task?
|
bool disposed = false; //Disposed task?
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ struct SwShapeTask : SwTask
|
||||||
|
|
||||||
if (HALF_STROKE(rshape->strokeWidth()) > 0) {
|
if (HALF_STROKE(rshape->strokeWidth()) > 0) {
|
||||||
rshape->strokeColor(nullptr, nullptr, nullptr, &strokeAlpha);
|
rshape->strokeColor(nullptr, nullptr, nullptr, &strokeAlpha);
|
||||||
visibleStroke = rshape->strokeFill() || (static_cast<uint32_t>(strokeAlpha * opacity / 255) > 0);
|
visibleStroke = rshape->strokeFill() || (MULTIPLY(strokeAlpha, opacity) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//This checks also for the case, if the invisible shape turned to visible by alpha.
|
//This checks also for the case, if the invisible shape turned to visible by alpha.
|
||||||
|
@ -117,7 +117,7 @@ struct SwShapeTask : SwTask
|
||||||
if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) {
|
if (flags & (RenderUpdateFlag::Path | RenderUpdateFlag::Transform) || prepareShape) {
|
||||||
uint8_t alpha = 0;
|
uint8_t alpha = 0;
|
||||||
rshape->fillColor(nullptr, nullptr, nullptr, &alpha);
|
rshape->fillColor(nullptr, nullptr, nullptr, &alpha);
|
||||||
alpha = static_cast<uint8_t>(static_cast<uint32_t>(alpha) * opacity / 255);
|
alpha = MULTIPLY(alpha, opacity);
|
||||||
visibleFill = (alpha > 0 || rshape->fill);
|
visibleFill = (alpha > 0 || rshape->fill);
|
||||||
if (visibleFill || visibleStroke || clipper) {
|
if (visibleFill || visibleStroke || clipper) {
|
||||||
shapeReset(&shape);
|
shapeReset(&shape);
|
||||||
|
@ -322,26 +322,26 @@ static void _termEngine()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void _renderFill(SwShapeTask* task, SwSurface* surface, uint32_t opacity)
|
static void _renderFill(SwShapeTask* task, SwSurface* surface, uint8_t opacity)
|
||||||
{
|
{
|
||||||
uint8_t r, g, b, a;
|
uint8_t r, g, b, a;
|
||||||
if (auto fill = task->rshape->fill) {
|
if (auto fill = task->rshape->fill) {
|
||||||
rasterGradientShape(surface, &task->shape, fill->identifier());
|
rasterGradientShape(surface, &task->shape, fill->identifier());
|
||||||
} else {
|
} else {
|
||||||
task->rshape->fillColor(&r, &g, &b, &a);
|
task->rshape->fillColor(&r, &g, &b, &a);
|
||||||
a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255);
|
a = MULTIPLY(opacity, a);
|
||||||
if (a > 0) rasterShape(surface, &task->shape, r, g, b, a);
|
if (a > 0) rasterShape(surface, &task->shape, r, g, b, a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _renderStroke(SwShapeTask* task, SwSurface* surface, uint32_t opacity)
|
static void _renderStroke(SwShapeTask* task, SwSurface* surface, uint8_t opacity)
|
||||||
{
|
{
|
||||||
uint8_t r, g, b, a;
|
uint8_t r, g, b, a;
|
||||||
if (auto strokeFill = task->rshape->strokeFill()) {
|
if (auto strokeFill = task->rshape->strokeFill()) {
|
||||||
rasterGradientStroke(surface, &task->shape, strokeFill->identifier());
|
rasterGradientStroke(surface, &task->shape, strokeFill->identifier());
|
||||||
} else {
|
} else {
|
||||||
if (task->rshape->strokeColor(&r, &g, &b, &a)) {
|
if (task->rshape->strokeColor(&r, &g, &b, &a)) {
|
||||||
a = static_cast<uint8_t>((opacity * (uint32_t) a) / 255);
|
a = MULTIPLY(opacity, a);
|
||||||
if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a);
|
if (a > 0) rasterStroke(surface, &task->shape, r, g, b, a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -505,7 +505,7 @@ RenderRegion SwRenderer::region(RenderData data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SwRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity)
|
bool SwRenderer::beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity)
|
||||||
{
|
{
|
||||||
if (!cmp) return false;
|
if (!cmp) return false;
|
||||||
auto p = static_cast<SwCompositor*>(cmp);
|
auto p = static_cast<SwCompositor*>(cmp);
|
||||||
|
@ -655,7 +655,7 @@ bool SwRenderer::dispose(RenderData data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, const Array<RenderData>& clips, RenderUpdateFlag flags)
|
void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, const Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags)
|
||||||
{
|
{
|
||||||
if (!surface) return task;
|
if (!surface) return task;
|
||||||
if (flags == RenderUpdateFlag::None) return task;
|
if (flags == RenderUpdateFlag::None) return task;
|
||||||
|
@ -700,7 +700,7 @@ void* SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags)
|
RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags)
|
||||||
{
|
{
|
||||||
//prepare task
|
//prepare task
|
||||||
auto task = static_cast<SwImageTask*>(data);
|
auto task = static_cast<SwImageTask*>(data);
|
||||||
|
@ -709,11 +709,11 @@ RenderData SwRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderD
|
||||||
task->source = surface;
|
task->source = surface;
|
||||||
task->mesh = mesh;
|
task->mesh = mesh;
|
||||||
}
|
}
|
||||||
return prepareCommon(task, transform, opacity, clips, flags);
|
return prepareCommon(task, transform, clips, opacity, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData SwRenderer::prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags)
|
RenderData SwRenderer::prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags)
|
||||||
{
|
{
|
||||||
//prepare task
|
//prepare task
|
||||||
auto task = static_cast<SwSceneTask*>(data);
|
auto task = static_cast<SwSceneTask*>(data);
|
||||||
|
@ -726,11 +726,11 @@ RenderData SwRenderer::prepare(const Array<RenderData>& scene, RenderData data,
|
||||||
for (auto task = scene.data; task < (scene.data + scene.count); ++task) {
|
for (auto task = scene.data; task < (scene.data + scene.count); ++task) {
|
||||||
static_cast<SwTask*>(*task)->done();
|
static_cast<SwTask*>(*task)->done();
|
||||||
}
|
}
|
||||||
return prepareCommon(task, transform, opacity, clips, flags);
|
return prepareCommon(task, transform, clips, opacity, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper)
|
RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper)
|
||||||
{
|
{
|
||||||
//prepare task
|
//prepare task
|
||||||
auto task = static_cast<SwShapeTask*>(data);
|
auto task = static_cast<SwShapeTask*>(data);
|
||||||
|
@ -740,7 +740,7 @@ RenderData SwRenderer::prepare(const RenderShape& rshape, RenderData data, const
|
||||||
}
|
}
|
||||||
task->clipper = clipper;
|
task->clipper = clipper;
|
||||||
|
|
||||||
return prepareCommon(task, transform, opacity, clips, flags);
|
return prepareCommon(task, transform, clips, opacity, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,9 @@ namespace tvg
|
||||||
class SwRenderer : public RenderMethod
|
class SwRenderer : public RenderMethod
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) override;
|
RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) override;
|
||||||
RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override;
|
RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) override;
|
||||||
RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) override;
|
RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) override;
|
||||||
bool preRender() override;
|
bool preRender() override;
|
||||||
bool renderShape(RenderData data) override;
|
bool renderShape(RenderData data) override;
|
||||||
bool renderImage(RenderData data) override;
|
bool renderImage(RenderData data) override;
|
||||||
|
@ -55,7 +55,7 @@ public:
|
||||||
bool mempool(bool shared);
|
bool mempool(bool shared);
|
||||||
|
|
||||||
Compositor* target(const RenderRegion& region, ColorSpace cs) override;
|
Compositor* target(const RenderRegion& region, ColorSpace cs) override;
|
||||||
bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) override;
|
bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) override;
|
||||||
bool endComposite(Compositor* cmp) override;
|
bool endComposite(Compositor* cmp) override;
|
||||||
void clearCompositors();
|
void clearCompositors();
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ private:
|
||||||
SwRenderer();
|
SwRenderer();
|
||||||
~SwRenderer();
|
~SwRenderer();
|
||||||
|
|
||||||
RenderData prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, const Array<RenderData>& clips, RenderUpdateFlag flags);
|
RenderData prepareCommon(SwTask* task, const RenderTransform* transform, const Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -617,13 +617,13 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable)
|
bool shapeGenFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable)
|
||||||
{
|
{
|
||||||
return fillGenColorTable(shape->fill, fill, transform, surface, opacity, ctable);
|
return fillGenColorTable(shape->fill, fill, transform, surface, opacity, ctable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint32_t opacity, bool ctable)
|
bool shapeGenStrokeFillColors(SwShape* shape, const Fill* fill, const Matrix* transform, SwSurface* surface, uint8_t opacity, bool ctable)
|
||||||
{
|
{
|
||||||
return fillGenColorTable(shape->stroke->fill, fill, transform, surface, opacity, ctable);
|
return fillGenColorTable(shape->stroke->fill, fill, transform, surface, opacity, ctable);
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ struct Canvas::Impl
|
||||||
//Optimize Me: Can we skip the searching?
|
//Optimize Me: Can we skip the searching?
|
||||||
for (auto paint2 : paints) {
|
for (auto paint2 : paints) {
|
||||||
if (paint2 == paint) {
|
if (paint2 == paint) {
|
||||||
paint->pImpl->update(*renderer, nullptr, 255, clips, flag);
|
paint->pImpl->update(*renderer, nullptr, clips, 255, flag);
|
||||||
return Result::Success;
|
return Result::Success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ struct Canvas::Impl
|
||||||
//Update all retained paint nodes
|
//Update all retained paint nodes
|
||||||
} else {
|
} else {
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
paint->pImpl->update(*renderer, nullptr, 255, clips, flag);
|
paint->pImpl->update(*renderer, nullptr, clips, 255, flag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,7 @@ bool Paint::Impl::render(RenderMethod& renderer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper)
|
RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
||||||
{
|
{
|
||||||
if (renderFlag & RenderUpdateFlag::Transform) {
|
if (renderFlag & RenderUpdateFlag::Transform) {
|
||||||
if (!rTransform) return nullptr;
|
if (!rTransform) return nullptr;
|
||||||
|
@ -235,7 +235,7 @@ RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pT
|
||||||
}
|
}
|
||||||
if (!compFastTrack) {
|
if (!compFastTrack) {
|
||||||
childClipper = compData->method == CompositeMethod::ClipPath ? true : false;
|
childClipper = compData->method == CompositeMethod::ClipPath ? true : false;
|
||||||
trd = target->pImpl->update(renderer, pTransform, 255, clips, pFlag, childClipper);
|
trd = target->pImpl->update(renderer, pTransform, clips, 255, pFlag, childClipper);
|
||||||
if (childClipper) clips.push(trd);
|
if (childClipper) clips.push(trd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,14 +244,14 @@ RenderData Paint::Impl::update(RenderMethod& renderer, const RenderTransform* pT
|
||||||
RenderData rd = nullptr;
|
RenderData rd = nullptr;
|
||||||
auto newFlag = static_cast<RenderUpdateFlag>(pFlag | renderFlag);
|
auto newFlag = static_cast<RenderUpdateFlag>(pFlag | renderFlag);
|
||||||
renderFlag = RenderUpdateFlag::None;
|
renderFlag = RenderUpdateFlag::None;
|
||||||
opacity = (opacity * this->opacity) / 255;
|
opacity = ((opacity * this->opacity + 0xff) >> 8); //opacity = (opacity * this->opacity) / 255;
|
||||||
|
|
||||||
if (rTransform && pTransform) {
|
if (rTransform && pTransform) {
|
||||||
RenderTransform outTransform(pTransform, rTransform);
|
RenderTransform outTransform(pTransform, rTransform);
|
||||||
rd = smethod->update(renderer, &outTransform, opacity, clips, newFlag, clipper);
|
rd = smethod->update(renderer, &outTransform, clips, opacity, newFlag, clipper);
|
||||||
} else {
|
} else {
|
||||||
auto outTransform = pTransform ? pTransform : rTransform;
|
auto outTransform = pTransform ? pTransform : rTransform;
|
||||||
rd = smethod->update(renderer, outTransform, opacity, clips, newFlag, clipper);
|
rd = smethod->update(renderer, outTransform, clips, opacity, newFlag, clipper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 3. Composition Post Processing */
|
/* 3. Composition Post Processing */
|
||||||
|
|
|
@ -43,7 +43,7 @@ namespace tvg
|
||||||
virtual ~StrategyMethod() {}
|
virtual ~StrategyMethod() {}
|
||||||
|
|
||||||
virtual bool dispose(RenderMethod& renderer) = 0;
|
virtual bool dispose(RenderMethod& renderer) = 0;
|
||||||
virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has.
|
virtual void* update(RenderMethod& renderer, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper) = 0; //Return engine data if it has.
|
||||||
virtual bool render(RenderMethod& renderer) = 0;
|
virtual bool render(RenderMethod& renderer) = 0;
|
||||||
virtual bool bounds(float* x, float* y, float* w, float* h) = 0;
|
virtual bool bounds(float* x, float* y, float* w, float* h) = 0;
|
||||||
virtual RenderRegion bounds(RenderMethod& renderer) const = 0;
|
virtual RenderRegion bounds(RenderMethod& renderer) const = 0;
|
||||||
|
@ -147,7 +147,7 @@ namespace tvg
|
||||||
bool scale(float factor);
|
bool scale(float factor);
|
||||||
bool translate(float x, float y);
|
bool translate(float x, float y);
|
||||||
bool bounds(float* x, float* y, float* w, float* h, bool transformed);
|
bool bounds(float* x, float* y, float* w, float* h, bool transformed);
|
||||||
RenderData update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper = false);
|
RenderData update(RenderMethod& renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper = false);
|
||||||
bool render(RenderMethod& renderer);
|
bool render(RenderMethod& renderer);
|
||||||
Paint* duplicate();
|
Paint* duplicate();
|
||||||
};
|
};
|
||||||
|
@ -176,9 +176,9 @@ namespace tvg
|
||||||
return inst->dispose(renderer);
|
return inst->dispose(renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderData update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag renderFlag, bool clipper) override
|
RenderData update(RenderMethod& renderer, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag renderFlag, bool clipper) override
|
||||||
{
|
{
|
||||||
return inst->update(renderer, transform, opacity, clips, renderFlag, clipper);
|
return inst->update(renderer, transform, clips, opacity, renderFlag, clipper);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool render(RenderMethod& renderer) override
|
bool render(RenderMethod& renderer) override
|
||||||
|
|
|
@ -133,7 +133,7 @@ struct Picture::Impl
|
||||||
else return RenderTransform(pTransform, &tmp);
|
else return RenderTransform(pTransform, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needComposition(uint32_t opacity)
|
bool needComposition(uint8_t opacity)
|
||||||
{
|
{
|
||||||
//In this case, paint(scene) would try composition itself.
|
//In this case, paint(scene) would try composition itself.
|
||||||
if (opacity < 255) return false;
|
if (opacity < 255) return false;
|
||||||
|
@ -147,20 +147,20 @@ struct Picture::Impl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderData update(RenderMethod &renderer, const RenderTransform* pTransform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper)
|
RenderData update(RenderMethod &renderer, const RenderTransform* pTransform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
||||||
{
|
{
|
||||||
auto flag = load();
|
auto flag = load();
|
||||||
|
|
||||||
if (surface) {
|
if (surface) {
|
||||||
auto transform = resizeTransform(pTransform);
|
auto transform = resizeTransform(pTransform);
|
||||||
rd = renderer.prepare(surface, &rm, rd, &transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag));
|
rd = renderer.prepare(surface, &rm, rd, &transform, clips, opacity, static_cast<RenderUpdateFlag>(pFlag | flag));
|
||||||
} else if (paint) {
|
} else if (paint) {
|
||||||
if (resizing) {
|
if (resizing) {
|
||||||
loader->resize(paint, w, h);
|
loader->resize(paint, w, h);
|
||||||
resizing = false;
|
resizing = false;
|
||||||
}
|
}
|
||||||
needComp = needComposition(opacity) ? true : false;
|
needComp = needComposition(opacity) ? true : false;
|
||||||
rd = paint->pImpl->update(renderer, pTransform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag), clipper);
|
rd = paint->pImpl->update(renderer, pTransform, clips, opacity, static_cast<RenderUpdateFlag>(pFlag | flag), clipper);
|
||||||
}
|
}
|
||||||
return rd;
|
return rd;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ struct Surface
|
||||||
struct Compositor
|
struct Compositor
|
||||||
{
|
{
|
||||||
CompositeMethod method;
|
CompositeMethod method;
|
||||||
uint32_t opacity;
|
uint8_t opacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RenderMesh
|
struct RenderMesh
|
||||||
|
@ -239,9 +239,9 @@ class RenderMethod
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~RenderMethod() {}
|
virtual ~RenderMethod() {}
|
||||||
virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags, bool clipper) = 0;
|
virtual RenderData prepare(const RenderShape& rshape, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags, bool clipper) = 0;
|
||||||
virtual RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0;
|
virtual RenderData prepare(const Array<RenderData>& scene, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) = 0;
|
||||||
virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flags) = 0;
|
virtual RenderData prepare(Surface* surface, const RenderMesh* mesh, RenderData data, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flags) = 0;
|
||||||
virtual bool preRender() = 0;
|
virtual bool preRender() = 0;
|
||||||
virtual bool renderShape(RenderData data) = 0;
|
virtual bool renderShape(RenderData data) = 0;
|
||||||
virtual bool renderImage(RenderData data) = 0;
|
virtual bool renderImage(RenderData data) = 0;
|
||||||
|
@ -256,7 +256,7 @@ public:
|
||||||
virtual bool sync() = 0;
|
virtual bool sync() = 0;
|
||||||
|
|
||||||
virtual Compositor* target(const RenderRegion& region, ColorSpace cs) = 0;
|
virtual Compositor* target(const RenderRegion& region, ColorSpace cs) = 0;
|
||||||
virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint32_t opacity) = 0;
|
virtual bool beginComposite(Compositor* cmp, CompositeMethod method, uint8_t opacity) = 0;
|
||||||
virtual bool endComposite(Compositor* cmp) = 0;
|
virtual bool endComposite(Compositor* cmp) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ struct Scene::Impl
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needComposition(uint32_t opacity)
|
bool needComposition(uint8_t opacity)
|
||||||
{
|
{
|
||||||
if (opacity == 0 || paints.empty()) return false;
|
if (opacity == 0 || paints.empty()) return false;
|
||||||
|
|
||||||
|
@ -111,12 +111,12 @@ struct Scene::Impl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderData update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag flag, bool clipper)
|
RenderData update(RenderMethod &renderer, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag flag, bool clipper)
|
||||||
{
|
{
|
||||||
if ((needComp = needComposition(opacity))) {
|
if ((needComp = needComposition(opacity))) {
|
||||||
/* Overriding opacity value. If this scene is half-translucent,
|
/* Overriding opacity value. If this scene is half-translucent,
|
||||||
It must do intermeidate composition with that opacity value. */
|
It must do intermeidate composition with that opacity value. */
|
||||||
this->opacity = static_cast<uint8_t>(opacity);
|
this->opacity = opacity;
|
||||||
opacity = 255;
|
opacity = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,13 +126,13 @@ struct Scene::Impl
|
||||||
Array<RenderData> rds;
|
Array<RenderData> rds;
|
||||||
rds.reserve(paints.size());
|
rds.reserve(paints.size());
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
rds.push(paint->pImpl->update(renderer, transform, opacity, clips, flag, true));
|
rds.push(paint->pImpl->update(renderer, transform, clips, opacity, flag, true));
|
||||||
}
|
}
|
||||||
rd = renderer.prepare(rds, rd, transform, opacity, clips, flag);
|
rd = renderer.prepare(rds, rd, transform, clips, opacity, flag);
|
||||||
return rd;
|
return rd;
|
||||||
} else {
|
} else {
|
||||||
for (auto paint : paints) {
|
for (auto paint : paints) {
|
||||||
paint->pImpl->update(renderer, transform, opacity, clips, flag, false);
|
paint->pImpl->update(renderer, transform, clips, opacity, flag, false);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ struct Shape::Impl
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needComposition(uint32_t opacity)
|
bool needComposition(uint8_t opacity)
|
||||||
{
|
{
|
||||||
if (opacity == 0) return false;
|
if (opacity == 0) return false;
|
||||||
|
|
||||||
|
@ -84,16 +84,16 @@ struct Shape::Impl
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderData update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<RenderData>& clips, RenderUpdateFlag pFlag, bool clipper)
|
RenderData update(RenderMethod& renderer, const RenderTransform* transform, Array<RenderData>& clips, uint8_t opacity, RenderUpdateFlag pFlag, bool clipper)
|
||||||
{
|
{
|
||||||
if ((needComp = needComposition(opacity))) {
|
if ((needComp = needComposition(opacity))) {
|
||||||
/* Overriding opacity value. If this scene is half-translucent,
|
/* Overriding opacity value. If this scene is half-translucent,
|
||||||
It must do intermeidate composition with that opacity value. */
|
It must do intermeidate composition with that opacity value. */
|
||||||
this->opacity = static_cast<uint8_t>(opacity);
|
this->opacity = opacity;
|
||||||
opacity = 255;
|
opacity = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
rd = renderer.prepare(rs, rd, transform, opacity, clips, static_cast<RenderUpdateFlag>(pFlag | flag), clipper);
|
rd = renderer.prepare(rs, rd, transform, clips, opacity, static_cast<RenderUpdateFlag>(pFlag | flag), clipper);
|
||||||
flag = RenderUpdateFlag::None;
|
flag = RenderUpdateFlag::None;
|
||||||
return rd;
|
return rd;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue