| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 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 |  | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 17 | #ifndef ANDROID_HWUI_OPENGL_RENDERER_H | 
 | 18 | #define ANDROID_HWUI_OPENGL_RENDERER_H | 
| Romain Guy | 9d5316e | 2010-06-24 19:30:36 -0700 | [diff] [blame] | 19 |  | 
 | 20 | #include <GLES2/gl2.h> | 
 | 21 | #include <GLES2/gl2ext.h> | 
| Romain Guy | 85bf02f | 2010-06-22 13:11:24 -0700 | [diff] [blame] | 22 |  | 
| Romain Guy | ce0537b | 2010-06-29 21:05:21 -0700 | [diff] [blame] | 23 | #include <SkBitmap.h> | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 24 | #include <SkMatrix.h> | 
| Romain Guy | ce0537b | 2010-06-29 21:05:21 -0700 | [diff] [blame] | 25 | #include <SkPaint.h> | 
| Romain Guy | 079ba2c | 2010-07-16 14:12:24 -0700 | [diff] [blame] | 26 | #include <SkRegion.h> | 
| Romain Guy | d27977d | 2010-07-14 19:18:51 -0700 | [diff] [blame] | 27 | #include <SkShader.h> | 
| Romain Guy | 85bf02f | 2010-06-22 13:11:24 -0700 | [diff] [blame] | 28 | #include <SkXfermode.h> | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 29 |  | 
| Chet Haase | daf98e9 | 2011-01-10 14:10:36 -0800 | [diff] [blame] | 30 | #include <utils/Functor.h> | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 31 | #include <utils/RefBase.h> | 
| Romain Guy | ba6be8a | 2012-04-23 18:22:09 -0700 | [diff] [blame] | 32 | #include <utils/SortedVector.h> | 
| Romain Guy | 8694230 | 2010-09-12 13:02:16 -0700 | [diff] [blame] | 33 | #include <utils/Vector.h> | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 34 |  | 
| Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 35 | #include <cutils/compiler.h> | 
 | 36 |  | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 37 | #include <androidfw/ResourceTypes.h> | 
 | 38 |  | 
| Romain Guy | c15008e | 2010-11-10 11:59:15 -0800 | [diff] [blame] | 39 | #include "Debug.h" | 
| Romain Guy | 51769a6 | 2010-07-23 00:28:00 -0700 | [diff] [blame] | 40 | #include "Extensions.h" | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 41 | #include "Matrix.h" | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 42 | #include "Program.h" | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 43 | #include "Rect.h" | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 44 | #include "Snapshot.h" | 
| Romain Guy | f7f9355 | 2010-07-08 19:17:03 -0700 | [diff] [blame] | 45 | #include "Vertex.h" | 
| Romain Guy | 06f96e2 | 2010-07-30 19:18:16 -0700 | [diff] [blame] | 46 | #include "SkiaShader.h" | 
| Romain Guy | db1938e | 2010-08-02 18:50:22 -0700 | [diff] [blame] | 47 | #include "SkiaColorFilter.h" | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 48 | #include "UvMapper.h" | 
| Romain Guy | fb8b763 | 2010-08-23 21:05:08 -0700 | [diff] [blame] | 49 | #include "Caches.h" | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 50 |  | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 51 | namespace android { | 
| Romain Guy | 9d5316e | 2010-06-24 19:30:36 -0700 | [diff] [blame] | 52 | namespace uirenderer { | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 53 |  | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 54 | struct DrawModifiers { | 
 | 55 |     SkiaShader* mShader; | 
 | 56 |     SkiaColorFilter* mColorFilter; | 
| Chris Craik | 16ecda5 | 2013-03-29 10:59:59 -0700 | [diff] [blame] | 57 |     float mOverrideLayerAlpha; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 58 |  | 
 | 59 |     // Drop shadow | 
 | 60 |     bool mHasShadow; | 
 | 61 |     float mShadowRadius; | 
 | 62 |     float mShadowDx; | 
 | 63 |     float mShadowDy; | 
 | 64 |     int mShadowColor; | 
 | 65 |  | 
 | 66 |     // Draw filters | 
 | 67 |     bool mHasDrawFilter; | 
 | 68 |     int mPaintFilterClearBits; | 
 | 69 |     int mPaintFilterSetBits; | 
 | 70 | }; | 
 | 71 |  | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 72 | enum StateDeferFlags { | 
 | 73 |     kStateDeferFlag_Draw = 0x1, | 
 | 74 |     kStateDeferFlag_Clip = 0x2 | 
 | 75 | }; | 
 | 76 |  | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 77 | enum DrawOpMode { | 
 | 78 |     kDrawOpMode_Immediate, | 
 | 79 |     kDrawOpMode_Defer, | 
 | 80 |     kDrawOpMode_Flush | 
 | 81 | }; | 
 | 82 |  | 
| Chris Craik | 28ce94a | 2013-05-31 11:38:03 -0700 | [diff] [blame] | 83 | enum ClipSideFlags { | 
| Chris Craik | a02c4ed | 2013-06-14 13:43:58 -0700 | [diff] [blame] | 84 |     kClipSide_None = 0x0, | 
| Chris Craik | 28ce94a | 2013-05-31 11:38:03 -0700 | [diff] [blame] | 85 |     kClipSide_Left = 0x1, | 
 | 86 |     kClipSide_Top = 0x2, | 
 | 87 |     kClipSide_Right = 0x4, | 
 | 88 |     kClipSide_Bottom = 0x8, | 
| Chris Craik | d72b73c | 2013-06-17 13:52:06 -0700 | [diff] [blame] | 89 |     kClipSide_Full = 0xF, | 
 | 90 |     kClipSide_ConservativeFull = 0x1F | 
| Chris Craik | 28ce94a | 2013-05-31 11:38:03 -0700 | [diff] [blame] | 91 | }; | 
 | 92 |  | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 93 | struct DeferredDisplayState { | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 94 |     // global op bounds, mapped by mMatrix to be in screen space coordinates, clipped | 
 | 95 |     Rect mBounds; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 96 |  | 
 | 97 |     // the below are set and used by the OpenGLRenderer at record and deferred playback | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 98 |     bool mClipValid; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 99 |     Rect mClip; | 
| Chris Craik | 28ce94a | 2013-05-31 11:38:03 -0700 | [diff] [blame] | 100 |     int mClipSideFlags; // specifies which sides of the bounds are clipped, unclipped if cleared | 
| Romain Guy | 2db5e99 | 2013-05-21 15:29:59 -0700 | [diff] [blame] | 101 |     bool mClipped; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 102 |     mat4 mMatrix; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 103 |     DrawModifiers mDrawModifiers; | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 104 |     float mAlpha; | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 105 | }; | 
 | 106 |  | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 107 | /////////////////////////////////////////////////////////////////////////////// | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 108 | // Renderer | 
 | 109 | /////////////////////////////////////////////////////////////////////////////// | 
 | 110 |  | 
| Romain Guy | 0fe478e | 2010-11-08 12:08:41 -0800 | [diff] [blame] | 111 | class DisplayList; | 
| Romain Guy | 257ae35 | 2013-03-20 16:31:12 -0700 | [diff] [blame] | 112 | class TextSetupFunctor; | 
| Chris Craik | 65cd612 | 2012-12-10 17:56:27 -0800 | [diff] [blame] | 113 | class VertexBuffer; | 
| Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 114 |  | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 115 | /** | 
 | 116 |  * OpenGL renderer used to draw accelerated 2D graphics. The API is a | 
 | 117 |  * simplified version of Skia's Canvas API. | 
 | 118 |  */ | 
| Romain Guy | 85bf02f | 2010-06-22 13:11:24 -0700 | [diff] [blame] | 119 | class OpenGLRenderer { | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 120 | public: | 
| Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 121 |     ANDROID_API OpenGLRenderer(); | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 122 |     virtual ~OpenGLRenderer(); | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 123 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 124 |     /** | 
| Romain Guy | ef35927 | 2013-01-31 19:07:29 -0800 | [diff] [blame] | 125 |      * Sets the name of this renderer. The name is optional and | 
 | 126 |      * empty by default. If the pointer is null the name is set | 
 | 127 |      * to the empty string. | 
 | 128 |      */ | 
 | 129 |     ANDROID_API void setName(const char* name); | 
 | 130 |  | 
 | 131 |     /** | 
 | 132 |      * Returns the name of this renderer as UTF8 string. | 
 | 133 |      * The returned pointer is never null. | 
 | 134 |      */ | 
 | 135 |     ANDROID_API const char* getName() const; | 
 | 136 |  | 
 | 137 |     /** | 
| Romain Guy | 87e2f757 | 2012-09-24 11:37:12 -0700 | [diff] [blame] | 138 |      * Read externally defined properties to control the behavior | 
 | 139 |      * of the renderer. | 
 | 140 |      */ | 
 | 141 |     ANDROID_API void initProperties(); | 
 | 142 |  | 
 | 143 |     /** | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 144 |      * Indicates whether this renderer executes drawing commands immediately. | 
 | 145 |      * If this method returns true, the drawing commands will be executed | 
 | 146 |      * later. | 
 | 147 |      */ | 
| Romain Guy | 49c5fc0 | 2012-05-15 11:10:01 -0700 | [diff] [blame] | 148 |     virtual bool isDeferred(); | 
 | 149 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 150 |     /** | 
 | 151 |      * Sets the dimension of the underlying drawing surface. This method must | 
 | 152 |      * be called at least once every time the drawing surface changes size. | 
 | 153 |      * | 
 | 154 |      * @param width The width in pixels of the underlysing surface | 
 | 155 |      * @param height The height in pixels of the underlysing surface | 
 | 156 |      */ | 
| Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 157 |     virtual void setViewport(int width, int height); | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 158 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 159 |     /** | 
 | 160 |      * Prepares the renderer to draw a frame. This method must be invoked | 
 | 161 |      * at the beginning of each frame. When this method is invoked, the | 
 | 162 |      * entire drawing surface is assumed to be redrawn. | 
 | 163 |      * | 
 | 164 |      * @param opaque If true, the target surface is considered opaque | 
 | 165 |      *               and will not be cleared. If false, the target surface | 
 | 166 |      *               will be cleared | 
 | 167 |      */ | 
| Romain Guy | 7c25aab | 2012-10-18 15:05:02 -0700 | [diff] [blame] | 168 |     ANDROID_API status_t prepare(bool opaque); | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 169 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 170 |     /** | 
 | 171 |      * Prepares the renderer to draw a frame. This method must be invoked | 
 | 172 |      * at the beginning of each frame. Only the specified rectangle of the | 
 | 173 |      * frame is assumed to be dirty. A clip will automatically be set to | 
 | 174 |      * the specified rectangle. | 
 | 175 |      * | 
 | 176 |      * @param left The left coordinate of the dirty rectangle | 
 | 177 |      * @param top The top coordinate of the dirty rectangle | 
 | 178 |      * @param right The right coordinate of the dirty rectangle | 
 | 179 |      * @param bottom The bottom coordinate of the dirty rectangle | 
 | 180 |      * @param opaque If true, the target surface is considered opaque | 
 | 181 |      *               and will not be cleared. If false, the target surface | 
 | 182 |      *               will be cleared in the specified dirty rectangle | 
 | 183 |      */ | 
| Romain Guy | 7c25aab | 2012-10-18 15:05:02 -0700 | [diff] [blame] | 184 |     virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque); | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 185 |  | 
 | 186 |     /** | 
 | 187 |      * Indicates the end of a frame. This method must be invoked whenever | 
 | 188 |      * the caller is done rendering a frame. | 
 | 189 |      */ | 
 | 190 |     virtual void finish(); | 
| Romain Guy | 6c319ca | 2011-01-11 14:29:25 -0800 | [diff] [blame] | 191 |  | 
| Romain Guy | c89b14b | 2012-08-08 14:53:48 -0700 | [diff] [blame] | 192 |     /** | 
 | 193 |      * This method must be invoked before handing control over to a draw functor. | 
 | 194 |      * See callDrawGLFunction() for instance. | 
 | 195 |      * | 
 | 196 |      * This command must not be recorded inside display lists. | 
 | 197 |      */ | 
 | 198 |     virtual void interrupt(); | 
 | 199 |  | 
 | 200 |     /** | 
 | 201 |      * This method must be invoked after getting control back from a draw functor. | 
 | 202 |      * | 
 | 203 |      * This command must not be recorded inside display lists. | 
 | 204 |      */ | 
 | 205 |     virtual void resume(); | 
 | 206 |  | 
| Romain Guy | 78dd96d | 2013-05-03 14:24:16 -0700 | [diff] [blame] | 207 |     ANDROID_API void setCountOverdrawEnabled(bool enabled) { | 
 | 208 |         mCountOverdraw = enabled; | 
 | 209 |     } | 
 | 210 |  | 
 | 211 |     ANDROID_API float getOverdraw() { | 
 | 212 |         return mCountOverdraw ? mOverdraw : 0.0f; | 
 | 213 |     } | 
 | 214 |  | 
| Romain Guy | 8f3b8e3 | 2012-03-27 16:33:45 -0700 | [diff] [blame] | 215 |     ANDROID_API status_t invokeFunctors(Rect& dirty); | 
| Romain Guy | ba6be8a | 2012-04-23 18:22:09 -0700 | [diff] [blame] | 216 |     ANDROID_API void detachFunctor(Functor* functor); | 
 | 217 |     ANDROID_API void attachFunctor(Functor* functor); | 
| Romain Guy | 8f3b8e3 | 2012-03-27 16:33:45 -0700 | [diff] [blame] | 218 |     virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty); | 
| Romain Guy | 08ae317 | 2010-06-21 19:35:50 -0700 | [diff] [blame] | 219 |  | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 220 |     ANDROID_API void pushLayerUpdate(Layer* layer); | 
| Romain Guy | e93482f | 2013-06-17 13:14:51 -0700 | [diff] [blame] | 221 |     ANDROID_API void cancelLayerUpdate(Layer* layer); | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 222 |     ANDROID_API void clearLayerUpdates(); | 
| Romain Guy | 4054360 | 2013-06-12 15:31:28 -0700 | [diff] [blame] | 223 |     ANDROID_API void flushLayerUpdates(); | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 224 |  | 
| Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 225 |     ANDROID_API int getSaveCount() const; | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 226 |     virtual int save(int flags); | 
 | 227 |     virtual void restore(); | 
 | 228 |     virtual void restoreToCount(int saveCount); | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 229 |  | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 230 |     ANDROID_API int saveLayer(float left, float top, float right, float bottom, | 
 | 231 |             SkPaint* paint, int flags) { | 
 | 232 |         SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; | 
 | 233 |         if (paint) mode = getXfermode(paint->getXfermode()); | 
 | 234 |         return saveLayer(left, top, right, bottom, paint ? paint->getAlpha() : 255, mode, flags); | 
 | 235 |     } | 
 | 236 |     ANDROID_API int saveLayerAlpha(float left, float top, float right, float bottom, | 
 | 237 |             int alpha, int flags) { | 
 | 238 |         return saveLayer(left, top, right, bottom, alpha, SkXfermode::kSrcOver_Mode, flags); | 
 | 239 |     } | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 240 |     virtual int saveLayer(float left, float top, float right, float bottom, | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 241 |             int alpha, SkXfermode::Mode mode, int flags); | 
| Romain Guy | bd6b79b | 2010-06-26 00:13:53 -0700 | [diff] [blame] | 242 |  | 
| Chris Craik | d90144d | 2013-03-19 15:03:48 -0700 | [diff] [blame] | 243 |     int saveLayerDeferred(float left, float top, float right, float bottom, | 
 | 244 |             int alpha, SkXfermode::Mode mode, int flags); | 
 | 245 |  | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 246 |     virtual void translate(float dx, float dy); | 
 | 247 |     virtual void rotate(float degrees); | 
 | 248 |     virtual void scale(float sx, float sy); | 
| Romain Guy | 807daf7 | 2011-01-18 11:19:19 -0800 | [diff] [blame] | 249 |     virtual void skew(float sx, float sy); | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 250 |  | 
| Chris Craik | b98a016 | 2013-02-21 11:30:22 -0800 | [diff] [blame] | 251 |     bool hasRectToRectTransform(); | 
| Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 252 |     ANDROID_API void getMatrix(SkMatrix* matrix); | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 253 |     virtual void setMatrix(SkMatrix* matrix); | 
 | 254 |     virtual void concatMatrix(SkMatrix* matrix); | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 255 |  | 
| Romain Guy | 7953745 | 2011-10-12 13:48:51 -0700 | [diff] [blame] | 256 |     ANDROID_API const Rect& getClipBounds(); | 
| Chris Craik | 39a908c | 2013-06-13 14:39:01 -0700 | [diff] [blame] | 257 |  | 
 | 258 |     /** | 
 | 259 |      * Performs a quick reject but adjust the bounds to account for stroke width if necessary | 
 | 260 |      */ | 
 | 261 |     bool quickRejectPreStroke(float left, float top, float right, float bottom, SkPaint* paint); | 
 | 262 |  | 
 | 263 |     /** | 
 | 264 |      * Returns false and sets scissor based upon bounds if drawing won't be clipped out | 
 | 265 |      */ | 
 | 266 |     bool quickReject(float left, float top, float right, float bottom); | 
| Chris Craik | 4154182 | 2013-05-03 16:35:54 -0700 | [diff] [blame] | 267 |     bool quickReject(const Rect& bounds) { | 
 | 268 |         return quickReject(bounds.left, bounds.top, bounds.right, bounds.bottom); | 
 | 269 |     } | 
| Chris Craik | 39a908c | 2013-06-13 14:39:01 -0700 | [diff] [blame] | 270 |  | 
 | 271 |     /** | 
 | 272 |      * Same as quickReject, without the scissor, instead returning clipRequired through pointer. | 
 | 273 |      * clipRequired will be only set if not rejected | 
 | 274 |      */ | 
 | 275 |     ANDROID_API bool quickRejectNoScissor(float left, float top, float right, float bottom, | 
 | 276 |             bool* clipRequired = NULL); | 
 | 277 |     bool quickRejectNoScissor(const Rect& bounds, bool* clipRequired = NULL) { | 
 | 278 |         return quickRejectNoScissor(bounds.left, bounds.top, bounds.right, bounds.bottom, | 
 | 279 |                 clipRequired); | 
 | 280 |     } | 
 | 281 |  | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 282 |     virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); | 
| Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 283 |     virtual bool clipPath(SkPath* path, SkRegion::Op op); | 
 | 284 |     virtual bool clipRegion(SkRegion* region, SkRegion::Op op); | 
| Chet Haase | a23eed8 | 2012-04-12 15:19:04 -0700 | [diff] [blame] | 285 |     virtual Rect* getClipRect(); | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 286 |  | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 287 |     virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t replayFlags); | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 288 |     virtual void outputDisplayList(DisplayList* displayList); | 
| Chris Craik | a08f95c | 2013-03-15 17:24:33 -0700 | [diff] [blame] | 289 |     virtual status_t drawLayer(Layer* layer, float x, float y); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 290 |     virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); | 
| Romain Guy | 55b6f95 | 2013-06-27 15:27:09 -0700 | [diff] [blame] | 291 |     status_t drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount, | 
 | 292 |             TextureVertex* vertices, bool transformed, const Rect& bounds, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 293 |     virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); | 
 | 294 |     virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 295 |             float srcRight, float srcBottom, float dstLeft, float dstTop, | 
| Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 296 |             float dstRight, float dstBottom, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 297 |     virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint); | 
 | 298 |     virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, | 
| Romain Guy | 5a7b466 | 2011-01-20 19:09:30 -0800 | [diff] [blame] | 299 |             float* vertices, int* colors, SkPaint* paint); | 
| Romain Guy | 03c00b5 | 2013-06-20 18:30:28 -0700 | [diff] [blame] | 300 |     status_t drawPatches(SkBitmap* bitmap, AssetAtlas::Entry* entry, | 
 | 301 |             TextureVertex* vertices, uint32_t indexCount, SkPaint* paint); | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 302 |     virtual status_t drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, | 
| Chet Haase | 5c13d89 | 2010-10-08 08:37:55 -0700 | [diff] [blame] | 303 |             float left, float top, float right, float bottom, SkPaint* paint); | 
| Romain Guy | 4c2547f | 2013-06-11 16:19:24 -0700 | [diff] [blame] | 304 |     status_t drawPatch(SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry, | 
| Romain Guy | 03c00b5 | 2013-06-20 18:30:28 -0700 | [diff] [blame] | 305 |             float left, float top, float right, float bottom, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 306 |     virtual status_t drawColor(int color, SkXfermode::Mode mode); | 
 | 307 |     virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint); | 
 | 308 |     virtual status_t drawRoundRect(float left, float top, float right, float bottom, | 
| Romain Guy | 01d58e4 | 2011-01-19 21:54:02 -0800 | [diff] [blame] | 309 |             float rx, float ry, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 310 |     virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint); | 
 | 311 |     virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint); | 
 | 312 |     virtual status_t drawArc(float left, float top, float right, float bottom, | 
| Romain Guy | 8b2f526 | 2011-01-23 16:15:02 -0800 | [diff] [blame] | 313 |             float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 314 |     virtual status_t drawPath(SkPath* path, SkPaint* paint); | 
 | 315 |     virtual status_t drawLines(float* points, int count, SkPaint* paint); | 
 | 316 |     virtual status_t drawPoints(float* points, int count, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 317 |     virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, | 
| Romain Guy | 325740f | 2012-02-24 16:48:34 -0800 | [diff] [blame] | 318 |             float hOffset, float vOffset, SkPaint* paint); | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 319 |     virtual status_t drawPosText(const char* text, int bytesCount, int count, | 
| Romain Guy | 325740f | 2012-02-24 16:48:34 -0800 | [diff] [blame] | 320 |             const float* positions, SkPaint* paint); | 
| Romain Guy | c252595 | 2012-07-27 16:41:22 -0700 | [diff] [blame] | 321 |     virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, | 
| Chris Craik | 4154182 | 2013-05-03 16:35:54 -0700 | [diff] [blame] | 322 |             const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds, | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 323 |             DrawOpMode drawOpMode = kDrawOpMode_Immediate); | 
| Romain Guy | 672433d | 2013-01-04 19:05:13 -0800 | [diff] [blame] | 324 |     virtual status_t drawRects(const float* rects, int count, SkPaint* paint); | 
| Romain Guy | 08ae317 | 2010-06-21 19:35:50 -0700 | [diff] [blame] | 325 |  | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 326 |     virtual void resetShader(); | 
 | 327 |     virtual void setupShader(SkiaShader* shader); | 
| Romain Guy | d27977d | 2010-07-14 19:18:51 -0700 | [diff] [blame] | 328 |  | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 329 |     virtual void resetColorFilter(); | 
 | 330 |     virtual void setupColorFilter(SkiaColorFilter* filter); | 
| Romain Guy | db1938e | 2010-08-02 18:50:22 -0700 | [diff] [blame] | 331 |  | 
| Romain Guy | 4aa9057 | 2010-09-26 18:40:37 -0700 | [diff] [blame] | 332 |     virtual void resetShadow(); | 
 | 333 |     virtual void setupShadow(float radius, float dx, float dy, int color); | 
| Romain Guy | 1e45aae | 2010-08-13 19:39:53 -0700 | [diff] [blame] | 334 |  | 
| Romain Guy | 5ff9df6 | 2012-01-23 17:09:05 -0800 | [diff] [blame] | 335 |     virtual void resetPaintFilter(); | 
 | 336 |     virtual void setupPaintFilter(int clearBits, int setBits); | 
 | 337 |  | 
| Chris Craik | 16ecda5 | 2013-03-29 10:59:59 -0700 | [diff] [blame] | 338 |     // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer) | 
 | 339 |     void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; } | 
 | 340 |  | 
| Chris Craik | a08f95c | 2013-03-15 17:24:33 -0700 | [diff] [blame] | 341 |     SkPaint* filterPaint(SkPaint* paint); | 
| Romain Guy | 5ff9df6 | 2012-01-23 17:09:05 -0800 | [diff] [blame] | 342 |  | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 343 |     bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags); | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 344 |     void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false); | 
| Chris Craik | 28ce94a | 2013-05-31 11:38:03 -0700 | [diff] [blame] | 345 |     void setupMergedMultiDraw(const Rect* clipRect); | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 346 |  | 
| Chris Craik | d90144d | 2013-03-19 15:03:48 -0700 | [diff] [blame] | 347 |     const DrawModifiers& getDrawModifiers() { return mDrawModifiers; } | 
 | 348 |     void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; } | 
 | 349 |  | 
| Romain Guy | 672433d | 2013-01-04 19:05:13 -0800 | [diff] [blame] | 350 |     ANDROID_API bool isCurrentTransformSimple() { | 
 | 351 |         return mSnapshot->transform->isSimple(); | 
 | 352 |     } | 
 | 353 |  | 
| Romain Guy | 0f667533 | 2013-03-01 14:31:04 -0800 | [diff] [blame] | 354 |     Caches& getCaches() { | 
 | 355 |         return mCaches; | 
 | 356 |     } | 
 | 357 |  | 
| Chris Craik | ff78583 | 2013-03-08 13:12:16 -0800 | [diff] [blame] | 358 |     // simple rect clip | 
 | 359 |     bool isCurrentClipSimple() { | 
 | 360 |         return mSnapshot->clipRegion->isEmpty(); | 
 | 361 |     } | 
 | 362 |  | 
| Chris Craik | 0e87f00 | 2013-06-19 16:54:59 -0700 | [diff] [blame] | 363 |     int getViewportWidth() { return getSnapshot()->viewport.getWidth(); } | 
 | 364 |     int getViewportHeight() { return getSnapshot()->viewport.getHeight(); } | 
 | 365 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 366 |     /** | 
| Chris Craik | a08f95c | 2013-03-15 17:24:33 -0700 | [diff] [blame] | 367 |      * Scales the alpha on the current snapshot. This alpha value will be modulated | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 368 |      * with other alpha values when drawing primitives. | 
 | 369 |      */ | 
| Chris Craik | a08f95c | 2013-03-15 17:24:33 -0700 | [diff] [blame] | 370 |     void scaleAlpha(float alpha) { | 
 | 371 |         mSnapshot->alpha *= alpha; | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 372 |     } | 
 | 373 |  | 
 | 374 |     /** | 
| Romain Guy | 0f667533 | 2013-03-01 14:31:04 -0800 | [diff] [blame] | 375 |      * Inserts a named event marker in the stream of GL commands. | 
 | 376 |      */ | 
 | 377 |     void eventMark(const char* name) const; | 
 | 378 |  | 
 | 379 |     /** | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 380 |      * Inserts a named group marker in the stream of GL commands. This marker | 
 | 381 |      * can be used by tools to group commands into logical groups. A call to | 
 | 382 |      * this method must always be followed later on by a call to endMark(). | 
 | 383 |      */ | 
| Romain Guy | 13631f3 | 2012-01-30 17:41:55 -0800 | [diff] [blame] | 384 |     void startMark(const char* name) const; | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 385 |  | 
 | 386 |     /** | 
 | 387 |      * Closes the last group marker opened by startMark(). | 
 | 388 |      */ | 
| Romain Guy | 13631f3 | 2012-01-30 17:41:55 -0800 | [diff] [blame] | 389 |     void endMark() const; | 
 | 390 |  | 
| Chet Haase | d15ebf2 | 2012-09-05 11:40:29 -0700 | [diff] [blame] | 391 |     /** | 
 | 392 |      * Gets the alpha and xfermode out of a paint object. If the paint is null | 
 | 393 |      * alpha will be 255 and the xfermode will be SRC_OVER. This method does | 
| Chris Craik | 16ecda5 | 2013-03-29 10:59:59 -0700 | [diff] [blame] | 394 |      * not multiply the paint's alpha by the current snapshot's alpha, and does | 
 | 395 |      * not replace the alpha with the overrideLayerAlpha | 
| Chet Haase | d15ebf2 | 2012-09-05 11:40:29 -0700 | [diff] [blame] | 396 |      * | 
 | 397 |      * @param paint The paint to extract values from | 
 | 398 |      * @param alpha Where to store the resulting alpha | 
 | 399 |      * @param mode Where to store the resulting xfermode | 
 | 400 |      */ | 
 | 401 |     static inline void getAlphaAndModeDirect(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) { | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 402 |         *mode = getXfermodeDirect(paint); | 
 | 403 |         *alpha = getAlphaDirect(paint); | 
 | 404 |     } | 
| Chet Haase | d15ebf2 | 2012-09-05 11:40:29 -0700 | [diff] [blame] | 405 |  | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 406 |     static inline SkXfermode::Mode getXfermodeDirect(SkPaint* paint) { | 
 | 407 |         if (!paint) return SkXfermode::kSrcOver_Mode; | 
 | 408 |         return getXfermode(paint->getXfermode()); | 
 | 409 |     } | 
 | 410 |  | 
 | 411 |     static inline int getAlphaDirect(SkPaint* paint) { | 
 | 412 |         if (!paint) return 255; | 
 | 413 |         return paint->getAlpha(); | 
| Chet Haase | d15ebf2 | 2012-09-05 11:40:29 -0700 | [diff] [blame] | 414 |     } | 
 | 415 |  | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 416 |     /** | 
 | 417 |      * Return the best transform to use to rasterize text given a full | 
 | 418 |      * transform matrix. | 
 | 419 |      */ | 
 | 420 |     mat4 findBestFontTransform(const mat4& transform) const; | 
 | 421 |  | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 422 | #if DEBUG_MERGE_BEHAVIOR | 
 | 423 |     void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) { | 
 | 424 |         mCaches.setScissorEnabled(false); | 
 | 425 |  | 
 | 426 |         // should only be called outside of other draw ops, so stencil can only be in test state | 
 | 427 |         bool stencilWasEnabled = mCaches.stencil.isTestEnabled(); | 
 | 428 |         mCaches.stencil.disable(); | 
 | 429 |  | 
 | 430 |         drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true); | 
 | 431 |  | 
 | 432 |         if (stencilWasEnabled) mCaches.stencil.enableTest(); | 
 | 433 |     } | 
 | 434 | #endif | 
 | 435 |  | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 436 | protected: | 
 | 437 |     /** | 
| Romain Guy | 35643dd | 2012-09-18 15:40:58 -0700 | [diff] [blame] | 438 |      * Computes the projection matrix, initialize the first snapshot | 
 | 439 |      * and stores the dimensions of the render target. | 
 | 440 |      */ | 
 | 441 |     void initViewport(int width, int height); | 
 | 442 |  | 
 | 443 |     /** | 
| Romain Guy | 96885eb | 2013-03-26 15:05:58 -0700 | [diff] [blame] | 444 |      * Perform the setup specific to a frame. This method does not | 
 | 445 |      * issue any OpenGL commands. | 
 | 446 |      */ | 
 | 447 |     void setupFrameState(float left, float top, float right, float bottom, bool opaque); | 
 | 448 |  | 
 | 449 |     /** | 
 | 450 |      * Indicates the start of rendering. This method will setup the | 
 | 451 |      * initial OpenGL state (viewport, clearing the buffer, etc.) | 
 | 452 |      */ | 
 | 453 |     status_t startFrame(); | 
 | 454 |  | 
 | 455 |     /** | 
| Romain Guy | 7c25aab | 2012-10-18 15:05:02 -0700 | [diff] [blame] | 456 |      * Clears the underlying surface if needed. | 
 | 457 |      */ | 
 | 458 |     virtual status_t clear(float left, float top, float right, float bottom, bool opaque); | 
 | 459 |  | 
 | 460 |     /** | 
| Romain Guy | 35643dd | 2012-09-18 15:40:58 -0700 | [diff] [blame] | 461 |      * Call this method after updating a layer during a drawing pass. | 
 | 462 |      */ | 
 | 463 |     void resumeAfterLayer(); | 
 | 464 |  | 
 | 465 |     /** | 
| Romain Guy | 8ce0030 | 2013-01-15 18:51:42 -0800 | [diff] [blame] | 466 |      * This method is called whenever a stencil buffer is required. Subclasses | 
 | 467 |      * should override this method and call attachStencilBufferToLayer() on the | 
 | 468 |      * appropriate layer(s). | 
 | 469 |      */ | 
 | 470 |     virtual void ensureStencilBuffer(); | 
 | 471 |  | 
 | 472 |     /** | 
 | 473 |      * Obtains a stencil render buffer (allocating it if necessary) and | 
 | 474 |      * attaches it to the specified layer. | 
 | 475 |      */ | 
 | 476 |     void attachStencilBufferToLayer(Layer* layer); | 
 | 477 |  | 
 | 478 |     /** | 
| Romain Guy | e2d345e | 2010-09-24 18:39:22 -0700 | [diff] [blame] | 479 |      * Compose the layer defined in the current snapshot with the layer | 
 | 480 |      * defined by the previous snapshot. | 
 | 481 |      * | 
 | 482 |      * The current snapshot *must* be a layer (flag kFlagIsLayer set.) | 
 | 483 |      * | 
 | 484 |      * @param curent The current snapshot containing the layer to compose | 
 | 485 |      * @param previous The previous snapshot to compose the current layer with | 
 | 486 |      */ | 
 | 487 |     virtual void composeLayer(sp<Snapshot> current, sp<Snapshot> previous); | 
| Romain Guy | 694b519 | 2010-07-21 21:33:20 -0700 | [diff] [blame] | 488 |  | 
| Romain Guy | ada830f | 2011-01-13 12:13:20 -0800 | [diff] [blame] | 489 |     /** | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 490 |      * Marks the specified region as dirty at the specified bounds. | 
| Romain Guy | ada830f | 2011-01-13 12:13:20 -0800 | [diff] [blame] | 491 |      */ | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 492 |     void dirtyLayerUnchecked(Rect& bounds, Region* region); | 
| Romain Guy | ada830f | 2011-01-13 12:13:20 -0800 | [diff] [blame] | 493 |  | 
 | 494 |     /** | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 495 |      * Returns the current snapshot. | 
| Romain Guy | ada830f | 2011-01-13 12:13:20 -0800 | [diff] [blame] | 496 |      */ | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 497 |     sp<Snapshot> getSnapshot() const { | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 498 |         return mSnapshot; | 
 | 499 |     } | 
| Romain Guy | ada830f | 2011-01-13 12:13:20 -0800 | [diff] [blame] | 500 |  | 
| Romain Guy | 42f3a4b | 2011-01-19 13:42:26 -0800 | [diff] [blame] | 501 |     /** | 
 | 502 |      * Returns the region of the current layer. | 
 | 503 |      */ | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 504 |     virtual Region* getRegion() const { | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 505 |         return mSnapshot->region; | 
 | 506 |     } | 
 | 507 |  | 
| Romain Guy | 42f3a4b | 2011-01-19 13:42:26 -0800 | [diff] [blame] | 508 |     /** | 
 | 509 |      * Indicates whether rendering is currently targeted at a layer. | 
 | 510 |      */ | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 511 |     virtual bool hasLayer() const { | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 512 |         return (mSnapshot->flags & Snapshot::kFlagFboTarget) && mSnapshot->region; | 
 | 513 |     } | 
| Romain Guy | 1bd1bad | 2011-01-14 20:07:20 -0800 | [diff] [blame] | 514 |  | 
| Romain Guy | 42f3a4b | 2011-01-19 13:42:26 -0800 | [diff] [blame] | 515 |     /** | 
 | 516 |      * Returns the name of the FBO this renderer is rendering into. | 
 | 517 |      */ | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 518 |     virtual GLint getTargetFbo() const { | 
| Romain Guy | 42f3a4b | 2011-01-19 13:42:26 -0800 | [diff] [blame] | 519 |         return 0; | 
 | 520 |     } | 
 | 521 |  | 
| Romain Guy | 77a8116 | 2011-06-14 16:45:55 -0700 | [diff] [blame] | 522 |     /** | 
 | 523 |      * Renders the specified layer as a textured quad. | 
 | 524 |      * | 
 | 525 |      * @param layer The layer to render | 
 | 526 |      * @param rect The bounds of the layer | 
 | 527 |      */ | 
 | 528 |     void drawTextureLayer(Layer* layer, const Rect& rect); | 
 | 529 |  | 
| Romain Guy | be6f9dc | 2012-07-16 12:41:17 -0700 | [diff] [blame] | 530 |     /** | 
 | 531 |      * Gets the alpha and xfermode out of a paint object. If the paint is null | 
| Chris Craik | 16ecda5 | 2013-03-29 10:59:59 -0700 | [diff] [blame] | 532 |      * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both | 
 | 533 |      * snapshot alpha, and overrideLayerAlpha | 
| Romain Guy | be6f9dc | 2012-07-16 12:41:17 -0700 | [diff] [blame] | 534 |      * | 
 | 535 |      * @param paint The paint to extract values from | 
 | 536 |      * @param alpha Where to store the resulting alpha | 
 | 537 |      * @param mode Where to store the resulting xfermode | 
 | 538 |      */ | 
| Chris Craik | 16ecda5 | 2013-03-29 10:59:59 -0700 | [diff] [blame] | 539 |     inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const; | 
 | 540 |  | 
 | 541 |     /** | 
 | 542 |      * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha | 
 | 543 |      * | 
 | 544 |      * @param layer The layer from which the alpha is extracted | 
 | 545 |      */ | 
 | 546 |     inline float getLayerAlpha(Layer* layer) const; | 
| Romain Guy | be6f9dc | 2012-07-16 12:41:17 -0700 | [diff] [blame] | 547 |  | 
 | 548 |     /** | 
| Romain Guy | be6f9dc | 2012-07-16 12:41:17 -0700 | [diff] [blame] | 549 |      * Safely retrieves the mode from the specified xfermode. If the specified | 
 | 550 |      * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode. | 
 | 551 |      */ | 
 | 552 |     static inline SkXfermode::Mode getXfermode(SkXfermode* mode) { | 
 | 553 |         SkXfermode::Mode resultMode; | 
 | 554 |         if (!SkXfermode::AsMode(mode, &resultMode)) { | 
 | 555 |             resultMode = SkXfermode::kSrcOver_Mode; | 
 | 556 |         } | 
 | 557 |         return resultMode; | 
 | 558 |     } | 
 | 559 |  | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 560 |     /** | 
 | 561 |      * Set to true to suppress error checks at the end of a frame. | 
 | 562 |      */ | 
| Romain Guy | 624234f | 2013-03-05 16:43:31 -0800 | [diff] [blame] | 563 |     virtual bool suppressErrorChecks() const { | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 564 |         return false; | 
 | 565 |     } | 
 | 566 |  | 
| Romain Guy | 85bf02f | 2010-06-22 13:11:24 -0700 | [diff] [blame] | 567 | private: | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 568 |     /** | 
| Romain Guy | dcfc836 | 2013-01-03 13:08:57 -0800 | [diff] [blame] | 569 |      * Discards the content of the framebuffer if supported by the driver. | 
 | 570 |      * This method should be called at the beginning of a frame to optimize | 
 | 571 |      * rendering on some tiler architectures. | 
 | 572 |      */ | 
 | 573 |     void discardFramebuffer(float left, float top, float right, float bottom); | 
 | 574 |  | 
 | 575 |     /** | 
| Romain Guy | ddf7437 | 2012-05-22 14:07:07 -0700 | [diff] [blame] | 576 |      * Ensures the state of the renderer is the same as the state of | 
 | 577 |      * the GL context. | 
 | 578 |      */ | 
 | 579 |     void syncState(); | 
 | 580 |  | 
 | 581 |     /** | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 582 |      * Tells the GPU what part of the screen is about to be redrawn. | 
| Romain Guy | c3fedaf | 2013-01-29 17:26:25 -0800 | [diff] [blame] | 583 |      * This method will use the clip rect that we started drawing the | 
 | 584 |      * frame with. | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 585 |      * This method needs to be invoked every time getTargetFbo() is | 
 | 586 |      * bound again. | 
 | 587 |      */ | 
| Romain Guy | 57b5268 | 2012-09-20 17:38:46 -0700 | [diff] [blame] | 588 |     void startTiling(const sp<Snapshot>& snapshot, bool opaque = false); | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 589 |  | 
 | 590 |     /** | 
| Romain Guy | c3fedaf | 2013-01-29 17:26:25 -0800 | [diff] [blame] | 591 |      * Tells the GPU what part of the screen is about to be redrawn. | 
 | 592 |      * This method needs to be invoked every time getTargetFbo() is | 
 | 593 |      * bound again. | 
 | 594 |      */ | 
 | 595 |     void startTiling(const Rect& clip, int windowHeight, bool opaque = false); | 
 | 596 |  | 
 | 597 |     /** | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 598 |      * Tells the GPU that we are done drawing the frame or that we | 
 | 599 |      * are switching to another render target. | 
 | 600 |      */ | 
 | 601 |     void endTiling(); | 
 | 602 |  | 
 | 603 |     /** | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 604 |      * Saves the current state of the renderer as a new snapshot. | 
 | 605 |      * The new snapshot is saved in mSnapshot and the previous snapshot | 
 | 606 |      * is linked from mSnapshot->previous. | 
 | 607 |      * | 
| Romain Guy | 8aef54f | 2010-09-01 15:13:49 -0700 | [diff] [blame] | 608 |      * @param flags The save flags; see SkCanvas for more information | 
 | 609 |      * | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 610 |      * @return The new save count. This value can be passed to #restoreToCount() | 
 | 611 |      */ | 
| Romain Guy | 8aef54f | 2010-09-01 15:13:49 -0700 | [diff] [blame] | 612 |     int saveSnapshot(int flags); | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 613 |  | 
 | 614 |     /** | 
 | 615 |      * Restores the current snapshot; mSnapshot becomes mSnapshot->previous. | 
 | 616 |      * | 
| Romain Guy | 2542d19 | 2010-08-18 11:47:12 -0700 | [diff] [blame] | 617 |      * @return True if the clip was modified. | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 618 |      */ | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 619 |     bool restoreSnapshot(); | 
 | 620 |  | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 621 |     /** | 
 | 622 |      * Sets the clipping rectangle using glScissor. The clip is defined by | 
 | 623 |      * the current snapshot's clipRect member. | 
 | 624 |      */ | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 625 |     void setScissorFromClip(); | 
 | 626 |  | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 627 |     /** | 
| Romain Guy | 8ce0030 | 2013-01-15 18:51:42 -0800 | [diff] [blame] | 628 |      * Sets the clipping region using the stencil buffer. The clip region | 
 | 629 |      * is defined by the current snapshot's clipRegion member. | 
 | 630 |      */ | 
 | 631 |     void setStencilFromClip(); | 
 | 632 |  | 
 | 633 |     /** | 
| Chris Craik | 408eb12 | 2013-03-26 18:55:15 -0700 | [diff] [blame] | 634 |      * Given the local bounds of the layer, calculates ... | 
| Chris Craik | d90144d | 2013-03-19 15:03:48 -0700 | [diff] [blame] | 635 |      */ | 
 | 636 |     void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer); | 
 | 637 |  | 
 | 638 |     /** | 
| Chris Craik | 408eb12 | 2013-03-26 18:55:15 -0700 | [diff] [blame] | 639 |      * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible | 
 | 640 |      */ | 
 | 641 |     void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip, | 
 | 642 |             bool fboLayer, int alpha); | 
 | 643 |  | 
 | 644 |     /** | 
| Romain Guy | d55a861 | 2010-06-28 17:42:46 -0700 | [diff] [blame] | 645 |      * Creates a new layer stored in the specified snapshot. | 
 | 646 |      * | 
 | 647 |      * @param snapshot The snapshot associated with the new layer | 
 | 648 |      * @param left The left coordinate of the layer | 
 | 649 |      * @param top The top coordinate of the layer | 
 | 650 |      * @param right The right coordinate of the layer | 
 | 651 |      * @param bottom The bottom coordinate of the layer | 
 | 652 |      * @param alpha The translucency of the layer | 
 | 653 |      * @param mode The blending mode of the layer | 
 | 654 |      * @param flags The layer save flags | 
| Romain Guy | eb99356 | 2010-10-05 18:14:38 -0700 | [diff] [blame] | 655 |      * @param previousFbo The name of the current framebuffer | 
| Romain Guy | d55a861 | 2010-06-28 17:42:46 -0700 | [diff] [blame] | 656 |      * | 
 | 657 |      * @return True if the layer was successfully created, false otherwise | 
 | 658 |      */ | 
| Chet Haase | d48885a | 2012-08-28 17:43:28 -0700 | [diff] [blame] | 659 |     bool createLayer(float left, float top, float right, float bottom, | 
| Romain Guy | eb99356 | 2010-10-05 18:14:38 -0700 | [diff] [blame] | 660 |             int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo); | 
| Romain Guy | d55a861 | 2010-06-28 17:42:46 -0700 | [diff] [blame] | 661 |  | 
 | 662 |     /** | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 663 |      * Creates a new layer stored in the specified snapshot as an FBO. | 
 | 664 |      * | 
 | 665 |      * @param layer The layer to store as an FBO | 
 | 666 |      * @param snapshot The snapshot associated with the new layer | 
 | 667 |      * @param bounds The bounds of the layer | 
 | 668 |      * @param previousFbo The name of the current framebuffer | 
 | 669 |      */ | 
| Chet Haase | d48885a | 2012-08-28 17:43:28 -0700 | [diff] [blame] | 670 |     bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo); | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 671 |  | 
 | 672 |     /** | 
 | 673 |      * Compose the specified layer as a region. | 
 | 674 |      * | 
 | 675 |      * @param layer The layer to compose | 
 | 676 |      * @param rect The layer's bounds | 
 | 677 |      */ | 
 | 678 |     void composeLayerRegion(Layer* layer, const Rect& rect); | 
 | 679 |  | 
 | 680 |     /** | 
 | 681 |      * Compose the specified layer as a simple rectangle. | 
 | 682 |      * | 
 | 683 |      * @param layer The layer to compose | 
 | 684 |      * @param rect The layer's bounds | 
 | 685 |      * @param swap If true, the source and destination are swapped | 
 | 686 |      */ | 
 | 687 |     void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false); | 
 | 688 |  | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 689 |     /** | 
 | 690 |      * Clears all the regions corresponding to the current list of layers. | 
 | 691 |      * This method MUST be invoked before any drawing operation. | 
 | 692 |      */ | 
 | 693 |     void clearLayerRegions(); | 
 | 694 |  | 
 | 695 |     /** | 
| Romain Guy | f219da5 | 2011-01-16 12:54:25 -0800 | [diff] [blame] | 696 |      * Mark the layer as dirty at the specified coordinates. The coordinates | 
 | 697 |      * are transformed with the supplied matrix. | 
 | 698 |      */ | 
 | 699 |     void dirtyLayer(const float left, const float top, | 
 | 700 |             const float right, const float bottom, const mat4 transform); | 
 | 701 |  | 
 | 702 |     /** | 
 | 703 |      * Mark the layer as dirty at the specified coordinates. | 
 | 704 |      */ | 
 | 705 |     void dirtyLayer(const float left, const float top, | 
 | 706 |             const float right, const float bottom); | 
 | 707 |  | 
 | 708 |     /** | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 709 |      * Draws a colored rectangle with the specified color. The specified coordinates | 
| Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 710 |      * are transformed by the current snapshot's transform matrix unless specified | 
 | 711 |      * otherwise. | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 712 |      * | 
 | 713 |      * @param left The left coordinate of the rectangle | 
 | 714 |      * @param top The top coordinate of the rectangle | 
 | 715 |      * @param right The right coordinate of the rectangle | 
 | 716 |      * @param bottom The bottom coordinate of the rectangle | 
 | 717 |      * @param color The rectangle's ARGB color, defined as a packed 32 bits word | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 718 |      * @param mode The Skia xfermode to use | 
| Romain Guy | 3d58c03 | 2010-07-14 16:34:53 -0700 | [diff] [blame] | 719 |      * @param ignoreTransform True if the current transform should be ignored | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 720 |      */ | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 721 |     void drawColorRect(float left, float top, float right, float bottom, | 
| Romain Guy | 1c740bc | 2010-09-13 18:00:09 -0700 | [diff] [blame] | 722 |             int color, SkXfermode::Mode mode, bool ignoreTransform = false); | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 723 |  | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 724 |     /** | 
| Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 725 |      * Draws a series of colored rectangles with the specified color. The specified | 
 | 726 |      * coordinates are transformed by the current snapshot's transform matrix unless | 
 | 727 |      * specified otherwise. | 
 | 728 |      * | 
 | 729 |      * @param rects A list of rectangles, 4 floats (left, top, right, bottom) | 
 | 730 |      *              per rectangle | 
 | 731 |      * @param color The rectangles' ARGB color, defined as a packed 32 bits word | 
 | 732 |      * @param mode The Skia xfermode to use | 
 | 733 |      * @param ignoreTransform True if the current transform should be ignored | 
| Romain Guy | 8ce0030 | 2013-01-15 18:51:42 -0800 | [diff] [blame] | 734 |      * @param dirty True if calling this method should dirty the current layer | 
| Romain Guy | 3bbacf2 | 2013-02-06 16:51:04 -0800 | [diff] [blame] | 735 |      * @param clip True if the rects should be clipped, false otherwise | 
| Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 736 |      */ | 
 | 737 |     status_t drawColorRects(const float* rects, int count, int color, | 
| Romain Guy | 3bbacf2 | 2013-02-06 16:51:04 -0800 | [diff] [blame] | 738 |             SkXfermode::Mode mode, bool ignoreTransform = false, | 
 | 739 |             bool dirty = true, bool clip = true); | 
| Romain Guy | 735738c | 2012-12-03 12:34:51 -0800 | [diff] [blame] | 740 |  | 
 | 741 |     /** | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 742 |      * Draws the shape represented by the specified path texture. | 
 | 743 |      * This method invokes drawPathTexture() but takes into account | 
 | 744 |      * the extra left/top offset and the texture offset to correctly | 
 | 745 |      * position the final shape. | 
 | 746 |      * | 
 | 747 |      * @param left The left coordinate of the shape to render | 
 | 748 |      * @param top The top coordinate of the shape to render | 
 | 749 |      * @param texture The texture reprsenting the shape | 
 | 750 |      * @param paint The paint to draw the shape with | 
 | 751 |      */ | 
| Chet Haase | 4865909 | 2012-05-31 15:21:51 -0700 | [diff] [blame] | 752 |     status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint); | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 753 |  | 
 | 754 |     /** | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 755 |      * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey | 
 | 756 |      * different compositing rules. | 
 | 757 |      * | 
 | 758 |      * @param texture The texture to draw with | 
 | 759 |      * @param left The x coordinate of the bitmap | 
 | 760 |      * @param top The y coordinate of the bitmap | 
 | 761 |      * @param paint The paint to render with | 
 | 762 |      */ | 
| Romain Guy | a168d73 | 2011-03-18 16:50:13 -0700 | [diff] [blame] | 763 |     void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint); | 
 | 764 |  | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 765 |     /** | 
| Chris Craik | 65cd612 | 2012-12-10 17:56:27 -0800 | [diff] [blame] | 766 |      * Renders a strip of polygons with the specified paint, used for tessellated geometry. | 
 | 767 |      * | 
 | 768 |      * @param vertexBuffer The VertexBuffer to be drawn | 
 | 769 |      * @param paint The paint to render with | 
 | 770 |      * @param useOffset Offset the vertexBuffer (used in drawing non-AA lines) | 
 | 771 |      */ | 
 | 772 |     status_t drawVertexBuffer(const VertexBuffer& vertexBuffer, SkPaint* paint, | 
 | 773 |             bool useOffset = false); | 
 | 774 |  | 
 | 775 |     /** | 
| Chris Craik | 710f46d | 2012-09-17 17:25:49 -0700 | [diff] [blame] | 776 |      * Renders the convex hull defined by the specified path as a strip of polygons. | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 777 |      * | 
| Chris Craik | 710f46d | 2012-09-17 17:25:49 -0700 | [diff] [blame] | 778 |      * @param path The hull of the path to draw | 
| Chris Craik | cb4d600 | 2012-09-25 12:00:29 -0700 | [diff] [blame] | 779 |      * @param paint The paint to render with | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 780 |      */ | 
| Chris Craik | 65cd612 | 2012-12-10 17:56:27 -0800 | [diff] [blame] | 781 |     status_t drawConvexPath(const SkPath& path, SkPaint* paint); | 
| Chet Haase | 858aa93 | 2011-05-12 09:06:00 -0700 | [diff] [blame] | 782 |  | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 783 |     /** | 
 | 784 |      * Draws a textured rectangle with the specified texture. The specified coordinates | 
 | 785 |      * are transformed by the current snapshot's transform matrix. | 
 | 786 |      * | 
 | 787 |      * @param left The left coordinate of the rectangle | 
 | 788 |      * @param top The top coordinate of the rectangle | 
 | 789 |      * @param right The right coordinate of the rectangle | 
 | 790 |      * @param bottom The bottom coordinate of the rectangle | 
 | 791 |      * @param texture The texture name to map onto the rectangle | 
 | 792 |      * @param alpha An additional translucency parameter, between 0.0f and 1.0f | 
| Romain Guy | d55a861 | 2010-06-28 17:42:46 -0700 | [diff] [blame] | 793 |      * @param mode The blending mode | 
| Romain Guy | c1396e9 | 2010-06-30 17:56:19 -0700 | [diff] [blame] | 794 |      * @param blend True if the texture contains an alpha channel | 
| Romain Guy | 5cbbce5 | 2010-06-27 22:59:20 -0700 | [diff] [blame] | 795 |      */ | 
| Romain Guy | bd6b79b | 2010-06-26 00:13:53 -0700 | [diff] [blame] | 796 |     void drawTextureRect(float left, float top, float right, float bottom, GLuint texture, | 
| Romain Guy | a979474 | 2010-07-13 11:37:54 -0700 | [diff] [blame] | 797 |             float alpha, SkXfermode::Mode mode, bool blend); | 
| Romain Guy | c7d5349 | 2010-06-25 13:41:57 -0700 | [diff] [blame] | 798 |  | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 799 |     /** | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 800 |      * Draws a textured rectangle with the specified texture. The specified coordinates | 
 | 801 |      * are transformed by the current snapshot's transform matrix. | 
 | 802 |      * | 
 | 803 |      * @param left The left coordinate of the rectangle | 
 | 804 |      * @param top The top coordinate of the rectangle | 
 | 805 |      * @param right The right coordinate of the rectangle | 
 | 806 |      * @param bottom The bottom coordinate of the rectangle | 
 | 807 |      * @param texture The texture to use | 
 | 808 |      * @param paint The paint containing the alpha, blending mode, etc. | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 809 |      */ | 
| Romain Guy | a979474 | 2010-07-13 11:37:54 -0700 | [diff] [blame] | 810 |     void drawTextureRect(float left, float top, float right, float bottom, | 
| Romain Guy | 8164c2d | 2010-10-25 18:03:28 -0700 | [diff] [blame] | 811 |             Texture* texture, SkPaint* paint); | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 812 |  | 
 | 813 |     /** | 
| Romain Guy | 03750a0 | 2010-10-18 14:06:08 -0700 | [diff] [blame] | 814 |      * Draws a textured mesh with the specified texture. If the indices are omitted, | 
 | 815 |      * the mesh is drawn as a simple quad. The mesh pointers become offsets when a | 
 | 816 |      * VBO is bound. | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 817 |      * | 
 | 818 |      * @param left The left coordinate of the rectangle | 
 | 819 |      * @param top The top coordinate of the rectangle | 
 | 820 |      * @param right The right coordinate of the rectangle | 
 | 821 |      * @param bottom The bottom coordinate of the rectangle | 
 | 822 |      * @param texture The texture name to map onto the rectangle | 
 | 823 |      * @param alpha An additional translucency parameter, between 0.0f and 1.0f | 
 | 824 |      * @param mode The blending mode | 
 | 825 |      * @param blend True if the texture contains an alpha channel | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 826 |      * @param vertices The vertices that define the mesh | 
 | 827 |      * @param texCoords The texture coordinates of each vertex | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 828 |      * @param elementsCount The number of elements in the mesh, required by indices | 
| Romain Guy | f607bdc | 2010-09-10 19:20:06 -0700 | [diff] [blame] | 829 |      * @param swapSrcDst Whether or not the src and dst blending operations should be swapped | 
 | 830 |      * @param ignoreTransform True if the current transform should be ignored | 
| Romain Guy | 03750a0 | 2010-10-18 14:06:08 -0700 | [diff] [blame] | 831 |      * @param vbo The VBO used to draw the mesh | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 832 |      * @param ignoreScale True if the model view matrix should not be scaled | 
 | 833 |      * @param dirty True if calling this method should dirty the current layer | 
| Romain Guy | f7f9355 | 2010-07-08 19:17:03 -0700 | [diff] [blame] | 834 |      */ | 
 | 835 |     void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, | 
| Romain Guy | a979474 | 2010-07-13 11:37:54 -0700 | [diff] [blame] | 836 |             float alpha, SkXfermode::Mode mode, bool blend, | 
| Romain Guy | 6820ac8 | 2010-09-15 18:11:50 -0700 | [diff] [blame] | 837 |             GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 838 |             bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0, | 
 | 839 |             bool ignoreScale = false, bool dirty = true); | 
| Romain Guy | f7f9355 | 2010-07-08 19:17:03 -0700 | [diff] [blame] | 840 |  | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 841 |     void drawIndexedTextureMesh(float left, float top, float right, float bottom, GLuint texture, | 
 | 842 |             float alpha, SkXfermode::Mode mode, bool blend, | 
 | 843 |             GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, | 
 | 844 |             bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0, | 
 | 845 |             bool ignoreScale = false, bool dirty = true); | 
 | 846 |  | 
| Romain Guy | 886b275 | 2013-01-04 12:26:18 -0800 | [diff] [blame] | 847 |     void drawAlpha8TextureMesh(float left, float top, float right, float bottom, | 
 | 848 |             GLuint texture, bool hasColor, int color, int alpha, SkXfermode::Mode mode, | 
 | 849 |             GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, | 
| Chris Craik | 527a3aa | 2013-03-04 10:19:31 -0800 | [diff] [blame] | 850 |             bool ignoreTransform, bool ignoreScale = false, bool dirty = true); | 
| Romain Guy | 886b275 | 2013-01-04 12:26:18 -0800 | [diff] [blame] | 851 |  | 
| Romain Guy | f7f9355 | 2010-07-08 19:17:03 -0700 | [diff] [blame] | 852 |     /** | 
| Romain Guy | 0a41749 | 2010-08-16 20:26:20 -0700 | [diff] [blame] | 853 |      * Draws text underline and strike-through if needed. | 
 | 854 |      * | 
 | 855 |      * @param text The text to decor | 
 | 856 |      * @param bytesCount The number of bytes in the text | 
| Chris Craik | 4154182 | 2013-05-03 16:35:54 -0700 | [diff] [blame] | 857 |      * @param totalAdvance The total advance in pixels, defines underline/strikethrough length | 
| Romain Guy | 0a41749 | 2010-08-16 20:26:20 -0700 | [diff] [blame] | 858 |      * @param x The x coordinate where the text will be drawn | 
 | 859 |      * @param y The y coordinate where the text will be drawn | 
 | 860 |      * @param paint The paint to draw the text with | 
 | 861 |      */ | 
| Chris Craik | 4154182 | 2013-05-03 16:35:54 -0700 | [diff] [blame] | 862 |     void drawTextDecorations(const char* text, int bytesCount, float totalAdvance, | 
| Romain Guy | 0a41749 | 2010-08-16 20:26:20 -0700 | [diff] [blame] | 863 |             float x, float y, SkPaint* paint); | 
| Romain Guy | 1e45aae | 2010-08-13 19:39:53 -0700 | [diff] [blame] | 864 |  | 
| Raph Levien | 416a847 | 2012-07-19 22:48:17 -0700 | [diff] [blame] | 865 |    /** | 
 | 866 |      * Draws shadow layer on text (with optional positions). | 
 | 867 |      * | 
 | 868 |      * @param paint The paint to draw the shadow with | 
 | 869 |      * @param text The text to draw | 
 | 870 |      * @param bytesCount The number of bytes in the text | 
 | 871 |      * @param count The number of glyphs in the text | 
 | 872 |      * @param positions The x, y positions of individual glyphs (or NULL) | 
 | 873 |      * @param fontRenderer The font renderer object | 
 | 874 |      * @param alpha The alpha value for drawing the shadow | 
 | 875 |      * @param mode The xfermode for drawing the shadow | 
 | 876 |      * @param x The x coordinate where the shadow will be drawn | 
 | 877 |      * @param y The y coordinate where the shadow will be drawn | 
 | 878 |      */ | 
 | 879 |     void drawTextShadow(SkPaint* paint, const char* text, int bytesCount, int count, | 
 | 880 |             const float* positions, FontRenderer& fontRenderer, int alpha, SkXfermode::Mode mode, | 
 | 881 |             float x, float y); | 
 | 882 |  | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 883 |     /** | 
 | 884 |      * Draws a path texture. Path textures are alpha8 bitmaps that need special | 
 | 885 |      * compositing to apply colors/filters/etc. | 
 | 886 |      * | 
 | 887 |      * @param texture The texture to render | 
 | 888 |      * @param x The x coordinate where the texture will be drawn | 
 | 889 |      * @param y The y coordinate where the texture will be drawn | 
 | 890 |      * @param paint The paint to draw the texture with | 
 | 891 |      */ | 
| Raph Levien | 416a847 | 2012-07-19 22:48:17 -0700 | [diff] [blame] | 892 |      void drawPathTexture(const PathTexture* texture, float x, float y, SkPaint* paint); | 
| Romain Guy | 01d58e4 | 2011-01-19 21:54:02 -0800 | [diff] [blame] | 893 |  | 
| Romain Guy | 1e45aae | 2010-08-13 19:39:53 -0700 | [diff] [blame] | 894 |     /** | 
| Romain Guy | ac670c0 | 2010-07-27 17:39:27 -0700 | [diff] [blame] | 895 |      * Resets the texture coordinates stored in mMeshVertices. Setting the values | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 896 |      * back to default is achieved by calling: | 
 | 897 |      * | 
| Romain Guy | 8ba548f | 2010-06-30 19:21:21 -0700 | [diff] [blame] | 898 |      * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 899 |      * | 
 | 900 |      * @param u1 The left coordinate of the texture | 
 | 901 |      * @param v1 The bottom coordinate of the texture | 
 | 902 |      * @param u2 The right coordinate of the texture | 
 | 903 |      * @param v2 The top coordinate of the texture | 
 | 904 |      */ | 
 | 905 |     void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2); | 
 | 906 |  | 
| Romain Guy | 8ba548f | 2010-06-30 19:21:21 -0700 | [diff] [blame] | 907 |     /** | 
| Romain Guy | 768bffc | 2013-02-27 13:50:45 -0800 | [diff] [blame] | 908 |      * Returns true if the specified paint will draw invisible text. | 
 | 909 |      */ | 
 | 910 |     bool canSkipText(const SkPaint* paint) const; | 
 | 911 |  | 
 | 912 |     /** | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 913 |      * Binds the specified texture. The texture unit must have been selected | 
 | 914 |      * prior to calling this method. | 
| Romain Guy | a1db574 | 2010-07-20 13:09:13 -0700 | [diff] [blame] | 915 |      */ | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 916 |     inline void bindTexture(GLuint texture) { | 
| Romain Guy | 8aa195d | 2013-06-04 18:00:09 -0700 | [diff] [blame] | 917 |         mCaches.bindTexture(texture); | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 918 |     } | 
 | 919 |  | 
 | 920 |     /** | 
| Romain Guy | aa6c24c | 2011-04-28 18:40:04 -0700 | [diff] [blame] | 921 |      * Binds the specified EGLImage texture. The texture unit must have been selected | 
 | 922 |      * prior to calling this method. | 
 | 923 |      */ | 
 | 924 |     inline void bindExternalTexture(GLuint texture) { | 
| Romain Guy | 8aa195d | 2013-06-04 18:00:09 -0700 | [diff] [blame] | 925 |         mCaches.bindTexture(GL_TEXTURE_EXTERNAL_OES, texture); | 
| Romain Guy | aa6c24c | 2011-04-28 18:40:04 -0700 | [diff] [blame] | 926 |     } | 
 | 927 |  | 
 | 928 |     /** | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 929 |      * Enable or disable blending as necessary. This function sets the appropriate | 
 | 930 |      * blend function based on the specified xfermode. | 
 | 931 |      */ | 
| Romain Guy | f607bdc | 2010-09-10 19:20:06 -0700 | [diff] [blame] | 932 |     inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description, | 
 | 933 |             bool swapSrcDst = false); | 
| Romain Guy | a5aed0d | 2010-09-09 14:42:43 -0700 | [diff] [blame] | 934 |  | 
| Romain Guy | f607bdc | 2010-09-10 19:20:06 -0700 | [diff] [blame] | 935 |     /** | 
| Romain Guy | d27977d | 2010-07-14 19:18:51 -0700 | [diff] [blame] | 936 |      * Use the specified program with the current GL context. If the program is already | 
 | 937 |      * in use, it will not be bound again. If it is not in use, the current program is | 
 | 938 |      * marked unused and the specified program becomes used and becomes the new | 
 | 939 |      * current program. | 
| Romain Guy | 6926c72 | 2010-07-12 20:20:03 -0700 | [diff] [blame] | 940 |      * | 
| Romain Guy | d27977d | 2010-07-14 19:18:51 -0700 | [diff] [blame] | 941 |      * @param program The program to use | 
 | 942 |      * | 
 | 943 |      * @return true If the specified program was already in use, false otherwise. | 
| Romain Guy | 260e102 | 2010-07-12 14:41:06 -0700 | [diff] [blame] | 944 |      */ | 
| Romain Guy | 889f8d1 | 2010-07-29 14:37:42 -0700 | [diff] [blame] | 945 |     inline bool useProgram(Program* program); | 
| Romain Guy | 260e102 | 2010-07-12 14:41:06 -0700 | [diff] [blame] | 946 |  | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 947 |     /** | 
 | 948 |      * Invoked before any drawing operation. This sets required state. | 
 | 949 |      */ | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 950 |     void setupDraw(bool clear = true); | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 951 |  | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 952 |     /** | 
 | 953 |      * Various methods to setup OpenGL rendering. | 
 | 954 |      */ | 
 | 955 |     void setupDrawWithTexture(bool isAlpha8 = false); | 
| Romain Guy | ff316ec | 2013-02-13 18:39:43 -0800 | [diff] [blame] | 956 |     void setupDrawWithTextureAndColor(bool isAlpha8 = false); | 
| Romain Guy | aa6c24c | 2011-04-28 18:40:04 -0700 | [diff] [blame] | 957 |     void setupDrawWithExternalTexture(); | 
| Romain Guy | 15bc643 | 2011-12-13 13:11:32 -0800 | [diff] [blame] | 958 |     void setupDrawNoTexture(); | 
| Chris Craik | 710f46d | 2012-09-17 17:25:49 -0700 | [diff] [blame] | 959 |     void setupDrawAA(); | 
| Romain Guy | 8d0d478 | 2010-12-14 20:13:35 -0800 | [diff] [blame] | 960 |     void setupDrawColor(int color, int alpha); | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 961 |     void setupDrawColor(float r, float g, float b, float a); | 
| Romain Guy | 8656819 | 2010-12-14 15:55:39 -0800 | [diff] [blame] | 962 |     void setupDrawAlpha8Color(int color, int alpha); | 
| Romain Guy | 4121063 | 2012-07-16 17:04:24 -0700 | [diff] [blame] | 963 |     void setupDrawTextGamma(const SkPaint* paint); | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 964 |     void setupDrawShader(); | 
 | 965 |     void setupDrawColorFilter(); | 
 | 966 |     void setupDrawBlending(SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode, | 
 | 967 |             bool swapSrcDst = false); | 
 | 968 |     void setupDrawBlending(bool blend = true, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode, | 
 | 969 |             bool swapSrcDst = false); | 
 | 970 |     void setupDrawProgram(); | 
 | 971 |     void setupDrawDirtyRegionsDisabled(); | 
| Chet Haase | 8a5cc92 | 2011-04-26 07:28:09 -0700 | [diff] [blame] | 972 |     void setupDrawModelViewIdentity(bool offset = false); | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 973 |     void setupDrawModelView(float left, float top, float right, float bottom, | 
 | 974 |             bool ignoreTransform = false, bool ignoreModelView = false); | 
 | 975 |     void setupDrawModelViewTranslate(float left, float top, float right, float bottom, | 
 | 976 |             bool ignoreTransform = false); | 
 | 977 |     void setupDrawColorUniforms(); | 
| Romain Guy | 8656819 | 2010-12-14 15:55:39 -0800 | [diff] [blame] | 978 |     void setupDrawPureColorUniforms(); | 
| Romain Guy | 8d0d478 | 2010-12-14 20:13:35 -0800 | [diff] [blame] | 979 |     void setupDrawShaderIdentityUniforms(); | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 980 |     void setupDrawShaderUniforms(bool ignoreTransform = false); | 
 | 981 |     void setupDrawColorFilterUniforms(); | 
 | 982 |     void setupDrawSimpleMesh(); | 
 | 983 |     void setupDrawTexture(GLuint texture); | 
| Romain Guy | aa6c24c | 2011-04-28 18:40:04 -0700 | [diff] [blame] | 984 |     void setupDrawExternalTexture(GLuint texture); | 
| Romain Guy | 8f0095c | 2011-05-02 17:24:22 -0700 | [diff] [blame] | 985 |     void setupDrawTextureTransform(); | 
 | 986 |     void setupDrawTextureTransformUniforms(mat4& transform); | 
| Romain Guy | 4121063 | 2012-07-16 17:04:24 -0700 | [diff] [blame] | 987 |     void setupDrawTextGammaUniforms(); | 
| Romain Guy | 8d0d478 | 2010-12-14 20:13:35 -0800 | [diff] [blame] | 988 |     void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0); | 
| Romain Guy | ff316ec | 2013-02-13 18:39:43 -0800 | [diff] [blame] | 989 |     void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords, GLvoid* colors); | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 990 |     void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords, GLuint vbo = 0); | 
| Chet Haase | 5b0200b | 2011-04-13 17:58:08 -0700 | [diff] [blame] | 991 |     void setupDrawVertices(GLvoid* vertices); | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 992 |     void finishDrawTexture(); | 
| Romain Guy | f09ef51 | 2011-05-27 11:43:46 -0700 | [diff] [blame] | 993 |     void accountForClear(SkXfermode::Mode mode); | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 994 |  | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 995 |     bool updateLayer(Layer* layer, bool inFrame); | 
 | 996 |     void updateLayers(); | 
| Romain Guy | 96885eb | 2013-03-26 15:05:58 -0700 | [diff] [blame] | 997 |     void flushLayers(); | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 998 |  | 
| Romain Guy | 17112ad | 2012-08-07 11:24:39 -0700 | [diff] [blame] | 999 |     /** | 
 | 1000 |      * Renders the specified region as a series of rectangles. This method | 
 | 1001 |      * is used for debugging only. | 
 | 1002 |      */ | 
| Romain Guy | 3a3133d | 2011-02-01 22:59:58 -0800 | [diff] [blame] | 1003 |     void drawRegionRects(const Region& region); | 
 | 1004 |  | 
| Romain Guy | 8ce0030 | 2013-01-15 18:51:42 -0800 | [diff] [blame] | 1005 |     /** | 
 | 1006 |      * Renders the specified region as a series of rectangles. The region | 
 | 1007 |      * must be in screen-space coordinates. | 
 | 1008 |      */ | 
 | 1009 |     void drawRegionRects(const SkRegion& region, int color, SkXfermode::Mode mode, | 
 | 1010 |             bool dirty = false); | 
 | 1011 |  | 
 | 1012 |     /** | 
 | 1013 |      * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS | 
 | 1014 |      * is turned on. | 
 | 1015 |      */ | 
 | 1016 |     void debugClip(); | 
 | 1017 |  | 
| Romain Guy | 7c450aa | 2012-09-21 19:15:00 -0700 | [diff] [blame] | 1018 |     void debugOverdraw(bool enable, bool clear); | 
 | 1019 |     void renderOverdraw(); | 
| Romain Guy | 78dd96d | 2013-05-03 14:24:16 -0700 | [diff] [blame] | 1020 |     void countOverdraw(); | 
| Romain Guy | 7c450aa | 2012-09-21 19:15:00 -0700 | [diff] [blame] | 1021 |  | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 1022 |     /** | 
 | 1023 |      * Should be invoked every time the glScissor is modified. | 
 | 1024 |      */ | 
 | 1025 |     inline void dirtyClip() { | 
 | 1026 |         mDirtyClip = true; | 
 | 1027 |     } | 
 | 1028 |  | 
| Romain Guy | 3b75382 | 2013-03-05 10:27:35 -0800 | [diff] [blame] | 1029 |     inline mat4& currentTransform() const { | 
 | 1030 |         return *mSnapshot->transform; | 
 | 1031 |     } | 
 | 1032 |  | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 1033 |     inline const UvMapper& getMapper(const Texture* texture) { | 
 | 1034 |         return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper; | 
 | 1035 |     } | 
 | 1036 |  | 
 | 1037 |     /** | 
 | 1038 |      * Returns a texture object for the specified bitmap. The texture can | 
 | 1039 |      * come from the texture cache or an atlas. If this method returns | 
 | 1040 |      * NULL, the texture could not be found and/or allocated. | 
 | 1041 |      */ | 
 | 1042 |     Texture* getTexture(SkBitmap* bitmap); | 
 | 1043 |  | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 1044 |     // Dimensions of the drawing surface | 
 | 1045 |     int mWidth, mHeight; | 
 | 1046 |  | 
| Romain Guy | 85bf02f | 2010-06-22 13:11:24 -0700 | [diff] [blame] | 1047 |     // Matrix used for ortho projection in shaders | 
| Romain Guy | 260e102 | 2010-07-12 14:41:06 -0700 | [diff] [blame] | 1048 |     mat4 mOrthoMatrix; | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 1049 |  | 
| Romain Guy | c7d5349 | 2010-06-25 13:41:57 -0700 | [diff] [blame] | 1050 |     // Model-view matrix used to position/size objects | 
 | 1051 |     mat4 mModelView; | 
 | 1052 |  | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 1053 |     // Number of saved states | 
 | 1054 |     int mSaveCount; | 
| Romain Guy | f6a11b8 | 2010-06-23 17:47:49 -0700 | [diff] [blame] | 1055 |     // Base state | 
| Romain Guy | ae5575b | 2010-07-29 18:48:04 -0700 | [diff] [blame] | 1056 |     sp<Snapshot> mFirstSnapshot; | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 1057 |     // Current state | 
 | 1058 |     sp<Snapshot> mSnapshot; | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 1059 |     // State used to define the clipping region | 
| Chris Craik | 5f80362 | 2013-03-21 14:39:04 -0700 | [diff] [blame] | 1060 |     Rect mTilingClip; | 
| Romain Guy | 96885eb | 2013-03-26 15:05:58 -0700 | [diff] [blame] | 1061 |     // Is the target render surface opaque | 
 | 1062 |     bool mOpaque; | 
 | 1063 |     // Is a frame currently being rendered | 
 | 1064 |     bool mFrameStarted; | 
| Romain Guy | 9d5316e | 2010-06-24 19:30:36 -0700 | [diff] [blame] | 1065 |  | 
| Romain Guy | 026c5e16 | 2010-06-28 17:12:22 -0700 | [diff] [blame] | 1066 |     // Used to draw textured quads | 
| Romain Guy | ac670c0 | 2010-07-27 17:39:27 -0700 | [diff] [blame] | 1067 |     TextureVertex mMeshVertices[4]; | 
| Romain Guy | ce0537b | 2010-06-29 21:05:21 -0700 | [diff] [blame] | 1068 |  | 
| Romain Guy | 3b748a4 | 2013-04-17 18:54:38 -0700 | [diff] [blame] | 1069 |     // Default UV mapper | 
 | 1070 |     const UvMapper mUvMapper; | 
 | 1071 |  | 
| Chris Craik | c3566d0 | 2013-02-04 16:16:33 -0800 | [diff] [blame] | 1072 |     // shader, filters, and shadow | 
 | 1073 |     DrawModifiers mDrawModifiers; | 
| Romain Guy | 5ff9df6 | 2012-01-23 17:09:05 -0800 | [diff] [blame] | 1074 |     SkPaint mFilteredPaint; | 
 | 1075 |  | 
| Romain Guy | 82ba814 | 2010-07-09 13:25:56 -0700 | [diff] [blame] | 1076 |     // Various caches | 
| Romain Guy | fb8b763 | 2010-08-23 21:05:08 -0700 | [diff] [blame] | 1077 |     Caches& mCaches; | 
| Romain Guy | 3bbacf2 | 2013-02-06 16:51:04 -0800 | [diff] [blame] | 1078 |     Extensions& mExtensions; | 
| Romain Guy | 8694230 | 2010-09-12 13:02:16 -0700 | [diff] [blame] | 1079 |  | 
| Romain Guy | 8f3b8e3 | 2012-03-27 16:33:45 -0700 | [diff] [blame] | 1080 |     // List of rectangles to clear after saveLayer() is invoked | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 1081 |     Vector<Rect*> mLayers; | 
| Romain Guy | 8f3b8e3 | 2012-03-27 16:33:45 -0700 | [diff] [blame] | 1082 |     // List of functors to invoke after a frame is drawn | 
| Romain Guy | ba6be8a | 2012-04-23 18:22:09 -0700 | [diff] [blame] | 1083 |     SortedVector<Functor*> mFunctors; | 
| Romain Guy | 11cb642 | 2012-09-21 00:39:43 -0700 | [diff] [blame] | 1084 |     // List of layers to update at the beginning of a frame | 
 | 1085 |     Vector<Layer*> mLayerUpdates; | 
| Romain Guy | 54be1cd | 2011-06-13 19:04:27 -0700 | [diff] [blame] | 1086 |  | 
| Romain Guy | 746b740 | 2010-10-26 16:27:31 -0700 | [diff] [blame] | 1087 |     // Indicates whether the clip must be restored | 
 | 1088 |     bool mDirtyClip; | 
 | 1089 |  | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 1090 |     // The following fields are used to setup drawing | 
 | 1091 |     // Used to describe the shaders to generate | 
 | 1092 |     ProgramDescription mDescription; | 
 | 1093 |     // Color description | 
 | 1094 |     bool mColorSet; | 
 | 1095 |     float mColorA, mColorR, mColorG, mColorB; | 
 | 1096 |     // Indicates that the shader should get a color | 
 | 1097 |     bool mSetShaderColor; | 
 | 1098 |     // Current texture unit | 
 | 1099 |     GLuint mTextureUnit; | 
 | 1100 |     // Track dirty regions, true by default | 
 | 1101 |     bool mTrackDirtyRegions; | 
| Romain Guy | 2b7028e | 2012-09-19 17:25:38 -0700 | [diff] [blame] | 1102 |     // Indicate whether we are drawing an opaque frame | 
 | 1103 |     bool mOpaqueFrame; | 
| Romain Guy | 70ca14e | 2010-12-13 18:24:33 -0800 | [diff] [blame] | 1104 |  | 
| Romain Guy | 87e2f757 | 2012-09-24 11:37:12 -0700 | [diff] [blame] | 1105 |     // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in | 
 | 1106 |     // Properties.h | 
 | 1107 |     bool mScissorOptimizationDisabled; | 
 | 1108 |  | 
| Romain Guy | 54c1a64 | 2012-09-27 17:55:46 -0700 | [diff] [blame] | 1109 |     // No-ops start/endTiling when set | 
 | 1110 |     bool mSuppressTiling; | 
 | 1111 |  | 
| Romain Guy | 78dd96d | 2013-05-03 14:24:16 -0700 | [diff] [blame] | 1112 |     // If true, this renderer will setup drawing to emulate | 
 | 1113 |     // an increment stencil buffer in the color buffer | 
 | 1114 |     bool mCountOverdraw; | 
 | 1115 |     float mOverdraw; | 
 | 1116 |  | 
| Romain Guy | ef35927 | 2013-01-31 19:07:29 -0800 | [diff] [blame] | 1117 |     // Optional name of the renderer | 
 | 1118 |     String8 mName; | 
 | 1119 |  | 
| Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 1120 |     friend class DisplayListRenderer; | 
| Romain Guy | 96885eb | 2013-03-26 15:05:58 -0700 | [diff] [blame] | 1121 |     friend class Layer; | 
| Romain Guy | 257ae35 | 2013-03-20 16:31:12 -0700 | [diff] [blame] | 1122 |     friend class TextSetupFunctor; | 
| Romain Guy | 03c00b5 | 2013-06-20 18:30:28 -0700 | [diff] [blame] | 1123 |     friend class DrawBitmapOp; | 
 | 1124 |     friend class DrawPatchOp; | 
| Romain Guy | b051e89 | 2010-09-28 19:09:36 -0700 | [diff] [blame] | 1125 |  | 
| Romain Guy | bb9524b | 2010-06-22 18:56:38 -0700 | [diff] [blame] | 1126 | }; // class OpenGLRenderer | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 1127 |  | 
| Romain Guy | 9d5316e | 2010-06-24 19:30:36 -0700 | [diff] [blame] | 1128 | }; // namespace uirenderer | 
| Romain Guy | e4d0112 | 2010-06-16 18:44:05 -0700 | [diff] [blame] | 1129 | }; // namespace android | 
 | 1130 |  | 
| Romain Guy | 5b3b352 | 2010-10-27 18:57:51 -0700 | [diff] [blame] | 1131 | #endif // ANDROID_HWUI_OPENGL_RENDERER_H |