KHTML
SVGGlyphElement.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "wtf/Platform.h"
00023
00024 #if ENABLE(SVG_FONTS)
00025 #include "SVGGlyphElement.h"
00026
00027 #include "SVGFontElement.h"
00028
00029 #include "SVGFontData.h"
00030 #include "SVGNames.h"
00031 #include "SVGParserUtilities.h"
00032
00033
00034
00035 namespace WebCore {
00036
00037 using namespace SVGNames;
00038
00039 SVGGlyphElement::SVGGlyphElement(const QualifiedName& tagName, Document* doc)
00040 : SVGStyledElement(tagName, doc)
00041 {
00042 }
00043
00044 SVGGlyphElement::~SVGGlyphElement()
00045 {
00046 }
00047
00048 void SVGGlyphElement::insertedIntoDocument()
00049 {
00050 Node* fontNode = parentNode();
00051 if (fontNode && fontNode->hasTagName(fontTag)) {
00052 if (SVGFontElement* element = static_cast<SVGFontElement*>(fontNode))
00053 element->invalidateGlyphCache();
00054 }
00055 SVGStyledElement::insertedIntoDocument();
00056 }
00057
00058 void SVGGlyphElement::removedFromDocument()
00059 {
00060 Node* fontNode = parentNode();
00061 if (fontNode && fontNode->hasTagName(fontTag)) {
00062 if (SVGFontElement* element = static_cast<SVGFontElement*>(fontNode))
00063 element->invalidateGlyphCache();
00064 }
00065 SVGStyledElement::removedFromDocument();
00066 }
00067
00068 static inline SVGGlyphIdentifier::ArabicForm parseArabicForm(const AtomicString& value)
00069 {
00070 if (value == "medial")
00071 return SVGGlyphIdentifier::Medial;
00072 else if (value == "terminal")
00073 return SVGGlyphIdentifier::Terminal;
00074 else if (value == "isolated")
00075 return SVGGlyphIdentifier::Isolated;
00076 else if (value == "initial")
00077 return SVGGlyphIdentifier::Initial;
00078
00079 return SVGGlyphIdentifier::None;
00080 }
00081
00082 static inline SVGGlyphIdentifier::Orientation parseOrientation(const AtomicString& value)
00083 {
00084 if (value == "h")
00085 return SVGGlyphIdentifier::Horizontal;
00086 else if (value == "v")
00087 return SVGGlyphIdentifier::Vertical;
00088
00089 return SVGGlyphIdentifier::Both;
00090 }
00091
00092 static inline Path parsePathData(const AtomicString& value)
00093 {
00094 Path result;
00095 pathFromSVGData(result, value);
00096
00097 return result;
00098 }
00099
00100 void SVGGlyphElement::inheritUnspecifiedAttributes(SVGGlyphIdentifier& identifier, const SVGFontData* svgFontData)
00101 {
00102 if (identifier.horizontalAdvanceX == SVGGlyphIdentifier::inheritedValue())
00103 identifier.horizontalAdvanceX = svgFontData->horizontalAdvanceX();
00104
00105 if (identifier.verticalOriginX == SVGGlyphIdentifier::inheritedValue())
00106 identifier.verticalOriginX = svgFontData->verticalOriginX();
00107
00108 if (identifier.verticalOriginY == SVGGlyphIdentifier::inheritedValue())
00109 identifier.verticalOriginY = svgFontData->verticalOriginY();
00110
00111 if (identifier.verticalAdvanceY == SVGGlyphIdentifier::inheritedValue())
00112 identifier.verticalAdvanceY = svgFontData->verticalAdvanceY();
00113 }
00114
00115 static inline float parseSVGGlyphAttribute(const SVGElement* element, const WebCore::QualifiedName& name)
00116 {
00117 AtomicString value(element->getAttribute(name));
00118 if (value.isEmpty())
00119 return SVGGlyphIdentifier::inheritedValue();
00120
00121 return value.string().string().toFloat();
00122 }
00123
00124 SVGGlyphIdentifier SVGGlyphElement::buildGenericGlyphIdentifier(const SVGElement* element)
00125 {
00126 SVGGlyphIdentifier identifier;
00127 identifier.pathData = parsePathData(element->getAttribute(dAttr));
00128
00129
00130
00131
00132
00133 identifier.horizontalAdvanceX = parseSVGGlyphAttribute(element, horiz_adv_xAttr);
00134
00135
00136
00137
00138 identifier.verticalOriginX = parseSVGGlyphAttribute(element, vert_origin_xAttr);
00139
00140
00141
00142
00143 identifier.verticalOriginY = parseSVGGlyphAttribute(element, vert_origin_yAttr);
00144
00145
00146
00147
00148 identifier.verticalAdvanceY = parseSVGGlyphAttribute(element, vert_adv_yAttr);
00149
00150 return identifier;
00151 }
00152
00153 SVGGlyphIdentifier SVGGlyphElement::buildGlyphIdentifier() const
00154 {
00155 SVGGlyphIdentifier identifier(buildGenericGlyphIdentifier(this));
00156 identifier.glyphName = getAttribute(glyph_nameAttr);
00157 identifier.orientation = parseOrientation(getAttribute(orientationAttr));
00158 identifier.arabicForm = parseArabicForm(getAttribute(arabic_formAttr));
00159
00160 String language = getAttribute(langAttr);
00161 if (!language.isEmpty())
00162 identifier.languages = parseDelimitedString(language, ',');
00163
00164 return identifier;
00165 }
00166
00167 }
00168
00169 #endif // ENABLE(SVG_FONTS)