#include <cstring>
#include <fstream>
#include <float.h>
#include "tvgLoader.h"
#include "tvgXmlParser.h"
#include "tvgSvgLoader.h"
#include "tvgSvgSceneBuilder.h"
#include "tvgStr.h"
#include "tvgSvgCssStyle.h"
#include "tvgMath.h"
#define PX_PER_IN …
#define PX_PER_PC …
#define PX_PER_PT …
#define PX_PER_MM …
#define PX_PER_CM …
parseAttributes;
FactoryMethod;
GradientFactoryMethod;
static char* _skipSpace(const char* str, const char* end)
{ … }
static char* _copyId(const char* str)
{ … }
static const char* _skipComma(const char* content)
{ … }
static bool _parseNumber(const char** content, const char** end, float* number)
{ … }
static constexpr struct
{ … } alignTags[] = …;
static void _parseAspectRatio(const char** content, AspectRatioAlign* align, AspectRatioMeetOrSlice* meetOrSlice)
{ … }
static float _toFloat(const SvgParser* svgParse, const char* str, SvgParserLengthType type)
{ … }
static float _gradientToFloat(const SvgParser* svgParse, const char* str, bool& isPercentage)
{ … }
static float _toOffset(const char* str)
{ … }
static int _toOpacity(const char* str)
{ … }
static SvgMaskType _toMaskType(const char* str)
{ … }
static bool _toPaintOrder(const char* str)
{ … }
#define _PARSE_TAG(Type, Name, Name1, Tags_Array, Default) …
static constexpr struct
{ … } lineCapTags[] = …;
_PARSE_TAG(StrokeCap, lineCap, LineCap, lineCapTags, StrokeCap::Butt)
static constexpr struct
{ … } lineJoinTags[] = …;
_PARSE_TAG(StrokeJoin, lineJoin, LineJoin, lineJoinTags, StrokeJoin::Miter)
static constexpr struct
{ … } fillRuleTags[] = …;
_PARSE_TAG(FillRule, fillRule, FillRule, fillRuleTags, FillRule::Winding)
static void _parseDashArray(SvgLoaderData* loader, const char *str, SvgDash* dash)
{ … }
static char* _idFromUrl(const char* url)
{ … }
static unsigned char _parseColor(const char* value, char** end)
{ … }
static constexpr struct
{ … } colors[] = …;
static bool _hslToRgb(float hue, float saturation, float brightness, uint8_t* red, uint8_t* green, uint8_t* blue)
{ … }
static bool _toColor(const char* str, uint8_t* r, uint8_t* g, uint8_t* b, char** ref)
{ … }
static char* _parseNumbersArray(char* str, float* points, int* ptCount, int len)
{ … }
enum class MatrixState { … };
#define MATRIX_DEF(Name, Value) …
static constexpr struct
{ … } matrixTags[] = …;
static Matrix* _parseTransformationMatrix(const char* value)
{ … }
#define LENGTH_DEF(Name, Value) …
static void _postpone(Array<SvgNodeIdPair>& nodes, SvgNode *node, char* id)
{ … }
static bool _parseStyleAttr(void* data, const char* key, const char* value);
static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style);
static bool _attrParseSvgNode(void* data, const char* key, const char* value)
{ … }
static void _handlePaintAttr(SvgPaint* paint, const char* value)
{ … }
static void _handleColorAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleFillAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeDashArrayAttr(SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeDashOffsetAttr(SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeWidthAttr(SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeLineCapAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeLineJoinAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleStrokeMiterlimitAttr(SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleFillRuleAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleFillOpacityAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleTransformAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleClipPathAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleMaskAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleMaskTypeAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleDisplayAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handlePaintOrderAttr(TVG_UNUSED SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
static void _handleCssClassAttr(SvgLoaderData* loader, SvgNode* node, const char* value)
{ … }
styleMethod;
#define STYLE_DEF(Name, Name1, Flag) …
static constexpr struct
{ … } styleTags[] = …;
static bool _parseStyleAttr(void* data, const char* key, const char* value, bool style)
{ … }
static bool _parseStyleAttr(void* data, const char* key, const char* value)
{ … }
static bool _attrParseGNode(void* data, const char* key, const char* value)
{ … }
static bool _attrParseClipPathNode(void* data, const char* key, const char* value)
{ … }
static bool _attrParseMaskNode(void* data, const char* key, const char* value)
{ … }
static bool _attrParseCssStyleNode(void* data, const char* key, const char* value)
{ … }
static bool _attrParseSymbolNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createNode(SvgNode* parent, SvgNodeType type)
{ … }
static SvgNode* _createDefsNode(TVG_UNUSED SvgLoaderData* loader, TVG_UNUSED SvgNode* parent, const char* buf, unsigned bufLength, TVG_UNUSED parseAttributes func)
{ … }
static SvgNode* _createGNode(TVG_UNUSED SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createSvgNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createMaskNode(SvgLoaderData* loader, SvgNode* parent, TVG_UNUSED const char* buf, TVG_UNUSED unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createClipPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createCssStyleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createSymbolNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static bool _attrParsePathNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createPathNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } circleTags[] = …;
static bool _attrParseCircleNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createCircleNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } ellipseTags[] = …;
static bool _attrParseEllipseNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createEllipseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static bool _attrParsePolygonPoints(const char* str, SvgPolygonNode* polygon)
{ … }
static bool _attrParsePolygonNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createPolygonNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _createPolylineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } rectTags[] = …;
static bool _attrParseRectNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createRectNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } lineTags[] = …;
static bool _attrParseLineNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createLineNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static char* _idFromHref(const char* href)
{ … }
static constexpr struct
{ … } imageTags[] = …;
static bool _attrParseImageNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createImageNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static SvgNode* _getDefsNode(SvgNode* node)
{ … }
static SvgNode* _findNodeById(SvgNode *node, const char* id)
{ … }
static SvgNode* _findParentById(SvgNode* node, char* id, SvgNode* doc)
{ … }
static constexpr struct
{ … } useTags[] = …;
static void _cloneNode(SvgNode* from, SvgNode* parent, int depth);
static bool _attrParseUseNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createUseNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } textTags[] = …;
static bool _attrParseTextNode(void* data, const char* key, const char* value)
{ … }
static SvgNode* _createTextNode(SvgLoaderData* loader, SvgNode* parent, const char* buf, unsigned bufLength, parseAttributes func)
{ … }
static constexpr struct
{ … } graphicsTags[] = …;
static constexpr struct
{ … } groupTags[] = …;
#define FIND_FACTORY(Short_Name, Tags_Array) …
FIND_FACTORY(Group, groupTags)
FIND_FACTORY(Graphics, graphicsTags)
FillSpread _parseSpreadValue(const char* value)
{ … }
static void _handleRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _handleRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _handleRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _handleRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _handleRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _handleRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, const char* value)
{ … }
static void _recalcRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialCxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialCyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialFxAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialFyAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialFrAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _recalcInheritedRadialRAttr(SvgLoaderData* loader, SvgRadialGradient* radial, bool userSpace)
{ … }
static void _inheritRadialCxAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritRadialCyAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritRadialFxAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritRadialFyAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritRadialFrAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritRadialRAttr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
radialMethod;
radialInheritMethod;
radialMethodRecalc;
#define RADIAL_DEF(Name, Name1, Flag) …
static constexpr struct
{ … } radialTags[] = …;
static bool _attrParseRadialGradientNode(void* data, const char* key, const char* value)
{ … }
static SvgStyleGradient* _createRadialGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength)
{ … }
static bool _attrParseStopsStyle(void* data, const char* key, const char* value)
{ … }
static bool _attrParseStops(void* data, const char* key, const char* value)
{ … }
static void _handleLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value)
{ … }
static void _handleLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value)
{ … }
static void _handleLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value)
{ … }
static void _handleLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, const char* value)
{ … }
static void _recalcLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcInheritedLinearX1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcInheritedLinearX2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcInheritedLinearY1Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _recalcInheritedLinearY2Attr(SvgLoaderData* loader, SvgLinearGradient* linear, bool userSpace)
{ … }
static void _inheritLinearX1Attr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritLinearX2Attr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritLinearY1Attr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static void _inheritLinearY2Attr(SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
Linear_Method;
Linear_Inherit_Method;
Linear_Method_Recalc;
#define LINEAR_DEF(Name, Name1, Flag) …
static constexpr struct
{ … } linear_tags[] = …;
static bool _attrParseLinearGradientNode(void* data, const char* key, const char* value)
{ … }
static SvgStyleGradient* _createLinearGradient(SvgLoaderData* loader, const char* buf, unsigned bufLength)
{ … }
#define GRADIENT_DEF(Name, Name1) …
static constexpr struct
{ … } gradientTags[] = …;
static GradientFactoryMethod _findGradientFactory(const char* name)
{ … }
static void _cloneGradStops(Array<Fill::ColorStop>& dst, const Array<Fill::ColorStop>& src)
{ … }
static void _inheritGradient(SvgLoaderData* loader, SvgStyleGradient* to, SvgStyleGradient* from)
{ … }
static SvgStyleGradient* _cloneGradient(SvgStyleGradient* from)
{ … }
static void _styleInherit(SvgStyleProperty* child, const SvgStyleProperty* parent)
{ … }
static void _styleCopy(SvgStyleProperty* to, const SvgStyleProperty* from)
{ … }
static void _copyAttr(SvgNode* to, const SvgNode* from)
{ … }
static void _cloneNode(SvgNode* from, SvgNode* parent, int depth)
{ … }
static void _clonePostponedNodes(Array<SvgNodeIdPair>* cloneNodes, SvgNode* doc)
{ … }
static void _svgLoaderParserXmlClose(SvgLoaderData* loader, const char* content, unsigned int length)
{ … }
static void _svgLoaderParserXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length, bool empty)
{ … }
static void _svgLoaderParserText(SvgLoaderData* loader, const char* content, unsigned int length)
{ … }
static void _svgLoaderParserXmlCssStyle(SvgLoaderData* loader, const char* content, unsigned int length)
{ … }
static bool _svgLoaderParser(void* data, SimpleXMLType type, const char* content, unsigned int length)
{ … }
static void _inefficientNodeCheck(TVG_UNUSED SvgNode* node)
{ … }
static void _updateStyle(SvgNode* node, SvgStyleProperty* parentStyle)
{ … }
static SvgStyleGradient* _gradientDup(SvgLoaderData* loader, Array<SvgStyleGradient*>* gradients, const char* id)
{ … }
static void _updateGradient(SvgLoaderData* loader, SvgNode* node, Array<SvgStyleGradient*>* gradients)
{ … }
static void _updateComposite(SvgNode* node, SvgNode* root)
{ … }
static void _freeNodeStyle(SvgStyleProperty* style)
{ … }
static void _freeNode(SvgNode* node)
{ … }
static bool _svgLoaderParserForValidCheckXmlOpen(SvgLoaderData* loader, const char* content, unsigned int length)
{ … }
static bool _svgLoaderParserForValidCheck(void* data, SimpleXMLType type, const char* content, unsigned int length)
{ … }
void SvgLoader::clear(bool all)
{ … }
SvgLoader::SvgLoader() : … { … }
SvgLoader::~SvgLoader()
{ … }
void SvgLoader::run(unsigned tid)
{ … }
bool SvgLoader::header()
{ … }
bool SvgLoader::open(const char* data, uint32_t size, bool copy)
{ … }
bool SvgLoader::open(const string& path)
{ … }
bool SvgLoader::resize(Paint* paint, float w, float h)
{ … }
bool SvgLoader::read()
{ … }
bool SvgLoader::close()
{ … }
Paint* SvgLoader::paint()
{ … }