void FontTranslator::parseAttribute(ScriptCompiler* compiler, FontPtr& pFont, PropertyAbstractNode* prop) { String& attrib = prop->name; String val; if (attrib == "glyph") { float coords[4]; if (prop->values.size() != 5 || !getString(prop->values.front(), &val) || !getFloats(++prop->values.begin(), prop->values.end(), coords, 4)) { compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); return; } // Set // Support numeric and character glyph specification Font::CodePoint cp; if (val.size() > 1 && val[0] == 'u') { // Unicode glyph spec String trimmed = val.substr(1); cp = StringConverter::parseUnsignedInt(trimmed); } else { // Direct character cp = val[0]; } pFont->setGlyphTexCoords(cp, coords[0], coords[1], coords[2], coords[3], 1.0); // assume image is square } else if (attrib == "antialias_colour") { bool flag; if (prop->values.empty() || !getBoolean(prop->values.front(), &flag)) { compiler->addError(ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line); return; } pFont->setAntialiasColour(flag); } else if (attrib == "code_points") { if (prop->values.empty()) { compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); return; } for (auto& v : prop->values) { bool succ = getString(v, &val); StringVector itemVec = StringUtil::split(val, "-"); if (succ && itemVec.size() == 2) { pFont->addCodePointRange( Font::CodePointRange(StringConverter::parseUnsignedInt(itemVec[0]), StringConverter::parseUnsignedInt(itemVec[1]))); } } } else if (prop->values.empty() || !getString(prop->values.front(), &val) || !pFont->setParameter(attrib, val)) { compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); } }