OpenGLRenderer.h revision 026c5e16704e817cac7d9c382914c947e34f87e0
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_UI_OPENGL_RENDERER_H
18#define ANDROID_UI_OPENGL_RENDERER_H
19
20#include <GLES2/gl2.h>
21#include <GLES2/gl2ext.h>
22
23#include <SkMatrix.h>
24#include <SkXfermode.h>
25
26#include <utils/RefBase.h>
27
28#include "Matrix.h"
29#include "Program.h"
30#include "Rect.h"
31#include "Snapshot.h"
32
33namespace android {
34namespace uirenderer {
35
36///////////////////////////////////////////////////////////////////////////////
37// Support
38///////////////////////////////////////////////////////////////////////////////
39
40/**
41 * Simple structure to describe a vertex with a position.
42 * This is used to draw filled rectangles without a texture.
43 */
44struct SimpleVertex {
45    float position[2];
46}; // struct SimpleVertex
47
48/**
49 * Simple structure to describe a vertex with a position and a texture.
50 */
51struct TextureVertex {
52    float position[2];
53    float texture[2];
54}; // struct TextureVertex
55
56/**
57 * Structure mapping Skia xfermodes to OpenGL blending factors.
58 */
59struct Blender {
60    SkXfermode::Mode mode;
61    GLenum src;
62    GLenum dst;
63}; // struct Blender
64
65///////////////////////////////////////////////////////////////////////////////
66// Renderer
67///////////////////////////////////////////////////////////////////////////////
68
69/**
70 * OpenGL renderer used to draw accelerated 2D graphics. The API is a
71 * simplified version of Skia's Canvas API.
72 */
73class OpenGLRenderer {
74public:
75    OpenGLRenderer();
76    ~OpenGLRenderer();
77
78    void setViewport(int width, int height);
79    void prepare();
80
81    int getSaveCount() const;
82    int save(int flags);
83    void restore();
84    void restoreToCount(int saveCount);
85
86    int saveLayer(float left, float top, float right, float bottom, const SkPaint* p, int flags);
87    int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int flags);
88
89    void translate(float dx, float dy);
90    void rotate(float degrees);
91    void scale(float sx, float sy);
92
93    void setMatrix(SkMatrix* matrix);
94    void getMatrix(SkMatrix* matrix);
95    void concatMatrix(SkMatrix* matrix);
96
97    const Rect& getClipBounds();
98    bool quickReject(float left, float top, float right, float bottom);
99    bool clipRect(float left, float top, float right, float bottom);
100
101    void drawColor(int color, SkXfermode::Mode mode);
102    void drawRect(float left, float top, float right, float bottom, const SkPaint* paint);
103
104private:
105    /**
106     * Saves the current state of the renderer as a new snapshot.
107     * The new snapshot is saved in mSnapshot and the previous snapshot
108     * is linked from mSnapshot->previous.
109     *
110     * @return The new save count. This value can be passed to #restoreToCount()
111     */
112    int saveSnapshot();
113
114    /**
115     * Restores the current snapshot; mSnapshot becomes mSnapshot->previous.
116     *
117     * @return True if the clip should be also reapplied by calling
118     *         #setScissorFromClip().
119     */
120    bool restoreSnapshot();
121
122    /**
123     * Sets the clipping rectangle using glScissor. The clip is defined by
124     * the current snapshot's clipRect member.
125     */
126    void setScissorFromClip();
127
128    /**
129     * Draws a colored rectangle with the specified color. The specified coordinates
130     * are transformed by the current snapshot's transform matrix.
131     *
132     * @param left The left coordinate of the rectangle
133     * @param top The top coordinate of the rectangle
134     * @param right The right coordinate of the rectangle
135     * @param bottom The bottom coordinate of the rectangle
136     * @param color The rectangle's ARGB color, defined as a packed 32 bits word
137     * @param mode The Skia xfermode to use
138     */
139    void drawColorRect(float left, float top, float right, float bottom,
140    		int color, SkXfermode::Mode mode);
141
142    /**
143     * Draws a textured rectangle with the specified texture. The specified coordinates
144     * are transformed by the current snapshot's transform matrix.
145     *
146     * @param left The left coordinate of the rectangle
147     * @param top The top coordinate of the rectangle
148     * @param right The right coordinate of the rectangle
149     * @param bottom The bottom coordinate of the rectangle
150     * @param texture The texture name to map onto the rectangle
151     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
152     */
153    void drawTextureRect(float left, float top, float right, float bottom, GLuint texture,
154            float alpha);
155
156    /**
157     * Resets the texture coordinates stored in mDrawTextureVertices. Setting the values
158     * back to default is achieved by calling:
159     *
160     * resetDrawTextureTexCoords(0.0f, 1.0f, 1.0f, 0.0f);
161     *
162     * @param u1 The left coordinate of the texture
163     * @param v1 The bottom coordinate of the texture
164     * @param u2 The right coordinate of the texture
165     * @param v2 The top coordinate of the texture
166     */
167    void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
168
169    // Dimensions of the drawing surface
170    int mWidth, mHeight;
171
172    // Matrix used for ortho projection in shaders
173    float mOrthoMatrix[16];
174
175    // Model-view matrix used to position/size objects
176    mat4 mModelView;
177
178    // Number of saved states
179    int mSaveCount;
180    // Base state
181    Snapshot mFirstSnapshot;
182    // Current state
183    sp<Snapshot> mSnapshot;
184
185    // Shaders
186    sp<DrawColorProgram> mDrawColorShader;
187    sp<DrawTextureProgram> mDrawTextureShader;
188
189    // Used to draw textured quads
190    TextureVertex mDrawTextureVertices[4];
191}; // class OpenGLRenderer
192
193}; // namespace uirenderer
194}; // namespace android
195
196#endif // ANDROID_UI_OPENGL_RENDERER_H
197