[TextureMapper] Scrolling through 01.org/dleyna crashes WebKitWebProcess
[WebKit-https.git] / Source / WebCore / platform / graphics / texmap / GraphicsLayerTextureMapper.h
1 /*
2     Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18 */
19
20 #ifndef GraphicsLayerTextureMapper_h
21 #define GraphicsLayerTextureMapper_h
22
23 #if !USE(COORDINATED_GRAPHICS)
24
25 #include "GraphicsLayer.h"
26 #include "GraphicsLayerClient.h"
27 #include "Image.h"
28 #include "TextureMapperLayer.h"
29 #include "TextureMapperPlatformLayer.h"
30 #include "TextureMapperTiledBackingStore.h"
31 #include "Timer.h"
32
33 namespace WebCore {
34
35 class GraphicsLayerTextureMapper final : public GraphicsLayer, TextureMapperPlatformLayer::Client {
36 public:
37     explicit GraphicsLayerTextureMapper(Type, GraphicsLayerClient&);
38     virtual ~GraphicsLayerTextureMapper();
39
40     void setScrollClient(TextureMapperLayer::ScrollingClient* client) { m_layer.setScrollClient(client); }
41     void setID(uint32_t id) { m_layer.setID(id); }
42
43     // GraphicsLayer
44     bool setChildren(const Vector<GraphicsLayer*>&) override;
45     void addChild(GraphicsLayer*) override;
46     void addChildAtIndex(GraphicsLayer*, int index) override;
47     void addChildAbove(GraphicsLayer*, GraphicsLayer* sibling) override;
48     void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling) override;
49     bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild) override;
50
51     void setMaskLayer(GraphicsLayer*) override;
52     void setReplicatedByLayer(GraphicsLayer*) override;
53     void setPosition(const FloatPoint&) override;
54     void setAnchorPoint(const FloatPoint3D&) override;
55     void setSize(const FloatSize&) override;
56     void setTransform(const TransformationMatrix&) override;
57     void setChildrenTransform(const TransformationMatrix&) override;
58     void setPreserves3D(bool) override;
59     void setMasksToBounds(bool) override;
60     void setDrawsContent(bool) override;
61     void setContentsVisible(bool) override;
62     void setContentsOpaque(bool) override;
63     void setBackfaceVisibility(bool) override;
64     void setOpacity(float) override;
65     bool setFilters(const FilterOperations&) override;
66
67     void setNeedsDisplay() override;
68     void setNeedsDisplayInRect(const FloatRect&, ShouldClipToLayer = ClipToLayer) override;
69     void setContentsNeedsDisplay() override;
70     void setContentsRect(const FloatRect&) override;
71
72     bool addAnimation(const KeyframeValueList&, const FloatSize&, const Animation*, const String&, double) override;
73     void pauseAnimation(const String&, double) override;
74     void removeAnimation(const String&) override;
75
76     void setContentsToImage(Image*) override;
77     void setContentsToSolidColor(const Color&) override;
78     void setContentsToPlatformLayer(PlatformLayer*, ContentsLayerPurpose) override;
79     bool usesContentsLayer() const override { return m_contentsLayer; }
80     PlatformLayer* platformLayer() const override { return m_contentsLayer; }
81
82     void setShowDebugBorder(bool) override;
83     void setDebugBorder(const Color&, float width) override;
84     void setShowRepaintCounter(bool) override;
85
86     void flushCompositingState(const FloatRect&, bool) override;
87     void flushCompositingStateForThisLayerOnly(bool) override;
88
89     void updateBackingStoreIncludingSubLayers();
90
91     TextureMapperLayer& layer() { return m_layer; }
92
93     void didCommitScrollOffset(const IntSize&);
94     void setIsScrollable(bool);
95     bool isScrollable() const { return m_isScrollable; }
96
97     void setFixedToViewport(bool);
98     bool fixedToViewport() const { return m_fixedToViewport; }
99
100     Color debugBorderColor() const { return m_debugBorderColor; }
101     float debugBorderWidth() const { return m_debugBorderWidth; }
102     void setRepaintCount(int);
103
104     void setAnimations(const TextureMapperAnimations&);
105
106 private:
107     // GraphicsLayer
108     bool isGraphicsLayerTextureMapper() const override { return true; }
109
110     // TextureMapperPlatformLayer::Client
111     void platformLayerWillBeDestroyed() override { setContentsToPlatformLayer(0, NoContentsLayer); }
112     void setPlatformLayerNeedsDisplay() override { setContentsNeedsDisplay(); }
113
114     void commitLayerChanges();
115     void updateDebugBorderAndRepaintCount();
116     void updateBackingStoreIfNeeded();
117     void prepareBackingStoreIfNeeded();
118     bool shouldHaveBackingStore() const;
119
120     bool filtersCanBeComposited(const FilterOperations&) const;
121
122     // This set of flags help us defer which properties of the layer have been
123     // modified by the compositor, so we can know what to look for in the next flush.
124     enum ChangeMask {
125         NoChanges =                 0,
126
127         ChildrenChange =            (1L << 1),
128         MaskLayerChange =           (1L << 2),
129         ReplicaLayerChange =        (1L << 3),
130
131         ContentChange =             (1L << 4),
132         ContentsRectChange =        (1L << 5),
133         ContentsVisibleChange =     (1L << 6),
134         ContentsOpaqueChange =      (1L << 7),
135
136         PositionChange =            (1L << 8),
137         AnchorPointChange =         (1L << 9),
138         SizeChange =                (1L << 10),
139         TransformChange =           (1L << 11),
140         ChildrenTransformChange =   (1L << 12),
141         Preserves3DChange =         (1L << 13),
142
143         MasksToBoundsChange =       (1L << 14),
144         DrawsContentChange =        (1L << 15),
145         OpacityChange =             (1L << 16),
146         BackfaceVisibilityChange =  (1L << 17),
147
148         BackingStoreChange =        (1L << 18),
149         DisplayChange =             (1L << 19),
150         ContentsDisplayChange =     (1L << 20),
151         BackgroundColorChange =     (1L << 21),
152
153         AnimationChange =           (1L << 22),
154         FilterChange =              (1L << 23),
155
156         DebugVisualsChange =        (1L << 24),
157         RepaintCountChange =        (1L << 25),
158
159         FixedToViewporChange =      (1L << 26),
160         AnimationStarted =          (1L << 27),
161
162         CommittedScrollOffsetChange =     (1L << 28),
163         IsScrollableChange =              (1L << 29)
164     };
165     void notifyChange(ChangeMask);
166
167     TextureMapperLayer m_layer;
168     RefPtr<TextureMapperTiledBackingStore> m_compositedImage;
169     NativeImagePtr m_compositedNativeImagePtr;
170     RefPtr<TextureMapperBackingStore> m_backingStore;
171
172     int m_changeMask;
173     bool m_needsDisplay;
174     bool m_fixedToViewport;
175     Color m_solidColor;
176
177     Color m_debugBorderColor;
178     float m_debugBorderWidth;
179
180     TextureMapperPlatformLayer* m_contentsLayer;
181     FloatRect m_needsDisplayRect;
182     TextureMapperAnimations m_animations;
183     double m_animationStartTime;
184
185     IntSize m_committedScrollOffset;
186     bool m_isScrollable;
187 };
188
189 } // namespace WebCore
190
191 SPECIALIZE_TYPE_TRAITS_GRAPHICSLAYER(WebCore::GraphicsLayerTextureMapper, isGraphicsLayerTextureMapper())
192
193 #endif
194
195 #endif // GraphicsLayerTextureMapper_h