}
-void* GlRenderer::prepare(TVG_UNUSED const Picture& picture, TVG_UNUSED void* data, TVG_UNUSED uint32_t *buffer, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, TVG_UNUSED vector<Composite>& compList, TVG_UNUSED RenderUpdateFlag flags)
+void* GlRenderer::prepare(TVG_UNUSED const Picture& picture, TVG_UNUSED void* data, TVG_UNUSED uint32_t *buffer, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, TVG_UNUSED Array<Composite>& compList, TVG_UNUSED RenderUpdateFlag flags)
{
//TODO:
return nullptr;
}
-void* GlRenderer::prepare(const Shape& shape, void* data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags)
+void* GlRenderer::prepare(const Shape& shape, void* data, TVG_UNUSED const RenderTransform* transform, TVG_UNUSED uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags)
{
//prepare shape data
GlShape* sdata = static_cast<GlShape*>(data);
public:
Surface surface = {nullptr, 0, 0, 0};
- void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) override;
- void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) override;
+ void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) override;
+ void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) override;
bool dispose(void *data) override;
void* beginComposite(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
bool endComposite(void* ctx, uint32_t opacity) override;
Matrix* transform = nullptr;
SwSurface* surface = nullptr;
RenderUpdateFlag flags = RenderUpdateFlag::None;
- vector<Composite> compList;
+ Array<Composite> compList;
uint32_t opacity;
virtual bool dispose() = 0;
shape outline below stroke could be full covered by stroke drawing.
Thus it turns off antialising in that condition. */
auto antiAlias = (strokeAlpha == 255 && strokeWidth > 2) ? false : true;
- if (!shapeGenRle(&shape, sdata, clip, antiAlias, compList.size() > 0 ? true : false)) goto end;
+ if (!shapeGenRle(&shape, sdata, clip, antiAlias, compList.count > 0 ? true : false)) goto end;
++addStroking;
}
}
}
//Composition
- for (auto comp : compList) {
- if (comp.method == CompositeMethod::ClipPath) {
- auto compShape = &static_cast<SwShapeTask*>(comp.edata)->shape;
+ for (auto comp = compList.data; comp < (compList.data + compList.count); ++comp) {
+ if ((*comp).method == CompositeMethod::ClipPath) {
+ auto compShape = &static_cast<SwShapeTask*>((*comp).edata)->shape;
//Clip shape rle
if (shape.rle) {
if (compShape->rect) rleClipRect(shape.rle, &compShape->bbox);
if (!imagePrepare(&image, pdata, tid, clip, transform)) goto end;
//Composition?
- if (compList.size() > 0) {
+ if (compList.count > 0) {
if (!imageGenRle(&image, pdata, clip, false, true)) goto end;
if (image.rle) {
- for (auto comp : compList) {
- if (comp.method == CompositeMethod::ClipPath) {
- auto compShape = &static_cast<SwShapeTask*>(comp.edata)->shape;
+ for (auto comp = compList.data; comp < (compList.data + compList.count); ++comp) {
+ if ((*comp).method == CompositeMethod::ClipPath) {
+ auto compShape = &static_cast<SwShapeTask*>((*comp).edata)->shape;
if (compShape->rect) rleClipRect(image.rle, &compShape->bbox);
else if (compShape->rle) rleClipPath(image.rle, compShape->rle);
}
bool SwRenderer::clear()
{
- for (auto task : tasks) task->done();
+ for (auto task = tasks.data; task < (tasks.data + tasks.count); ++task) (*task)->done();
tasks.clear();
return true;
}
-void SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags)
+void SwRenderer::prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags)
{
- if (compList.size() > 0) {
+ if (compList.count > 0) {
//Guarantee composition targets get ready.
- for (auto comp : compList) static_cast<SwShapeTask*>(comp.edata)->done();
- task->compList.assign(compList.begin(), compList.end());
+ for (auto comp = compList.data; comp < (compList.data + compList.count); ++comp) {
+ static_cast<SwShapeTask*>((*comp).edata)->done();
+ }
+ task->compList = compList;
}
if (transform) {
task->surface = surface;
task->flags = flags;
- tasks.push_back(task);
+ tasks.push(task);
TaskScheduler::request(task);
}
-void* SwRenderer::prepare(const Picture& pdata, void* data, uint32_t *pixels, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags)
+void* SwRenderer::prepare(const Picture& pdata, void* data, uint32_t *pixels, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags)
{
//prepare task
auto task = static_cast<SwImageTask*>(data);
}
-void* SwRenderer::prepare(const Shape& sdata, void* data, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags)
+void* SwRenderer::prepare(const Shape& sdata, void* data, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags)
{
//prepare task
auto task = static_cast<SwShapeTask*>(data);
#ifndef _TVG_SW_RENDERER_H_
#define _TVG_SW_RENDERER_H_
-#include <vector>
#include "tvgRender.h"
struct SwSurface;
class SwRenderer : public RenderMethod
{
public:
- void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) override;
- void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) override;
+ void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) override;
+ void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) override;
void* beginComposite(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override;
bool endComposite(void* ctx, uint32_t opacity) override;
bool dispose(void *data) override;
static bool term();
private:
- SwSurface* surface = nullptr;
- vector<SwTask*> tasks;
+ SwSurface* surface = nullptr;
+ Array<SwTask*> tasks;
SwRenderer(){};
~SwRenderer();
- void prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags);
+ void prepareCommon(SwTask* task, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags);
};
}
auto clipSpans = clip->spans;
auto clipEnd = clip->spans + clip->size;
- while (spanCnt && spans < end ) {
+ while (spanCnt > 0 && spans < end ) {
if (clipSpans > clipEnd) {
spans = end;
break;
#ifndef _TVG_ARRAY_H_
#define _TVG_ARRAY_H_
+#include <memory.h>
namespace tvg
{
data[count++] = element;
}
+ void reserve(uint32_t size)
+ {
+ if (size > reserved) {
+ reserved = size;
+ data = static_cast<T*>(realloc(data, sizeof(T) * reserved));
+ }
+ }
+
void pop()
{
if (count > 0) --count;
}
- void clear()
+ void reset()
{
if (data) {
free(data);
count = reserved = 0;
}
+ void clear()
+ {
+ count = 0;
+ }
+
+ void operator=(const Array& rhs)
+ {
+ reserve(rhs.count);
+ memcpy(data, rhs.data, sizeof(T) * reserved);
+ count = rhs.count;
+ }
+
~Array()
{
if (data) free(data);
#ifndef _TVG_CANVAS_IMPL_H_
#define _TVG_CANVAS_IMPL_H_
-#include <vector>
#include "tvgPaint.h"
/************************************************************************/
struct Canvas::Impl
{
- vector<Paint*> paints;
+ Array<Paint*> paints;
RenderMethod* renderer;
Impl(RenderMethod* pRenderer):renderer(pRenderer)
{
auto p = paint.release();
if (!p) return Result::MemoryCorruption;
- paints.push_back(p);
+ paints.push(p);
return update(p);
}
//free paints
if (free) {
- for (auto paint : paints) {
- paint->pImpl->dispose(*renderer);
- delete(paint);
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ (*paint)->pImpl->dispose(*renderer);
+ delete(*paint);
}
}
{
if (!renderer) return Result::InsufficientCondition;
- vector<Composite> compList;
+ Array<Composite> compList;
//Update single paint node
if (paint) {
paint->pImpl->update(*renderer, nullptr, 255, compList, RenderUpdateFlag::None);
//Update all retained paint nodes
} else {
- for (auto paint : paints) {
- paint->pImpl->update(*renderer, nullptr, 255, compList, RenderUpdateFlag::None);
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ (*paint)->pImpl->update(*renderer, nullptr, 255, compList, RenderUpdateFlag::None);
}
}
return Result::Success;
if (!renderer->preRender()) return Result::InsufficientCondition;
- for (auto paint : paints) {
- if (!paint->pImpl->render(*renderer)) return Result::InsufficientCondition;
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ if (!(*paint)->pImpl->render(*renderer)) return Result::InsufficientCondition;
}
if (!renderer->postRender()) return Result::InsufficientCondition;
#include <math.h>
#include "tvgRender.h"
+
namespace tvg
{
struct StrategyMethod
virtual ~StrategyMethod() {}
virtual bool dispose(RenderMethod& renderer) = 0;
- virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, vector<Composite> compList, RenderUpdateFlag pFlag) = 0; //Return engine data if it has.
+ virtual void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag pFlag) = 0; //Return engine data if it has.
virtual bool render(RenderMethod& renderer) = 0;
virtual bool bounds(float* x, float* y, float* w, float* h) const = 0;
virtual Paint* duplicate() = 0;
uint8_t opacity = 255;
~Impl() {
+ if (compTarget) delete(compTarget);
if (smethod) delete(smethod);
if (rTransform) delete(rTransform);
}
return smethod->dispose(renderer);
}
- void* update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, vector<Composite>& compList, uint32_t pFlag)
+ void* update(RenderMethod& renderer, const RenderTransform* pTransform, uint32_t opacity, Array<Composite>& compList, uint32_t pFlag)
{
if (flag & RenderUpdateFlag::Transform) {
if (!rTransform) return nullptr;
if (compTarget && compMethod == CompositeMethod::ClipPath) {
compdata = compTarget->pImpl->update(renderer, pTransform, opacity, compList, pFlag);
- if (compdata) compList.push_back({compdata, compMethod});
+ if (compdata) compList.push({compdata, compMethod});
}
void *edata = nullptr;
edata = smethod->update(renderer, outTransform, opacity, compList, newFlag);
}
- if (compdata) compList.pop_back();
+ if (compdata) compList.pop();
return edata;
}
return inst->dispose(renderer);
}
- void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, vector<Composite> compList, RenderUpdateFlag flag) override
+ void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flag) override
{
return inst->update(renderer, transform, opacity, compList, flag);
}
return RenderUpdateFlag::None;
}
- void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag pFlag)
+ void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag pFlag)
{
uint32_t flag = reload();
#ifndef _TVG_RENDER_H_
#define _TVG_RENDER_H_
-#include <vector>
#include "tvgCommon.h"
+#include "tvgArray.h"
namespace tvg
{
{
public:
virtual ~RenderMethod() {}
- virtual void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) = 0;
- virtual void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flags) = 0;
+ virtual void* prepare(const Shape& shape, void* data, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) = 0;
+ virtual void* prepare(const Picture& picture, void* data, uint32_t *buffer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flags) = 0;
virtual void* beginComposite(uint32_t x, uint32_t y, uint32_t w, uint32_t h) = 0;
virtual bool endComposite(void* ctx, uint32_t opacity) = 0;
virtual bool dispose(void *data) = 0;
{
auto p = paint.release();
if (!p) return Result::MemoryCorruption;
- pImpl->paints.push_back(p);
+ pImpl->paints.push(p);
return Result::Success;
}
#ifndef _TVG_SCENE_IMPL_H_
#define _TVG_SCENE_IMPL_H_
-#include <vector>
#include "tvgPaint.h"
/************************************************************************/
struct Scene::Impl
{
- vector<Paint*> paints;
+ Array<Paint*> paints;
uint32_t opacity;
bool dispose(RenderMethod& renderer)
{
- for (auto paint : paints) {
- paint->pImpl->dispose(renderer);
- delete(paint);
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ (*paint)->pImpl->dispose(renderer);
+ delete(*paint);
}
paints.clear();
return true;
}
- void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag flag)
+ void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag flag)
{
this->opacity = opacity;
This is necessary for scene composition */
void* edata = nullptr;
- for (auto paint : paints) {
- edata = paint->pImpl->update(renderer, transform, opacity, compList, static_cast<uint32_t>(flag));
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ edata = (*paint)->pImpl->update(renderer, transform, opacity, compList, static_cast<uint32_t>(flag));
}
return edata;
ctx = renderer.beginComposite(0, 0, 0, 0);
}
- for (auto paint : paints) {
- if (!paint->pImpl->render(renderer)) return false;
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ if (!(*paint)->pImpl->render(renderer)) return false;
}
if (ctx) return renderer.endComposite(ctx, opacity);
bool bounds(float* px, float* py, float* pw, float* ph)
{
- if (paints.size() == 0) return false;
+ if (paints.count == 0) return false;
auto x1 = FLT_MAX;
auto y1 = FLT_MAX;
auto x2 = 0.0f;
auto y2 = 0.0f;
- for (auto paint : paints) {
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
auto x = FLT_MAX;
auto y = FLT_MAX;
auto w = 0.0f;
auto h = 0.0f;
- if (!paint->pImpl->bounds(&x, &y, &w, &h)) continue;
+ if (!(*paint)->pImpl->bounds(&x, &y, &w, &h)) continue;
//Merge regions
if (x < x1) x1 = x;
if (!ret) return nullptr;
auto dup = ret.get()->pImpl;
- dup->paints.reserve(paints.size());
+ dup->paints.reserve(paints.count);
- for (auto paint : paints) {
- dup->paints.push_back(paint->duplicate());
+ for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) {
+ dup->paints.push((*paint)->duplicate());
}
return ret.release();
return renderer.render(*shape, edata);
}
- void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, vector<Composite>& compList, RenderUpdateFlag pFlag)
+ void* update(RenderMethod& renderer, const RenderTransform* transform, uint32_t opacity, Array<Composite>& compList, RenderUpdateFlag pFlag)
{
this->edata = renderer.prepare(*shape, this->edata, transform, opacity, compList, static_cast<RenderUpdateFlag>(pFlag | flag));
flag = RenderUpdateFlag::None;
if (!((int)child->stroke.flags & (int)SvgStrokeFlags::Dash)) {
if (parent->stroke.dash.array.count > 0) {
child->stroke.dash.array.clear();
+ child->stroke.dash.array.reserve(parent->stroke.dash.array.count);
for (uint32_t i = 0; i < parent->stroke.dash.array.count; ++i) {
child->stroke.dash.array.push(parent->stroke.dash.array.data[i]);
}
auto colorStop = grad->stops.data[i];
free(colorStop);
}
- grad->stops.clear();
+ grad->stops.reset();
free(grad);
}
_freeGradientStyle(style->fill.paint.gradient);
delete style->fill.paint.url;
_freeGradientStyle(style->stroke.paint.gradient);
- if (style->stroke.dash.array.count > 0) style->stroke.dash.array.clear();
+ if (style->stroke.dash.array.count > 0) style->stroke.dash.array.reset();
delete style->stroke.paint.url;
free(style);
}
for (uint32_t i = 0; i < node->child.count; ++i, ++child) {
_freeNode(*child);
}
- node->child.clear();
+ node->child.reset();
delete node->id;
free(node->transform);
_freeGradientStyle(*gradients);
++gradients;
}
- node->node.defs.gradients.clear();
+ node->node.defs.gradients.reset();
break;
}
default: {
_freeGradientStyle(*gradients);
++gradients;
}
- loaderData.gradients.clear();
+ loaderData.gradients.reset();
_freeNode(loaderData.doc);
loaderData.doc = nullptr;
- loaderData.stack.clear();
+ loaderData.stack.reset();
return true;
}