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