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 "SVGImageCache.h" 23 24#if ENABLE(SVG) 25#include "FrameView.h" 26#include "GraphicsContext.h" 27#include "ImageBuffer.h" 28#include "Page.h" 29#include "RenderSVGRoot.h" 30#include "SVGImage.h" 31#include "SVGImageForContainer.h" 32 33namespace WebCore { 34 35SVGImageCache::SVGImageCache(SVGImage* svgImage) 36 : m_svgImage(svgImage) 37{ 38 ASSERT(m_svgImage); 39} 40 41SVGImageCache::~SVGImageCache() 42{ 43 m_imageForContainerMap.clear(); 44} 45 46void SVGImageCache::removeClientFromCache(const CachedImageClient* client) 47{ 48 ASSERT(client); 49 50 if (m_imageForContainerMap.contains(client)) 51 m_imageForContainerMap.remove(client); 52} 53 54void SVGImageCache::setContainerSizeForRenderer(const CachedImageClient* client, const IntSize& containerSize, float containerZoom) 55{ 56 ASSERT(client); 57 ASSERT(!containerSize.isEmpty()); 58 ASSERT(containerZoom); 59 60 FloatSize containerSizeWithoutZoom(containerSize); 61 containerSizeWithoutZoom.scale(1 / containerZoom); 62 63 m_imageForContainerMap.set(client, SVGImageForContainer::create(m_svgImage, containerSizeWithoutZoom, containerZoom)); 64} 65 66IntSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const 67{ 68 IntSize imageSize = m_svgImage->size(); 69 if (!renderer) 70 return imageSize; 71 72 ImageForContainerMap::const_iterator it = m_imageForContainerMap.find(renderer); 73 if (it == m_imageForContainerMap.end()) 74 return imageSize; 75 76 RefPtr<SVGImageForContainer> imageForContainer = it->value; 77 ASSERT(!imageForContainer->size().isEmpty()); 78 return imageForContainer->size(); 79} 80 81// FIXME: This doesn't take into account the animation timeline so animations will not 82// restart on page load, nor will two animations in different pages have different timelines. 83Image* SVGImageCache::imageForRenderer(const RenderObject* renderer) 84{ 85 if (!renderer) 86 return Image::nullImage(); 87 88 ImageForContainerMap::iterator it = m_imageForContainerMap.find(renderer); 89 if (it == m_imageForContainerMap.end()) 90 return Image::nullImage(); 91 92 RefPtr<SVGImageForContainer> imageForContainer = it->value; 93 ASSERT(!imageForContainer->size().isEmpty()); 94 return imageForContainer.get(); 95} 96 97} // namespace WebCore 98 99#endif // ENABLE(SVG) 100