18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> 3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2010 Dirk Schulze <krit@webkit.org> 5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or 7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public 8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either 9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version. 10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful, 12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details. 15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License 17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB. If not, write to 18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA. 20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */ 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SVG) && ENABLE(FILTERS) 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFEImageElement.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Attr.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h" 295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "CachedResourceLoader.h" 30a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ColorSpace.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 32ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "Image.h" 33ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "RenderObject.h" 34967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "RenderSVGResource.h" 35e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "SVGImageBufferTools.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPreserveAspectRatio.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// Animated property definitions 42f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_PRESERVEASPECTRATIO(SVGFEImageElement, SVGNames::preserveAspectRatioAttr, PreserveAspectRatio, preserveAspectRatio) 43f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_STRING(SVGFEImageElement, XLinkNames::hrefAttr, Href, href) 44f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochDEFINE_ANIMATED_BOOLEAN(SVGFEImageElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired) 45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monseninline SVGFEImageElement::SVGFEImageElement(const QualifiedName& tagName, Document* document) 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen : SVGFilterPrimitiveStandardAttributes(tagName, document) 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<SVGFEImageElement> SVGFEImageElement::create(const QualifiedName& tagName, Document* document) 525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return adoptRef(new SVGFEImageElement(tagName, document)); 545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGFEImageElement::~SVGFEImageElement() 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_cachedImage) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_cachedImage->removeClient(this); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 62d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid SVGFEImageElement::requestImageResource() 63d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 64d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_cachedImage) { 65d0825bca7fe65beaee391d30da42e937db621564Steve Block m_cachedImage->removeClient(this); 66d0825bca7fe65beaee391d30da42e937db621564Steve Block m_cachedImage = 0; 67d0825bca7fe65beaee391d30da42e937db621564Steve Block } 68d0825bca7fe65beaee391d30da42e937db621564Steve Block 69d0825bca7fe65beaee391d30da42e937db621564Steve Block Element* hrefElement = document()->getElementById(SVGURIReference::getTarget(href())); 70d0825bca7fe65beaee391d30da42e937db621564Steve Block if (hrefElement && hrefElement->isSVGElement() && hrefElement->renderer()) 71d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 72d0825bca7fe65beaee391d30da42e937db621564Steve Block 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_cachedImage = ownerDocument()->cachedResourceLoader()->requestImage(href()); 74d0825bca7fe65beaee391d30da42e937db621564Steve Block 75d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_cachedImage) 76d0825bca7fe65beaee391d30da42e937db621564Steve Block m_cachedImage->addClient(this); 77d0825bca7fe65beaee391d30da42e937db621564Steve Block} 78d0825bca7fe65beaee391d30da42e937db621564Steve Block 79e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid SVGFEImageElement::parseMappedAttribute(Attribute* attr) 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& value = attr->value(); 82d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attr->name() == SVGNames::preserveAspectRatioAttr) 83d0825bca7fe65beaee391d30da42e937db621564Steve Block SVGPreserveAspectRatio::parsePreserveAspectRatio(this, value); 84d0825bca7fe65beaee391d30da42e937db621564Steve Block else { 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SVGURIReference::parseMappedAttribute(attr)) { 86d0825bca7fe65beaee391d30da42e937db621564Steve Block requestImageResource(); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SVGLangSpace::parseMappedAttribute(attr)) 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (SVGExternalResourcesRequired::parseMappedAttribute(attr)) 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SVGFilterPrimitiveStandardAttributes::parseMappedAttribute(attr); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid SVGFEImageElement::svgAttributeChanged(const QualifiedName& attrName) 996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName); 1016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (attrName == SVGNames::preserveAspectRatioAttr) 1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner invalidate(); 1046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 1056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 106d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid SVGFEImageElement::synchronizeProperty(const QualifiedName& attrName) 107d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 108d0825bca7fe65beaee391d30da42e937db621564Steve Block SVGFilterPrimitiveStandardAttributes::synchronizeProperty(attrName); 109d0825bca7fe65beaee391d30da42e937db621564Steve Block 110d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attrName == anyQName()) { 111d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizePreserveAspectRatio(); 112d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizeHref(); 113d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizeExternalResourcesRequired(); 114d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 115d0825bca7fe65beaee391d30da42e937db621564Steve Block } 116d0825bca7fe65beaee391d30da42e937db621564Steve Block 117d0825bca7fe65beaee391d30da42e937db621564Steve Block if (attrName == SVGNames::preserveAspectRatioAttr) 118d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizePreserveAspectRatio(); 119d0825bca7fe65beaee391d30da42e937db621564Steve Block else if (SVGURIReference::isKnownAttribute(attrName)) 120d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizeHref(); 121d0825bca7fe65beaee391d30da42e937db621564Steve Block else if (SVGExternalResourcesRequired::isKnownAttribute(attrName)) 122d0825bca7fe65beaee391d30da42e937db621564Steve Block synchronizeExternalResourcesRequired(); 123d0825bca7fe65beaee391d30da42e937db621564Steve Block} 124d0825bca7fe65beaee391d30da42e937db621564Steve Block 1252fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockAttributeToPropertyTypeMap& SVGFEImageElement::attributeToPropertyTypeMap() 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, s_attributeToPropertyTypeMap, ()); 1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return s_attributeToPropertyTypeMap; 1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SVGFEImageElement::fillAttributeToPropertyTypeMap() 1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block AttributeToPropertyTypeMap& attributeToPropertyTypeMap = this->attributeToPropertyTypeMap(); 1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block SVGFilterPrimitiveStandardAttributes::fillPassedAttributeToPropertyTypeMap(attributeToPropertyTypeMap); 1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block attributeToPropertyTypeMap.set(SVGNames::preserveAspectRatioAttr, AnimatedPreserveAspectRatio); 1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block attributeToPropertyTypeMap.set(XLinkNames::hrefAttr, AnimatedString); 1382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SVGFEImageElement::notifyFinished(CachedResource*) 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 142967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!inDocument()) 143967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 144967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 145967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch Element* parent = parentElement(); 146967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(parent); 147967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 148967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!parent->hasTagName(SVGNames::filterTag) || !parent->renderer()) 149967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 150967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 151967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch RenderSVGResource::markForLayoutAndParentResourceInvalidation(parent->renderer()); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangPassRefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter* filter) 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 156d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!m_cachedImage && !m_targetImage) { 157d0825bca7fe65beaee391d30da42e937db621564Steve Block Element* hrefElement = document()->getElementById(SVGURIReference::getTarget(href())); 158d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!hrefElement || !hrefElement->isSVGElement()) 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 160d0825bca7fe65beaee391d30da42e937db621564Steve Block 161d0825bca7fe65beaee391d30da42e937db621564Steve Block RenderObject* renderer = hrefElement->renderer(); 162d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!renderer) 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 164d0825bca7fe65beaee391d30da42e937db621564Steve Block 165d0825bca7fe65beaee391d30da42e937db621564Steve Block IntRect targetRect = enclosingIntRect(renderer->objectBoundingBox()); 166a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_targetImage = ImageBuffer::create(targetRect.size(), ColorSpaceLinearRGB); 167d0825bca7fe65beaee391d30da42e937db621564Steve Block 168e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block AffineTransform contentTransformation; 169e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block SVGImageBufferTools::renderSubtreeToImageBuffer(m_targetImage.get(), renderer, contentTransformation); 170d0825bca7fe65beaee391d30da42e937db621564Steve Block } 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return FEImage::create(filter, m_targetImage ? m_targetImage->copyImage() : m_cachedImage->image(), preserveAspectRatio()); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SVGFEImageElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SVGFilterPrimitiveStandardAttributes::addSubresourceAttributeURLs(urls); 178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addSubresourceURL(urls, document()->completeURL(href())); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG) 185