| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | |
| 3 * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> | |
| 4 * Copyright (C) 2008 Rob Buis <buis@kde.org> | |
| 5 * | |
| 6 * This library is free software; you can redistribute it and/or | |
| 7 * modify it under the terms of the GNU Library General Public | |
| 8 * License as published by the Free Software Foundation; either | |
| 9 * version 2 of the License, or (at your option) any later version. | |
| 10 * | |
| 11 * This library is distributed in the hope that it will be useful, | |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 * Library General Public License for more details. | |
| 15 * | |
| 16 * You should have received a copy of the GNU Library General Public License | |
| 17 * along with this library; see the file COPYING.LIB. If not, write to | |
| 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 19 * Boston, MA 02110-1301, USA. | |
| 20 */ | |
| 21 | |
| 22 #include "config.h" | |
| 23 | |
| 24 #if ENABLE(SVG_FONTS) | |
| 25 #include "core/svg/SVGGlyphElement.h" | |
| 26 | |
| 27 #include "core/svg/SVGFontData.h" | |
| 28 #include "core/svg/SVGFontElement.h" | |
| 29 #include "core/svg/SVGPathUtilities.h" | |
| 30 | |
| 31 namespace blink { | |
| 32 | |
| 33 inline SVGGlyphElement::SVGGlyphElement(Document& document) | |
| 34 : SVGElement(SVGNames::glyphTag, document) | |
| 35 { | |
| 36 } | |
| 37 | |
| 38 DEFINE_NODE_FACTORY(SVGGlyphElement) | |
| 39 | |
| 40 void SVGGlyphElement::invalidateGlyphCache() | |
| 41 { | |
| 42 ContainerNode* fontNode = parentNode(); | |
| 43 if (isSVGFontElement(fontNode)) | |
| 44 toSVGFontElement(*fontNode).invalidateGlyphCache(); | |
| 45 } | |
| 46 | |
| 47 void SVGGlyphElement::parseAttribute(const QualifiedName& name, const AtomicStri
ng& value) | |
| 48 { | |
| 49 if (name == SVGNames::dAttr) | |
| 50 invalidateGlyphCache(); | |
| 51 else | |
| 52 SVGElement::parseAttribute(name, value); | |
| 53 } | |
| 54 | |
| 55 Node::InsertionNotificationRequest SVGGlyphElement::insertedInto(ContainerNode*
rootParent) | |
| 56 { | |
| 57 invalidateGlyphCache(); | |
| 58 return SVGElement::insertedInto(rootParent); | |
| 59 } | |
| 60 | |
| 61 void SVGGlyphElement::removedFrom(ContainerNode* rootParent) | |
| 62 { | |
| 63 if (rootParent->inDocument()) | |
| 64 invalidateGlyphCache(); | |
| 65 SVGElement::removedFrom(rootParent); | |
| 66 } | |
| 67 | |
| 68 static inline SVGGlyph::ArabicForm parseArabicForm(const AtomicString& value) | |
| 69 { | |
| 70 if (value == "medial") | |
| 71 return SVGGlyph::Medial; | |
| 72 if (value == "terminal") | |
| 73 return SVGGlyph::Terminal; | |
| 74 if (value == "isolated") | |
| 75 return SVGGlyph::Isolated; | |
| 76 if (value == "initial") | |
| 77 return SVGGlyph::Initial; | |
| 78 | |
| 79 return SVGGlyph::None; | |
| 80 } | |
| 81 | |
| 82 static inline SVGGlyph::Orientation parseOrientation(const AtomicString& value) | |
| 83 { | |
| 84 if (value == "h") | |
| 85 return SVGGlyph::Horizontal; | |
| 86 if (value == "v") | |
| 87 return SVGGlyph::Vertical; | |
| 88 | |
| 89 return SVGGlyph::Both; | |
| 90 } | |
| 91 | |
| 92 void SVGGlyphElement::inheritUnspecifiedAttributes(SVGGlyph& identifier, const S
VGFontData* svgFontData) | |
| 93 { | |
| 94 if (identifier.horizontalAdvanceX == SVGGlyph::inheritedValue()) | |
| 95 identifier.horizontalAdvanceX = svgFontData->horizontalAdvanceX(); | |
| 96 | |
| 97 if (identifier.verticalOriginX == SVGGlyph::inheritedValue()) | |
| 98 identifier.verticalOriginX = svgFontData->verticalOriginX(); | |
| 99 | |
| 100 if (identifier.verticalOriginY == SVGGlyph::inheritedValue()) | |
| 101 identifier.verticalOriginY = svgFontData->verticalOriginY(); | |
| 102 | |
| 103 if (identifier.verticalAdvanceY == SVGGlyph::inheritedValue()) | |
| 104 identifier.verticalAdvanceY = svgFontData->verticalAdvanceY(); | |
| 105 } | |
| 106 | |
| 107 static inline float parseSVGGlyphAttribute(const SVGElement* element, const blin
k::QualifiedName& name) | |
| 108 { | |
| 109 AtomicString value(element->fastGetAttribute(name)); | |
| 110 if (value.isEmpty()) | |
| 111 return SVGGlyph::inheritedValue(); | |
| 112 | |
| 113 return value.toFloat(); | |
| 114 } | |
| 115 | |
| 116 SVGGlyph SVGGlyphElement::buildGenericGlyphIdentifier(const SVGElement* element) | |
| 117 { | |
| 118 SVGGlyph identifier; | |
| 119 buildPathFromString(element->fastGetAttribute(SVGNames::dAttr), identifier.p
athData); | |
| 120 | |
| 121 // Spec: The horizontal advance after rendering the glyph in horizontal orie
ntation. | |
| 122 // If the attribute is not specified, the effect is as if the attribute were
set to the | |
| 123 // value of the font's horiz-adv-x attribute. Glyph widths are required to b
e non-negative, | |
| 124 // even if the glyph is typically rendered right-to-left, as in Hebrew and A
rabic scripts. | |
| 125 identifier.horizontalAdvanceX = parseSVGGlyphAttribute(element, SVGNames::ho
riz_adv_xAttr); | |
| 126 | |
| 127 // Spec: The X-coordinate in the font coordinate system of the origin of the
glyph to be | |
| 128 // used when drawing vertically oriented text. If the attribute is not speci
fied, the effect | |
| 129 // is as if the attribute were set to the value of the font's vert-origin-x
attribute. | |
| 130 identifier.verticalOriginX = parseSVGGlyphAttribute(element, SVGNames::vert_
origin_xAttr); | |
| 131 | |
| 132 // Spec: The Y-coordinate in the font coordinate system of the origin of a g
lyph to be | |
| 133 // used when drawing vertically oriented text. If the attribute is not speci
fied, the effect | |
| 134 // is as if the attribute were set to the value of the font's vert-origin-y
attribute. | |
| 135 identifier.verticalOriginY = parseSVGGlyphAttribute(element, SVGNames::vert_
origin_yAttr); | |
| 136 | |
| 137 // Spec: The vertical advance after rendering a glyph in vertical orientatio
n. | |
| 138 // If the attribute is not specified, the effect is as if the attribute were
set to the | |
| 139 // value of the font's vert-adv-y attribute. | |
| 140 identifier.verticalAdvanceY = parseSVGGlyphAttribute(element, SVGNames::vert
_adv_yAttr); | |
| 141 | |
| 142 return identifier; | |
| 143 } | |
| 144 | |
| 145 SVGGlyph SVGGlyphElement::buildGlyphIdentifier() const | |
| 146 { | |
| 147 SVGGlyph identifier(buildGenericGlyphIdentifier(this)); | |
| 148 identifier.glyphName = fastGetAttribute(SVGNames::glyph_nameAttr); | |
| 149 identifier.orientation = parseOrientation(fastGetAttribute(SVGNames::orienta
tionAttr)); | |
| 150 identifier.arabicForm = parseArabicForm(fastGetAttribute(SVGNames::arabic_fo
rmAttr)); | |
| 151 | |
| 152 String language = fastGetAttribute(SVGNames::langAttr); | |
| 153 if (!language.isEmpty()) | |
| 154 identifier.languages = parseDelimitedString(language, ','); | |
| 155 | |
| 156 return identifier; | |
| 157 } | |
| 158 | |
| 159 } | |
| 160 | |
| 161 #endif // ENABLE(SVG_FONTS) | |
| OLD | NEW |