• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 
27 #ifndef LayerTilerChromium_h
28 #define LayerTilerChromium_h
29 
30 #if USE(ACCELERATED_COMPOSITING)
31 
32 #include "LayerChromium.h"
33 #include "LayerTexture.h"
34 #include "PlatformCanvas.h"
35 #include "TilingData.h"
36 #include <wtf/HashTraits.h>
37 #include <wtf/OwnArrayPtr.h>
38 #include <wtf/RefCounted.h>
39 
40 namespace WebCore {
41 
42 class GraphicsContext3D;
43 class LayerRendererChromium;
44 
45 class TilePaintInterface {
46 public:
47     virtual void paint(GraphicsContext& context, const IntRect& contentRect) = 0;
48 };
49 
50 class LayerTilerChromium {
51     WTF_MAKE_NONCOPYABLE(LayerTilerChromium);
52 public:
53     enum BorderTexelOption { HasBorderTexels, NoBorderTexels };
54 
55     static PassOwnPtr<LayerTilerChromium> create(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
56 
57     ~LayerTilerChromium();
58 
59     // Set invalidations to be potentially repainted during update().
60     void invalidateRect(const IntRect& contentRect);
61     void invalidateEntireLayer();
62 
63     // Paint all invalidations and missing tiles needed to draw the contentRect
64     // into the internal canvas.
65     void update(TilePaintInterface& painter, const IntRect& contentRect);
66 
67     // Reserve and upload tile textures from the internal canvas.
68     void uploadCanvas();
69 
70     // Reserve and upload tile textures from an externally painted buffer.
71     void updateFromPixels(const IntRect& contentRect, const IntRect& paintRect, const uint8_t* pixels);
72 
73     // Draw all tiles that intersect with the content rect.
74     void draw(const IntRect& contentRect, const TransformationMatrix&, float opacity);
75 
76     // Set position of this tiled layer in content space.
77     void setLayerPosition(const IntPoint& position);
78     // Change the tile size.  This may invalidate all the existing tiles.
79     void setTileSize(const IntSize& size);
80     void setLayerRenderer(LayerRendererChromium*);
81 
skipsDraw()82     bool skipsDraw() const { return m_skipsDraw; }
83 
84     typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderTexAlpha> Program;
85 
86     // If this tiler has exactly one tile, return its texture. Otherwise, null.
87     LayerTexture* getSingleTexture();
88 
89 private:
90     LayerTilerChromium(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
91 
92     class Tile : public RefCounted<Tile> {
93         WTF_MAKE_NONCOPYABLE(Tile);
94     public:
Tile(PassOwnPtr<LayerTexture> tex)95         explicit Tile(PassOwnPtr<LayerTexture> tex) : m_tex(tex), m_i(-1), m_j(-1) {}
96 
texture()97         LayerTexture* texture() { return m_tex.get(); }
98 
dirty()99         bool dirty() const { return !m_dirtyLayerRect.isEmpty(); }
clearDirty()100         void clearDirty() { m_dirtyLayerRect = IntRect(); }
101 
i()102         int i() const { return m_i; }
j()103         int j() const { return m_j; }
moveTo(int i,int j)104         void moveTo(int i, int j) { m_i = i; m_j = j; }
105 
106         // Layer-space dirty rectangle that needs to be repainted.
107         IntRect m_dirtyLayerRect;
108     private:
109         OwnPtr<LayerTexture> m_tex;
110         int m_i;
111         int m_j;
112     };
113 
114     void drawTexturedQuad(GraphicsContext3D*, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
115                           float width, float height, float opacity,
116                           float texTranslateX, float texTranslateY,
117                           float texScaleX, float texScaleY,
118                           const LayerTilerChromium::Program*);
119 
120     // Grow layer size to contain this rectangle.
121     void growLayerToContain(const IntRect& contentRect);
122 
layerRenderer()123     LayerRendererChromium* layerRenderer() const { return m_layerRenderer; }
124     GraphicsContext3D* layerRendererContext() const;
125     Tile* createTile(int i, int j);
126     // Invalidate any tiles which do not intersect with the contentRect
127     void invalidateTiles(const IntRect& contentRect);
128     void reset();
129     void contentRectToTileIndices(const IntRect& contentRect, int &left, int &top, int &right, int &bottom) const;
130     IntRect contentRectToLayerRect(const IntRect& contentRect) const;
131     IntRect layerRectToContentRect(const IntRect& layerRect) const;
132 
133     Tile* tileAt(int, int) const;
134     IntRect tileContentRect(const Tile*) const;
135     IntRect tileLayerRect(const Tile*) const;
136 
137     IntSize m_tileSize;
138     IntPoint m_layerPosition;
139 
140     bool m_skipsDraw;
141 
142     // Default hash key traits for integers disallow 0 and -1 as a key, so
143     // use a custom hash trait which disallows -1 and -2 instead.
144     typedef std::pair<int, int> TileMapKey;
145     struct TileMapKeyTraits : HashTraits<TileMapKey> {
146         static const bool emptyValueIsZero = false;
147         static const bool needsDestruction = false;
emptyValueTileMapKeyTraits148         static TileMapKey emptyValue() { return std::make_pair(-1, -1); }
constructDeletedValueTileMapKeyTraits149         static void constructDeletedValue(TileMapKey& slot) { slot = std::make_pair(-2, -2); }
isDeletedValueTileMapKeyTraits150         static bool isDeletedValue(TileMapKey value) { return value.first == -2 && value.second == -2; }
151     };
152     // FIXME: The mapped value in TileMap should really be an OwnPtr, as the
153     // refcount of a Tile should never be more than 1. However, HashMap
154     // doesn't easily support OwnPtr as a value.
155     typedef HashMap<TileMapKey, RefPtr<Tile>, DefaultHash<TileMapKey>::Hash, TileMapKeyTraits> TileMap;
156     TileMap m_tiles;
157     // Tightly packed set of unused tiles.
158     Vector<RefPtr<Tile> > m_unusedTiles;
159 
160     // State held between update and uploadCanvas.
161     IntRect m_paintRect;
162     IntRect m_updateRect;
163     PlatformCanvas m_canvas;
164 
165     // Cache a tile-sized pixel buffer to draw into.
166     OwnArrayPtr<uint8_t> m_tilePixels;
167 
168     TilingData m_tilingData;
169 
170     LayerRendererChromium* m_layerRenderer;
171 };
172 
173 }
174 
175 #endif // USE(ACCELERATED_COMPOSITING)
176 
177 #endif
178