void SVGFontElement::ensureGlyphCache() { if (m_isGlyphCacheValid) return; SVGMissingGlyphElement* firstMissingGlyphElement = 0; Vector<String> ligatures; for (Node* child = firstChild(); child; child = child->nextSibling()) { if (child->hasTagName(SVGNames::glyphTag)) { SVGGlyphElement* glyph = static_cast<SVGGlyphElement*>(child); AtomicString unicode = glyph->fastGetAttribute(SVGNames::unicodeAttr); AtomicString glyphId = glyph->getIdAttribute(); if (glyphId.isEmpty() && unicode.isEmpty()) continue; m_glyphMap.addGlyph(glyphId, unicode, glyph->buildGlyphIdentifier()); // Register ligatures, if needed, don't mix up with surrogate pairs though! if (unicode.length() > 1 && !U16_IS_SURROGATE(unicode[0])) ligatures.append(unicode.string()); } else if (child->hasTagName(SVGNames::hkernTag)) { SVGHKernElement* hkern = static_cast<SVGHKernElement*>(child); hkern->buildHorizontalKerningPair(m_horizontalKerningPairs); } else if (child->hasTagName(SVGNames::vkernTag)) { SVGVKernElement* vkern = static_cast<SVGVKernElement*>(child); vkern->buildVerticalKerningPair(m_verticalKerningPairs); } else if (child->hasTagName(SVGNames::missing_glyphTag) && !firstMissingGlyphElement) firstMissingGlyphElement = static_cast<SVGMissingGlyphElement*>(child); } // Register each character of each ligature, if needed. if (!ligatures.isEmpty()) registerLigaturesInGlyphCache(ligatures); // Register missing-glyph element, if present. if (firstMissingGlyphElement) { SVGGlyph svgGlyph = SVGGlyphElement::buildGenericGlyphIdentifier(firstMissingGlyphElement); m_glyphMap.appendToGlyphTable(svgGlyph); m_missingGlyph = svgGlyph.tableEntry; ASSERT(m_missingGlyph > 0); } m_isGlyphCacheValid = true; }
void SVGFontElement::ensureGlyphCache() const { if (m_isGlyphCacheValid) return; for (Node* child = firstChild(); child; child = child->nextSibling()) { if (child->hasTagName(glyphTag)) { SVGGlyphElement* glyph = static_cast<SVGGlyphElement*>(child); String unicode = glyph->getAttribute(unicodeAttr); if (unicode.length()) m_glyphMap.add(unicode, glyph->buildGlyphIdentifier()); } else if (child->hasTagName(hkernTag)) { SVGHKernElement* hkern = static_cast<SVGHKernElement*>(child); SVGHorizontalKerningPair kerningPair = hkern->buildHorizontalKerningPair(); m_kerningPairs.append(kerningPair); } } m_isGlyphCacheValid = true; }