1/* 2 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. 3 * Copyright (C) 2013 Apple Inc. All rights reserved. 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21#include "config.h" 22#include "core/svg/graphics/SVGImageCache.h" 23 24#include "core/fetch/ImageResource.h" 25#include "core/frame/FrameView.h" 26#include "core/html/HTMLImageElement.h" 27#include "core/page/Page.h" 28#include "core/rendering/svg/RenderSVGRoot.h" 29#include "core/svg/graphics/SVGImage.h" 30#include "core/svg/graphics/SVGImageForContainer.h" 31#include "platform/graphics/GraphicsContext.h" 32#include "platform/graphics/ImageBuffer.h" 33 34namespace WebCore { 35 36SVGImageCache::SVGImageCache(SVGImage* svgImage) 37 : m_svgImage(svgImage) 38{ 39 ASSERT(m_svgImage); 40} 41 42SVGImageCache::~SVGImageCache() 43{ 44 m_imageForContainerMap.clear(); 45} 46 47void SVGImageCache::removeClientFromCache(const ImageResourceClient* client) 48{ 49 ASSERT(client); 50 m_imageForContainerMap.remove(client); 51} 52 53void SVGImageCache::setContainerSizeForRenderer(const ImageResourceClient* client, const IntSize& containerSize, float containerZoom) 54{ 55 ASSERT(client); 56 ASSERT(!containerSize.isEmpty()); 57 ASSERT(containerZoom); 58 59 FloatSize containerSizeWithoutZoom(containerSize); 60 containerSizeWithoutZoom.scale(1 / containerZoom); 61 62 m_imageForContainerMap.set(client, SVGImageForContainer::create(m_svgImage, containerSizeWithoutZoom, containerZoom)); 63} 64 65IntSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const 66{ 67 IntSize imageSize = m_svgImage->size(); 68 if (!renderer) 69 return imageSize; 70 71 ImageForContainerMap::const_iterator it = m_imageForContainerMap.find(renderer); 72 if (it == m_imageForContainerMap.end()) 73 return imageSize; 74 75 RefPtr<SVGImageForContainer> imageForContainer = it->value; 76 ASSERT(!imageForContainer->size().isEmpty()); 77 return imageForContainer->size(); 78} 79 80// FIXME: This doesn't take into account the animation timeline so animations will not 81// restart on page load, nor will two animations in different pages have different timelines. 82Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) 83{ 84 if (!renderer) 85 return Image::nullImage(); 86 87 ImageForContainerMap::iterator it = m_imageForContainerMap.find(renderer); 88 if (it == m_imageForContainerMap.end()) 89 return Image::nullImage(); 90 91 RefPtr<SVGImageForContainer> imageForContainer = it->value; 92 ASSERT(!imageForContainer->size().isEmpty()); 93 94 Node* node = renderer->node(); 95 if (node && isHTMLImageElement(node)) { 96 const AtomicString& urlString = toHTMLImageElement(node)->imageSourceURL(); 97 KURL url = node->document().completeURL(urlString); 98 imageForContainer->setURL(url); 99 } 100 101 return imageForContainer.get(); 102} 103 104} // namespace WebCore 105