Reduce amount of rebuilding when touching networking headers
[WebKit-https.git] / Source / WebCore / svg / graphics / SVGImageCache.cpp
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
33 namespace WebCore {
34
35 SVGImageCache::SVGImageCache(SVGImage* svgImage)
36     : m_svgImage(svgImage)
37 {
38     ASSERT(m_svgImage);
39 }
40
41 SVGImageCache::~SVGImageCache()
42 {
43     m_imageForContainerMap.clear();
44 }
45
46 void SVGImageCache::removeClientFromCache(const CachedImageClient* client)
47 {
48     ASSERT(client);
49
50     if (m_imageForContainerMap.contains(client))
51         m_imageForContainerMap.remove(client);
52 }
53
54 void 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
66 IntSize 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> image = it->value;
77     ASSERT(!image->size().isEmpty());
78     return image->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.
83 Image* 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> image = it->value;
93     ASSERT(!image->size().isEmpty());
94     return image.get();
95 }
96
97 } // namespace WebCore
98
99 #endif // ENABLE(SVG)