18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2008 Rob Buis <buis@kde.org> 5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or 7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public 8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either 9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version. 10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful, 12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details. 15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License 17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB. If not, write to 18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA. 20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */ 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS) 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGGlyphElement.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h" 285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGFontData.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontElement.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontFaceElement.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathParserFactory.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XMLNames.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace SVGNames; 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monseninline SVGGlyphElement::SVGGlyphElement(const QualifiedName& tagName, Document* document) 415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen : SVGStyledElement(tagName, document) 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<SVGGlyphElement> SVGGlyphElement::create(const QualifiedName& tagName, Document* document) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return adoptRef(new SVGGlyphElement(tagName, document)); 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGGlyphElement::invalidateGlyphCache() 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ContainerNode* fontNode = parentNode(); 53d0825bca7fe65beaee391d30da42e937db621564Steve Block if (fontNode && fontNode->hasTagName(SVGNames::fontTag)) { 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SVGFontElement* element = static_cast<SVGFontElement*>(fontNode)) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project element->invalidateGlyphCache(); 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid SVGGlyphElement::parseMappedAttribute(Attribute* attr) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (attr->name() == SVGNames::dAttr) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidateGlyphCache(); 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGStyledElement::parseMappedAttribute(attr); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGGlyphElement::insertedIntoDocument() 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidateGlyphCache(); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGStyledElement::insertedIntoDocument(); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGGlyphElement::removedFromDocument() 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project invalidateGlyphCache(); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGStyledElement::removedFromDocument(); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline SVGGlyphIdentifier::ArabicForm parseArabicForm(const AtomicString& value) 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value == "medial") 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Medial; 83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (value == "terminal") 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Terminal; 85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (value == "isolated") 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Isolated; 87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (value == "initial") 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Initial; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::None; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline SVGGlyphIdentifier::Orientation parseOrientation(const AtomicString& value) 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value == "h") 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Horizontal; 97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (value == "v") 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Vertical; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::Both; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline Path parsePathData(const AtomicString& value) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Path result; 106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch SVGPathParserFactory* factory = SVGPathParserFactory::self(); 107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch factory->buildPathFromString(value, result); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGGlyphElement::inheritUnspecifiedAttributes(SVGGlyphIdentifier& identifier, const SVGFontData* svgFontData) 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (identifier.horizontalAdvanceX == SVGGlyphIdentifier::inheritedValue()) 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.horizontalAdvanceX = svgFontData->horizontalAdvanceX(); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (identifier.verticalOriginX == SVGGlyphIdentifier::inheritedValue()) 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalOriginX = svgFontData->verticalOriginX(); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (identifier.verticalOriginY == SVGGlyphIdentifier::inheritedValue()) 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalOriginY = svgFontData->verticalOriginY(); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (identifier.verticalAdvanceY == SVGGlyphIdentifier::inheritedValue()) 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalAdvanceY = svgFontData->verticalAdvanceY(); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline float parseSVGGlyphAttribute(const SVGElement* element, const WebCore::QualifiedName& name) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AtomicString value(element->getAttribute(name)); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (value.isEmpty()) 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return SVGGlyphIdentifier::inheritedValue(); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return value.toFloat(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1352fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockAttributeToPropertyTypeMap& SVGGlyphElement::attributeToPropertyTypeMap() 1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, s_attributeToPropertyTypeMap, ()); 1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return s_attributeToPropertyTypeMap; 1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SVGGlyphElement::fillAttributeToPropertyTypeMap() 1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block AttributeToPropertyTypeMap& attributeToPropertyTypeMap = this->attributeToPropertyTypeMap(); 1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block SVGStyledElement::fillPassedAttributeToPropertyTypeMap(attributeToPropertyTypeMap); 1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block attributeToPropertyTypeMap.set(SVGNames::dAttr, AnimatedPath); 1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGGlyphIdentifier SVGGlyphElement::buildGenericGlyphIdentifier(const SVGElement* element) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGGlyphIdentifier identifier; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.pathData = parsePathData(element->getAttribute(dAttr)); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Spec: The horizontal advance after rendering the glyph in horizontal orientation. 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the attribute is not specified, the effect is as if the attribute were set to the 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // value of the font's horiz-adv-x attribute. Glyph widths are required to be non-negative, 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // even if the glyph is typically rendered right-to-left, as in Hebrew and Arabic scripts. 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.horizontalAdvanceX = parseSVGGlyphAttribute(element, horiz_adv_xAttr); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Spec: The X-coordinate in the font coordinate system of the origin of the glyph to be 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // used when drawing vertically oriented text. If the attribute is not specified, the effect 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is as if the attribute were set to the value of the font's vert-origin-x attribute. 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalOriginX = parseSVGGlyphAttribute(element, vert_origin_xAttr); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Spec: The Y-coordinate in the font coordinate system of the origin of a glyph to be 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // used when drawing vertically oriented text. If the attribute is not specified, the effect 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is as if the attribute were set to the value of the font's vert-origin-y attribute. 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalOriginY = parseSVGGlyphAttribute(element, vert_origin_yAttr); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Spec: The vertical advance after rendering a glyph in vertical orientation. 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the attribute is not specified, the effect is as if the attribute were set to the 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // value of the font's vert-adv-y attribute. 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.verticalAdvanceY = parseSVGGlyphAttribute(element, vert_adv_yAttr); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return identifier; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGGlyphIdentifier SVGGlyphElement::buildGlyphIdentifier() const 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGGlyphIdentifier identifier(buildGenericGlyphIdentifier(this)); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.glyphName = getAttribute(glyph_nameAttr); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.orientation = parseOrientation(getAttribute(orientationAttr)); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.arabicForm = parseArabicForm(getAttribute(arabic_formAttr)); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 185d0825bca7fe65beaee391d30da42e937db621564Steve Block String language = getAttribute(SVGNames::langAttr); 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!language.isEmpty()) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier.languages = parseDelimitedString(language, ','); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return identifier; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG_FONTS) 195