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