mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +00:00
lottie: parsing embedded fonts data (#3220)
Only parsing and font loading is added with a very basic text update while building the scene. @Issue: https://github.com/thorvg/thorvg/issues/3184
This commit is contained in:
parent
7a1df343cc
commit
589e93fa74
5 changed files with 56 additions and 0 deletions
|
@ -994,6 +994,21 @@ void LottieBuilder::updateImage(LottieGroup* layer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _fontURLText(LottieText* text, Scene* main, float frameNo, LottieExpressions* exps)
|
||||||
|
{
|
||||||
|
auto& doc = text->doc(frameNo);
|
||||||
|
if (!doc.text) return;
|
||||||
|
|
||||||
|
const float ptPerPx = 0.75f; //1 pt = 1/72; 1 in = 96 px; -> 72/96 = 0.75
|
||||||
|
auto txt = Text::gen();
|
||||||
|
txt->font(doc.name, doc.size * 100.0f * ptPerPx);
|
||||||
|
txt->translate(0.0f, -doc.size * 100.0f);
|
||||||
|
txt->text(doc.text);
|
||||||
|
txt->fill(doc.color.rgb[0], doc.color.rgb[1], doc.color.rgb[2]);
|
||||||
|
main->push(std::move(txt));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
||||||
{
|
{
|
||||||
auto text = static_cast<LottieText*>(layer->children.first());
|
auto text = static_cast<LottieText*>(layer->children.first());
|
||||||
|
@ -1003,6 +1018,11 @@ void LottieBuilder::updateText(LottieLayer* layer, float frameNo)
|
||||||
|
|
||||||
if (!p || !text->font) return;
|
if (!p || !text->font) return;
|
||||||
|
|
||||||
|
if (text->font->origin == LottieFont::Origin::FontURL) {
|
||||||
|
_fontURLText(text, layer->scene, frameNo, exps);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto scale = doc.size;
|
auto scale = doc.size;
|
||||||
Point cursor = {0.0f, 0.0f};
|
Point cursor = {0.0f, 0.0f};
|
||||||
auto scene = Scene::gen();
|
auto scene = Scene::gen();
|
||||||
|
|
|
@ -197,6 +197,16 @@ float LottieTextRange::factor(float frameNo, float totalLen, float idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LottieFont::prepare()
|
||||||
|
{
|
||||||
|
if (!data.b64src || !name) return;
|
||||||
|
|
||||||
|
TaskScheduler::async(false);
|
||||||
|
Text::load(name, data.b64src, data.size, "ttf", false);
|
||||||
|
TaskScheduler::async(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LottieImage::prepare()
|
void LottieImage::prepare()
|
||||||
{
|
{
|
||||||
LottieObject::type = LottieObject::Image;
|
LottieObject::type = LottieObject::Image;
|
||||||
|
|
|
@ -303,14 +303,23 @@ struct LottieFont
|
||||||
free(style);
|
free(style);
|
||||||
free(family);
|
free(family);
|
||||||
free(name);
|
free(name);
|
||||||
|
free(data.b64src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct {
|
||||||
|
char* b64src = nullptr;
|
||||||
|
uint32_t size = 0;
|
||||||
|
} data;
|
||||||
|
|
||||||
Array<LottieGlyph*> chars;
|
Array<LottieGlyph*> chars;
|
||||||
char* name = nullptr;
|
char* name = nullptr;
|
||||||
char* family = nullptr;
|
char* family = nullptr;
|
||||||
char* style = nullptr;
|
char* style = nullptr;
|
||||||
|
size_t dataSize = 0;
|
||||||
float ascent = 0.0f;
|
float ascent = 0.0f;
|
||||||
Origin origin = Embedded;
|
Origin origin = Embedded;
|
||||||
|
|
||||||
|
void prepare();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LottieMarker
|
struct LottieMarker
|
||||||
|
|
|
@ -995,6 +995,19 @@ LottieObject* LottieParser::parseAsset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LottieParser::parseFontData(LottieFont* font, const char* data)
|
||||||
|
{
|
||||||
|
if (!data) return;
|
||||||
|
if (strncmp(data, "data:font/ttf;base64,", sizeof("data:font/ttf;base64,") - 1) != 0) {
|
||||||
|
TVGLOG("LOTTIE", "Unsupported embeded font data format");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ttf = data + sizeof("data:font/ttf;base64,") - 1;
|
||||||
|
font->data.size = b64Decode(ttf, strlen(ttf), &font->data.b64src);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LottieFont* LottieParser::parseFont()
|
LottieFont* LottieParser::parseFont()
|
||||||
{
|
{
|
||||||
enterObject();
|
enterObject();
|
||||||
|
@ -1005,10 +1018,13 @@ LottieFont* LottieParser::parseFont()
|
||||||
if (KEY_AS("fName")) font->name = getStringCopy();
|
if (KEY_AS("fName")) font->name = getStringCopy();
|
||||||
else if (KEY_AS("fFamily")) font->family = getStringCopy();
|
else if (KEY_AS("fFamily")) font->family = getStringCopy();
|
||||||
else if (KEY_AS("fStyle")) font->style = getStringCopy();
|
else if (KEY_AS("fStyle")) font->style = getStringCopy();
|
||||||
|
else if (KEY_AS("fPath")) parseFontData(font, getString());
|
||||||
else if (KEY_AS("ascent")) font->ascent = getFloat();
|
else if (KEY_AS("ascent")) font->ascent = getFloat();
|
||||||
else if (KEY_AS("origin")) font->origin = (LottieFont::Origin) getInt();
|
else if (KEY_AS("origin")) font->origin = (LottieFont::Origin) getInt();
|
||||||
else skip(key);
|
else skip(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
font->prepare();
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,7 @@ private:
|
||||||
LottieRepeater* parseRepeater();
|
LottieRepeater* parseRepeater();
|
||||||
LottieOffsetPath* parseOffsetPath();
|
LottieOffsetPath* parseOffsetPath();
|
||||||
LottieFont* parseFont();
|
LottieFont* parseFont();
|
||||||
|
void parseFontData(LottieFont* font, const char* data);
|
||||||
LottieMarker* parseMarker();
|
LottieMarker* parseMarker();
|
||||||
|
|
||||||
void parseEffect(LottieEffect* effect, void(LottieParser::*func)(LottieEffect*, int));
|
void parseEffect(LottieEffect* effect, void(LottieParser::*func)(LottieEffect*, int));
|
||||||
|
|
Loading…
Add table
Reference in a new issue