1/* 2 * Copyright (C) 2011 Leo Yang <leoyang@webkit.org> 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20#include "config.h" 21 22#if ENABLE(SVG_FONTS) 23#include "core/svg/SVGAltGlyphItemElement.h" 24 25#include "core/dom/ElementTraversal.h" 26#include "core/svg/SVGGlyphRefElement.h" 27 28namespace blink { 29 30inline SVGAltGlyphItemElement::SVGAltGlyphItemElement(Document& document) 31 : SVGElement(SVGNames::altGlyphItemTag, document) 32{ 33} 34 35DEFINE_NODE_FACTORY(SVGAltGlyphItemElement) 36 37bool SVGAltGlyphItemElement::hasValidGlyphElements(Vector<AtomicString>& glyphNames) const 38{ 39 // Spec: http://www.w3.org/TR/SVG/text.html#AltGlyphItemElement 40 // The ‘altGlyphItem’ element defines a candidate set of possible glyph substitutions. 41 // The first ‘altGlyphItem’ element whose referenced glyphs are all available is chosen. 42 // Its glyphs are rendered instead of the character(s) that are inside of the referencing 43 // ‘altGlyph’ element. 44 // 45 // Here we fill glyphNames and return true only if all referenced glyphs are valid and 46 // there is at least one glyph. 47 for (SVGGlyphRefElement* glyph = Traversal<SVGGlyphRefElement>::firstChild(*this); glyph; glyph = Traversal<SVGGlyphRefElement>::nextSibling(*glyph)) { 48 AtomicString referredGlyphName; 49 if (glyph->hasValidGlyphElement(referredGlyphName)) { 50 glyphNames.append(referredGlyphName); 51 } else { 52 glyphNames.clear(); 53 return false; 54 } 55 } 56 return !glyphNames.isEmpty(); 57} 58 59} 60 61#endif 62