mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 19:44:28 +00:00
loader lottie: support for stroke dash style
However, dash offset is still missing. The TVG canvas needs to add the stroke offset feature.
This commit is contained in:
parent
9960cc4794
commit
1b020f70c4
7 changed files with 60 additions and 12 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
src/examples/images/arrow_line.json
Normal file
1
src/examples/images/arrow_line.json
Normal file
File diff suppressed because one or more lines are too long
1
src/examples/images/loading_siri.json
Normal file
1
src/examples/images/loading_siri.json
Normal file
File diff suppressed because one or more lines are too long
|
@ -156,6 +156,13 @@ static Shape* _updateStroke(LottieSolidStroke* stroke, int32_t frameNo, Shape* b
|
|||
baseShape->stroke(stroke->cap);
|
||||
baseShape->stroke(stroke->join);
|
||||
baseShape->strokeMiterlimit(stroke->miterLimit);
|
||||
|
||||
//TODO: offset
|
||||
if (stroke->dashattr) {
|
||||
float dashes[2] = { stroke->dashSize(frameNo), stroke->dashGap(frameNo) };
|
||||
baseShape->stroke(dashes, 2);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,20 +32,53 @@ struct LottieComposition;
|
|||
|
||||
struct LottieStroke
|
||||
{
|
||||
struct DashAttr
|
||||
{
|
||||
//0: offset, 1: dash, 2: gap
|
||||
LottieFloat value[3] = {0.0f, 0.0f, 0.0f};
|
||||
};
|
||||
|
||||
virtual ~LottieStroke()
|
||||
{
|
||||
delete(dashattr);
|
||||
}
|
||||
|
||||
LottieFloat& dash(int no)
|
||||
{
|
||||
if (!dashattr) dashattr = new DashAttr;
|
||||
return dashattr->value[no];
|
||||
}
|
||||
|
||||
float dashOffset(int32_t frameNo)
|
||||
{
|
||||
return dash(0)(frameNo);
|
||||
}
|
||||
|
||||
float dashGap(int32_t frameNo)
|
||||
{
|
||||
return dash(1)(frameNo) + dash(2)(frameNo);
|
||||
}
|
||||
|
||||
float dashSize(int32_t frameNo)
|
||||
{
|
||||
return dash(1)(frameNo);
|
||||
}
|
||||
|
||||
bool dynamic()
|
||||
{
|
||||
if (dash.frames || width.frames) return true;
|
||||
if (width.frames || dashattr) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
LottieFloat dash = 0.0f;
|
||||
LottieFloat width = 0.0f;
|
||||
DashAttr* dashattr = nullptr;
|
||||
float miterLimit = 0;
|
||||
StrokeCap cap = StrokeCap::Butt;
|
||||
StrokeJoin join = StrokeJoin::Miter;
|
||||
float miterLimit = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct LottieGradient
|
||||
{
|
||||
bool dynamic()
|
||||
|
|
|
@ -586,8 +586,16 @@ void LottieParser::parseStrokeDash(LottieStroke* stroke)
|
|||
enterArray();
|
||||
while (nextArrayValue()) {
|
||||
enterObject();
|
||||
int idx = 0;
|
||||
while (auto key = nextObjectKey()) {
|
||||
if (!strcmp(key, "v")) {
|
||||
if (!strcmp(key, "n")) {
|
||||
auto style = getString();
|
||||
if (!strcmp("o", style)) idx = 0; //offset
|
||||
else if (!strcmp("d", style)) idx = 1; //dash
|
||||
else if (!strcmp("g", style)) idx = 2; //gap
|
||||
else TVGERR("LOTTIE", "Unsupported Dash Style");
|
||||
} else if (!strcmp(key, "v")) {
|
||||
parseProperty(stroke->dash(idx));
|
||||
} else skip(key);
|
||||
}
|
||||
}
|
||||
|
@ -609,12 +617,7 @@ LottieSolidStroke* LottieParser::parseSolidStroke()
|
|||
else if (!strcmp(key, "nm")) stroke->name = getStringCopy();
|
||||
else if (!strcmp(key, "hd")) stroke->hidden = getBool();
|
||||
else if (!strcmp(key, "fillEnabled")) stroke->disabled = !getBool();
|
||||
else if (!strcmp(key, "d"))
|
||||
{
|
||||
TVGLOG("LOTTIE", "StrokeDash(d) is not supported");
|
||||
skip(key);
|
||||
//parseStrokeDash(stroke);
|
||||
}
|
||||
else if (!strcmp(key, "d")) parseStrokeDash(stroke);
|
||||
else skip(key);
|
||||
}
|
||||
stroke->prepare();
|
||||
|
@ -998,6 +1001,11 @@ LottieLayer* LottieParser::parseLayer()
|
|||
}
|
||||
else if (!strcmp(key, "hd")) layer->hidden = getBool();
|
||||
else if (!strcmp(key, "refId")) layer->refId = getStringCopy();
|
||||
else if (!strcmp(key, "ef"))
|
||||
{
|
||||
TVGLOG("LOTTIE", "Effect(ef) is not supported");
|
||||
skip(key);
|
||||
}
|
||||
else skip(key);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue