[TextureMapper] Tiles are not created for large textures
[WebKit-https.git] / Source / WebCore / platform / graphics / texmap / TextureMapperGL.h
1 /*
2  Copyright (C) 2010 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 TextureMapperGL_h
21 #define TextureMapperGL_h
22
23 #if USE(ACCELERATED_COMPOSITING)
24
25 #include "FloatQuad.h"
26 #include "IntSize.h"
27 #include "OpenGLShims.h"
28 #include "TextureMapper.h"
29 #include "TransformationMatrix.h"
30
31 namespace WebCore {
32
33 class TextureMapperGLData;
34 class GraphicsContext;
35 class TextureMapperShaderProgram;
36
37 // An OpenGL-ES2 implementation of TextureMapper.
38 class TextureMapperGL : public TextureMapper {
39 public:
40     static PassOwnPtr<TextureMapperGL> create() { return adoptPtr(new TextureMapperGL); }
41     TextureMapperGL();
42     virtual ~TextureMapperGL();
43
44     enum Flag {
45         SupportsBlending = 0x01,
46         ShouldFlipTexture = 0x02
47     };
48
49     typedef int Flags;
50
51     // TextureMapper implementation
52     virtual void drawBorder(const Color&, float borderWidth, const FloatRect& targetRect, const TransformationMatrix& modelViewMatrix = TransformationMatrix()) OVERRIDE;
53     virtual void drawTexture(const BitmapTexture&, const FloatRect&, const TransformationMatrix&, float opacity, const BitmapTexture* maskTexture) OVERRIDE;
54     virtual void drawTexture(uint32_t texture, Flags, const IntSize& textureSize, const FloatRect& targetRect, const TransformationMatrix& modelViewMatrix, float opacity, const BitmapTexture* maskTexture) OVERRIDE;
55     virtual void bindSurface(BitmapTexture* surface) OVERRIDE;
56     virtual void beginClip(const TransformationMatrix&, const FloatRect&) OVERRIDE;
57     virtual void beginPainting(PaintFlags = 0) OVERRIDE;
58     virtual void endPainting() OVERRIDE;
59     virtual void endClip() OVERRIDE;
60     virtual IntSize maxTextureSize() const OVERRIDE { return IntSize(2000, 2000); }
61     virtual PassRefPtr<BitmapTexture> createTexture() OVERRIDE;
62     virtual GraphicsContext* graphicsContext() OVERRIDE { return m_context; }
63     virtual AccelerationMode accelerationMode() const OVERRIDE { return OpenGLMode; }
64     virtual void setGraphicsContext(GraphicsContext* context) OVERRIDE { m_context = context; }
65
66 #if ENABLE(CSS_FILTERS)
67     void drawFiltered(const BitmapTexture& sourceTexture, const BitmapTexture& contentTexture, const FilterOperation&);
68 #endif
69
70
71 private:
72
73     struct ClipState {
74         IntRect scissorBox;
75         int stencilIndex;
76         ClipState(const IntRect& scissors = IntRect(), int stencil = 1)
77             : scissorBox(scissors)
78             , stencilIndex(stencil)
79         { }
80     };
81
82     class ClipStack {
83     public:
84         void push();
85         void pop();
86         void apply();
87         inline ClipState& current() { return clipState; }
88         void init(const IntRect&);
89
90     private:
91         ClipState clipState;
92         Vector<ClipState> clipStack;
93     };
94
95     void drawRect(const FloatRect& targetRect, const TransformationMatrix& modelViewMatrix, TextureMapperShaderProgram*, GLenum drawingMode, bool needsBlending);
96     bool beginScissorClip(const TransformationMatrix&, const FloatRect&);
97     void bindDefaultSurface();
98     ClipStack& clipStack();
99     inline TextureMapperGLData& data() { return *m_data; }
100     TextureMapperGLData* m_data;
101     GraphicsContext* m_context;
102     ClipStack m_clipStack;
103     friend class BitmapTextureGL;
104 };
105
106 class BitmapTextureGL : public BitmapTexture {
107 public:
108     virtual IntSize size() const;
109     virtual bool isValid() const;
110     virtual bool canReuseWith(const IntSize& contentsSize, Flags = 0);
111     virtual void didReset();
112     void bind();
113     void initializeStencil();
114     ~BitmapTextureGL();
115     virtual uint32_t id() const { return m_id; }
116     uint32_t textureTarget() const { return GL_TEXTURE_2D; }
117     IntSize textureSize() const { return m_textureSize; }
118     void setTextureMapper(TextureMapperGL* texmap) { m_textureMapper = texmap; }
119     void updateContents(Image*, const IntRect&, const IntPoint&);
120     virtual void updateContents(const void*, const IntRect& target, const IntPoint& sourceOffset, int bytesPerLine);
121     virtual bool isBackedByOpenGL() const { return true; }
122
123 #if ENABLE(CSS_FILTERS)
124     virtual PassRefPtr<BitmapTexture> applyFilters(const BitmapTexture& contentTexture, const FilterOperations&);
125 #endif
126
127 private:
128     GLuint m_id;
129     IntSize m_textureSize;
130     IntRect m_dirtyRect;
131     GLuint m_fbo;
132     GLuint m_rbo;
133     bool m_shouldClear;
134     TextureMapperGL* m_textureMapper;
135     TextureMapperGL::ClipStack m_clipStack;
136     BitmapTextureGL()
137         : m_id(0)
138         , m_fbo(0)
139         , m_rbo(0)
140         , m_shouldClear(true)
141         , m_textureMapper(0)
142     {
143     }
144
145     void clearIfNeeded();
146     void createFboIfNeeded();
147
148     friend class TextureMapperGL;
149 };
150
151 typedef uint64_t ImageUID;
152 ImageUID uidForImage(Image*);
153 BitmapTextureGL* toBitmapTextureGL(BitmapTexture*);
154
155 }
156 #endif
157
158 #endif