SVGFontFaceUriElement.cpp revision 635860845790a19bf50bbc51ba8fb66a96dde068
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project   Copyright (C) 2009 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS)
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontFaceUriElement.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSFontFaceSrcValue.h"
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CachedFont.h"
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "DocLoader.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Document.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontFaceElement.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XLinkNames.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace SVGNames;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGFontFaceUriElement::SVGFontFaceUriElement(const QualifiedName& tagName, Document* doc)
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : SVGElement(tagName, doc)
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectSVGFontFaceUriElement::~SVGFontFaceUriElement()
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_cachedFont)
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont->removeClient(this);
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<CSSFontFaceSrcValue> SVGFontFaceUriElement::srcValue() const
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<CSSFontFaceSrcValue> src = CSSFontFaceSrcValue::create(getAttribute(XLinkNames::hrefAttr));
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString value(getAttribute(formatAttr));
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    src->setFormat(value.isEmpty() ? "svg" : value); // Default format
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return src.release();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGFontFaceUriElement::parseMappedAttribute(MappedAttribute* attr)
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const QualifiedName& attrName = attr->name();
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (attrName == XLinkNames::hrefAttr)
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        loadFont();
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SVGElement::parseMappedAttribute(attr);
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid SVGFontFaceUriElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!parentNode() || !parentNode()->hasTagName(font_face_srcTag))
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Node* grandParent = parentNode()->parentNode();
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (grandParent && grandParent->hasTagName(font_faceTag))
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static_cast<SVGFontFaceElement*>(grandParent)->rebuildFontFace();
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGFontFaceUriElement::insertedIntoDocument()
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    loadFont();
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SVGElement::insertedIntoDocument();
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGFontFaceUriElement::loadFont()
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (m_cachedFont)
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont->removeClient(this);
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String href = getAttribute(XLinkNames::hrefAttr);
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!href.isNull()) {
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        DocLoader* docLoader = document()->docLoader();
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont = docLoader->requestFont(href);
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont->setSVGFont(true);
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont->addClient(this);
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont->beginLoadIfNeeded(docLoader);
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_cachedFont = 0;
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG_FONTS)
103