OpenGLRenderer.h revision e63f7c622a2086aefa80983c6f41b74fb166bb42
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2010 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_OPENGL_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_OPENGL_RENDERER_H
199d5316e3f56d138504565ff311145ac01621dff4Romain Guy
209d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <GLES2/gl2.h>
219d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <GLES2/gl2ext.h>
2285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
23ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h>
24f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h>
25ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkPaint.h>
26079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h>
27d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy#include <SkShader.h>
2885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h>
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
30daf98e941e140e8739458126640183b9f296a2abChet Haase#include <utils/Functor.h>
31bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <utils/RefBase.h>
32ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy#include <utils/SortedVector.h>
338694230ff25fa0a60e480d424843e56b718f0516Romain Guy#include <utils/Vector.h>
34bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
357953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
367953745dd565167113f8cbfc461bc0521d32d870Romain Guy
373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <androidfw/ResourceTypes.h>
383b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
39c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h"
4051769a68a5cb34e9564740c6a854fcb93018789dRomain Guy#include "Extensions.h"
41f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include "Matrix.h"
425cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Program.h"
43bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include "Rect.h"
445cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include "Snapshot.h"
45f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include "Vertex.h"
4606f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include "SkiaShader.h"
47db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy#include "SkiaColorFilter.h"
483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "UvMapper.h"
49fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "Caches.h"
50bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
51e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
529d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer {
53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct DrawModifiers {
559b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    DrawModifiers() {
569b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy        reset();
579b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    }
589b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy
599b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    void reset() {
609b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy        memset(this, 0, sizeof(DrawModifiers));
619b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    }
629b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy
63c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    SkiaShader* mShader;
64c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    SkiaColorFilter* mColorFilter;
6516ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    float mOverrideLayerAlpha;
66c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
67c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    // Drop shadow
68c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    bool mHasShadow;
69c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    float mShadowRadius;
70c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    float mShadowDx;
71c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    float mShadowDy;
72c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    int mShadowColor;
73c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
74c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    // Draw filters
75c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    bool mHasDrawFilter;
76c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    int mPaintFilterClearBits;
77c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    int mPaintFilterSetBits;
78c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik};
79c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikenum StateDeferFlags {
81ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    kStateDeferFlag_Draw = 0x1,
82ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    kStateDeferFlag_Clip = 0x2
83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik};
84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
85527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikenum DrawOpMode {
86527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    kDrawOpMode_Immediate,
87527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    kDrawOpMode_Defer,
88527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    kDrawOpMode_Flush
89527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik};
90527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
9128ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craikenum ClipSideFlags {
92a02c4ed885d97e516f844ddb0a96083f1b45b4cbChris Craik    kClipSide_None = 0x0,
9328ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik    kClipSide_Left = 0x1,
9428ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik    kClipSide_Top = 0x2,
9528ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik    kClipSide_Right = 0x4,
9628ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik    kClipSide_Bottom = 0x8,
97d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik    kClipSide_Full = 0xF,
98d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik    kClipSide_ConservativeFull = 0x1F
9928ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik};
10028ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik
101f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy///////////////////////////////////////////////////////////////////////////////
102f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Renderer
103f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy///////////////////////////////////////////////////////////////////////////////
104f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
105c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craikclass DeferredDisplayState;
1060fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guyclass DisplayList;
107257ae3502cfad43df681b1783528d645bdabc63fRomain Guyclass TextSetupFunctor;
10865cd612face362d054a85d0f7e5881c59cd523beChris Craikclass VertexBuffer;
109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1105cbbce535744b89df5ecea95de21ee3733298260Romain Guy/**
1115cbbce535744b89df5ecea95de21ee3733298260Romain Guy * OpenGL renderer used to draw accelerated 2D graphics. The API is a
1125cbbce535744b89df5ecea95de21ee3733298260Romain Guy * simplified version of Skia's Canvas API.
1135cbbce535744b89df5ecea95de21ee3733298260Romain Guy */
11485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guyclass OpenGLRenderer {
115e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guypublic:
1167953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API OpenGLRenderer();
117e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    virtual ~OpenGLRenderer();
118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
120ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     * Sets the name of this renderer. The name is optional and
121ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     * empty by default. If the pointer is null the name is set
122ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     * to the empty string.
123ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     */
124ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    ANDROID_API void setName(const char* name);
125ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy
126ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    /**
127ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     * Returns the name of this renderer as UTF8 string.
128ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     * The returned pointer is never null.
129ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy     */
130ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    ANDROID_API const char* getName() const;
131ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy
132ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    /**
13387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy     * Read externally defined properties to control the behavior
13487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy     * of the renderer.
13587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy     */
13687e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    ANDROID_API void initProperties();
13787e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy
13887e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    /**
13917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Indicates whether this renderer executes drawing commands immediately.
14017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * If this method returns true, the drawing commands will be executed
14117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * later.
14217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
14349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    virtual bool isDeferred();
14449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
14517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
14617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Sets the dimension of the underlying drawing surface. This method must
14717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * be called at least once every time the drawing surface changes size.
14817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *
14917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param width The width in pixels of the underlysing surface
15017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param height The height in pixels of the underlysing surface
15117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    virtual void setViewport(int width, int height);
153e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
15417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
15517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Prepares the renderer to draw a frame. This method must be invoked
15617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * at the beginning of each frame. When this method is invoked, the
15717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * entire drawing surface is assumed to be redrawn.
15817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *
15917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param opaque If true, the target surface is considered opaque
16017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *               and will not be cleared. If false, the target surface
16117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *               will be cleared
16217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
1637c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    ANDROID_API status_t prepare(bool opaque);
16417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
16517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
16617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Prepares the renderer to draw a frame. This method must be invoked
16717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * at the beginning of each frame. Only the specified rectangle of the
16817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * frame is assumed to be dirty. A clip will automatically be set to
16917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * the specified rectangle.
17017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *
17117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param left The left coordinate of the dirty rectangle
17217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param top The top coordinate of the dirty rectangle
17317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param right The right coordinate of the dirty rectangle
17417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param bottom The bottom coordinate of the dirty rectangle
17517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * @param opaque If true, the target surface is considered opaque
17617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *               and will not be cleared. If false, the target surface
17717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     *               will be cleared in the specified dirty rectangle
17817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
1797c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
180e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
18117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
18217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Indicates the end of a frame. This method must be invoked whenever
18317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * the caller is done rendering a frame.
18417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
18517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    virtual void finish();
1866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
187c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    /**
188c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     * This method must be invoked before handing control over to a draw functor.
189c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     * See callDrawGLFunction() for instance.
190c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     *
191c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     * This command must not be recorded inside display lists.
192c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     */
193c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    virtual void interrupt();
194c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
195c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    /**
196c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     * This method must be invoked after getting control back from a draw functor.
197c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     *
198c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     * This command must not be recorded inside display lists.
199c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy     */
200c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    virtual void resume();
201c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
20278dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    ANDROID_API void setCountOverdrawEnabled(bool enabled) {
20378dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy        mCountOverdraw = enabled;
20478dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    }
20578dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
20678dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    ANDROID_API float getOverdraw() {
20778dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy        return mCountOverdraw ? mOverdraw : 0.0f;
20878dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    }
20978dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
2108f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    ANDROID_API status_t invokeFunctors(Rect& dirty);
211ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    ANDROID_API void detachFunctor(Functor* functor);
212ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    ANDROID_API void attachFunctor(Functor* functor);
2138f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
21408ae317c21ec3086b5017672bba87420cc38a407Romain Guy
21511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    ANDROID_API void pushLayerUpdate(Layer* layer);
216e93482f5eac3df581d57e64c2a771a96aa868585Romain Guy    ANDROID_API void cancelLayerUpdate(Layer* layer);
21711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    ANDROID_API void clearLayerUpdates();
218405436021da156fbe3c5d4de48bdefa564cf7fc0Romain Guy    ANDROID_API void flushLayerUpdates();
21911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
2207953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API int getSaveCount() const;
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual int save(int flags);
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void restore();
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void restoreToCount(int saveCount);
224bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
225ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ANDROID_API int saveLayer(float left, float top, float right, float bottom,
226ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            SkPaint* paint, int flags) {
227ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode;
228ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        if (paint) mode = getXfermode(paint->getXfermode());
229ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        return saveLayer(left, top, right, bottom, paint ? paint->getAlpha() : 255, mode, flags);
230ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    }
231ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ANDROID_API int saveLayerAlpha(float left, float top, float right, float bottom,
232ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int alpha, int flags) {
233ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        return saveLayer(left, top, right, bottom, alpha, SkXfermode::kSrcOver_Mode, flags);
234ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    }
235e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
236ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int alpha, SkXfermode::Mode mode, int flags);
237bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy
238d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    int saveLayerDeferred(float left, float top, float right, float bottom,
239d90144db52c7297879b950cbbc85137ed123ab5bChris Craik            int alpha, SkXfermode::Mode mode, int flags);
240d90144db52c7297879b950cbbc85137ed123ab5bChris Craik
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void translate(float dx, float dy);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void rotate(float degrees);
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void scale(float sx, float sy);
244807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    virtual void skew(float sx, float sy);
245f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
246b98a016c6769b9e80d392df22fe77a2fca048d9fChris Craik    bool hasRectToRectTransform();
2477953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void getMatrix(SkMatrix* matrix);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void setMatrix(SkMatrix* matrix);
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void concatMatrix(SkMatrix* matrix);
250f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
2517953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API const Rect& getClipBounds();
25239a908c1df89e1073627b0dcbce922d826b67055Chris Craik
25339a908c1df89e1073627b0dcbce922d826b67055Chris Craik    /**
2545e49b307eb99269db2db257760508b8efd7bb97dChris Craik     * Performs a quick reject but adjust the bounds to account for stroke width if necessary,
2555e49b307eb99269db2db257760508b8efd7bb97dChris Craik     * and handling snapOut for AA geometry.
25639a908c1df89e1073627b0dcbce922d826b67055Chris Craik     */
25739a908c1df89e1073627b0dcbce922d826b67055Chris Craik    bool quickRejectPreStroke(float left, float top, float right, float bottom, SkPaint* paint);
25839a908c1df89e1073627b0dcbce922d826b67055Chris Craik
25939a908c1df89e1073627b0dcbce922d826b67055Chris Craik    /**
26039a908c1df89e1073627b0dcbce922d826b67055Chris Craik     * Returns false and sets scissor based upon bounds if drawing won't be clipped out
26139a908c1df89e1073627b0dcbce922d826b67055Chris Craik     */
2625e49b307eb99269db2db257760508b8efd7bb97dChris Craik    bool quickReject(float left, float top, float right, float bottom, bool snapOut = false);
26341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    bool quickReject(const Rect& bounds) {
26441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        return quickReject(bounds.left, bounds.top, bounds.right, bounds.bottom);
26541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    }
26639a908c1df89e1073627b0dcbce922d826b67055Chris Craik
26739a908c1df89e1073627b0dcbce922d826b67055Chris Craik    /**
26839a908c1df89e1073627b0dcbce922d826b67055Chris Craik     * Same as quickReject, without the scissor, instead returning clipRequired through pointer.
26939a908c1df89e1073627b0dcbce922d826b67055Chris Craik     * clipRequired will be only set if not rejected
27039a908c1df89e1073627b0dcbce922d826b67055Chris Craik     */
27139a908c1df89e1073627b0dcbce922d826b67055Chris Craik    ANDROID_API bool quickRejectNoScissor(float left, float top, float right, float bottom,
2725e49b307eb99269db2db257760508b8efd7bb97dChris Craik            bool snapOut = false, bool* clipRequired = NULL);
27339a908c1df89e1073627b0dcbce922d826b67055Chris Craik    bool quickRejectNoScissor(const Rect& bounds, bool* clipRequired = NULL) {
27439a908c1df89e1073627b0dcbce922d826b67055Chris Craik        return quickRejectNoScissor(bounds.left, bounds.top, bounds.right, bounds.bottom,
27539a908c1df89e1073627b0dcbce922d826b67055Chris Craik                clipRequired);
27639a908c1df89e1073627b0dcbce922d826b67055Chris Craik    }
27739a908c1df89e1073627b0dcbce922d826b67055Chris Craik
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
279735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    virtual bool clipPath(SkPath* path, SkRegion::Op op);
280735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    virtual bool clipRegion(SkRegion* region, SkRegion::Op op);
281a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    virtual Rect* getClipRect();
282bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
283ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t replayFlags);
284c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    virtual void outputDisplayList(DisplayList* displayList);
285a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    virtual status_t drawLayer(Layer* layer, float x, float y);
286486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
28755b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy    status_t drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount,
288996fe656340ede058a6f0e6b18f9ec525ddb4e27Chris Craik            TextureVertex* vertices, bool pureTranslate, const Rect& bounds, SkPaint* paint);
289486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
290486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
291e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
293486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
294486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
29603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy    status_t drawPatches(SkBitmap* bitmap, AssetAtlas::Entry* entry,
29703c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy            TextureVertex* vertices, uint32_t indexCount, SkPaint* paint);
2983b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    virtual status_t drawPatch(SkBitmap* bitmap, Res_png_9patch* patch,
2995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
3004c2547fa9244e78115cde0a259291053108c3dc7Romain Guy    status_t drawPatch(SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry,
30103c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy            float left, float top, float right, float bottom, SkPaint* paint);
302486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawColor(int color, SkXfermode::Mode mode);
303486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
304486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawRoundRect(float left, float top, float right, float bottom,
30501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
306486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
307486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
308486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawArc(float left, float top, float right, float bottom,
3098b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
310486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawPath(SkPath* path, SkPaint* paint);
311486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawLines(float* points, int count, SkPaint* paint);
312486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawPoints(float* points, int count, SkPaint* paint);
313486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
314325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            float hOffset, float vOffset, SkPaint* paint);
315486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawPosText(const char* text, int bytesCount, int count,
316325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            const float* positions, SkPaint* paint);
317c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
31841541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds,
319527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            DrawOpMode drawOpMode = kDrawOpMode_Immediate);
320672433d90fab7383cd28beac9d4485b566a90940Romain Guy    virtual status_t drawRects(const float* rects, int count, SkPaint* paint);
32185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void resetShader();
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void setupShader(SkiaShader* shader);
324d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void resetColorFilter();
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
327db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void resetShadow();
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
3301e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
3315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
3325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
3335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
33416ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer)
33516ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; }
33616ecda5317c40fc3da284952d9b3add34d6763aeChris Craik
337a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    SkPaint* filterPaint(SkPaint* paint);
3385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
3395e49b307eb99269db2db257760508b8efd7bb97dChris Craik    /**
3405e49b307eb99269db2db257760508b8efd7bb97dChris Craik     * Store the current display state (most importantly, the current clip and transform), and
3415e49b307eb99269db2db257760508b8efd7bb97dChris Craik     * additionally map the state's bounds from local to window coordinates.
3425e49b307eb99269db2db257760508b8efd7bb97dChris Craik     *
3435e49b307eb99269db2db257760508b8efd7bb97dChris Craik     * Returns true if quick-rejected
3445e49b307eb99269db2db257760508b8efd7bb97dChris Craik     */
345ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags);
346527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false);
34728ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik    void setupMergedMultiDraw(const Rect* clipRect);
348c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
349d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    const DrawModifiers& getDrawModifiers() { return mDrawModifiers; }
350d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; }
351d90144db52c7297879b950cbbc85137ed123ab5bChris Craik
352672433d90fab7383cd28beac9d4485b566a90940Romain Guy    ANDROID_API bool isCurrentTransformSimple() {
353672433d90fab7383cd28beac9d4485b566a90940Romain Guy        return mSnapshot->transform->isSimple();
354672433d90fab7383cd28beac9d4485b566a90940Romain Guy    }
355672433d90fab7383cd28beac9d4485b566a90940Romain Guy
3560f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    Caches& getCaches() {
3570f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy        return mCaches;
3580f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    }
3590f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy
360ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    // simple rect clip
361ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    bool isCurrentClipSimple() {
362ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        return mSnapshot->clipRegion->isEmpty();
363ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    }
364ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
3650e87f00f8cb79635aa70b9a2dfa02bf19dc7473dChris Craik    int getViewportWidth() { return getSnapshot()->viewport.getWidth(); }
3660e87f00f8cb79635aa70b9a2dfa02bf19dc7473dChris Craik    int getViewportHeight() { return getSnapshot()->viewport.getHeight(); }
3670e87f00f8cb79635aa70b9a2dfa02bf19dc7473dChris Craik
36817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
369a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik     * Scales the alpha on the current snapshot. This alpha value will be modulated
37017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * with other alpha values when drawing primitives.
37117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
372a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    void scaleAlpha(float alpha) {
373a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik        mSnapshot->alpha *= alpha;
37417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
37517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
37617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
3770f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy     * Inserts a named event marker in the stream of GL commands.
3780f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy     */
3790f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    void eventMark(const char* name) const;
3800f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy
3810f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    /**
38217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Inserts a named group marker in the stream of GL commands. This marker
38317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * can be used by tools to group commands into logical groups. A call to
38417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * this method must always be followed later on by a call to endMark().
38517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
38613631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void startMark(const char* name) const;
38717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
38817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
38917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Closes the last group marker opened by startMark().
39017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
39113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void endMark() const;
39213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
393d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    /**
394d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     * Gets the alpha and xfermode out of a paint object. If the paint is null
395d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     * alpha will be 255 and the xfermode will be SRC_OVER. This method does
39616ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * not multiply the paint's alpha by the current snapshot's alpha, and does
39716ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * not replace the alpha with the overrideLayerAlpha
398d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     *
399d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     * @param paint The paint to extract values from
400d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     * @param alpha Where to store the resulting alpha
401d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     * @param mode Where to store the resulting xfermode
402d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase     */
403d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    static inline void getAlphaAndModeDirect(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) {
404527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        *mode = getXfermodeDirect(paint);
405527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        *alpha = getAlphaDirect(paint);
406527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
407527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
408527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    static inline SkXfermode::Mode getXfermodeDirect(SkPaint* paint) {
409527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        if (!paint) return SkXfermode::kSrcOver_Mode;
410527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return getXfermode(paint->getXfermode());
411527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
412527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
413c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik    static inline int getAlphaDirect(const SkPaint* paint) {
414527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        if (!paint) return 255;
415527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return paint->getAlpha();
416d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    }
417d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase
418624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    /**
419624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy     * Return the best transform to use to rasterize text given a full
420624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy     * transform matrix.
421624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy     */
422624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    mat4 findBestFontTransform(const mat4& transform) const;
423624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy
424527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#if DEBUG_MERGE_BEHAVIOR
425527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) {
426527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        mCaches.setScissorEnabled(false);
427527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
428527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        // should only be called outside of other draw ops, so stencil can only be in test state
429527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        bool stencilWasEnabled = mCaches.stencil.isTestEnabled();
430527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        mCaches.stencil.disable();
431527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
432527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true);
433527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
434527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        if (stencilWasEnabled) mCaches.stencil.enableTest();
435527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
436527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#endif
437527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
438e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyprotected:
439e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
44035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy     * Computes the projection matrix, initialize the first snapshot
44135643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy     * and stores the dimensions of the render target.
44235643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy     */
44335643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    void initViewport(int width, int height);
44435643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy
44535643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    /**
44696885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     * Perform the setup specific to a frame. This method does not
44796885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     * issue any OpenGL commands.
44896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     */
44996885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    void setupFrameState(float left, float top, float right, float bottom, bool opaque);
45096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy
45196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    /**
45296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     * Indicates the start of rendering. This method will setup the
45396885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     * initial OpenGL state (viewport, clearing the buffer, etc.)
45496885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy     */
45596885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    status_t startFrame();
45696885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy
45796885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    /**
4587c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy     * Clears the underlying surface if needed.
4597c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy     */
4607c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t clear(float left, float top, float right, float bottom, bool opaque);
4617c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy
4627c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    /**
46335643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy     * Call this method after updating a layer during a drawing pass.
46435643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy     */
46535643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    void resumeAfterLayer();
46635643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy
46735643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    /**
4688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * This method is called whenever a stencil buffer is required. Subclasses
4698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * should override this method and call attachStencilBufferToLayer() on the
4708ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * appropriate layer(s).
4718ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     */
4728ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    virtual void ensureStencilBuffer();
4738ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
4748ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    /**
4758ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * Obtains a stencil render buffer (allocating it if necessary) and
4768ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * attaches it to the specified layer.
4778ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     */
4788ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    void attachStencilBufferToLayer(Layer* layer);
4798ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
4808ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    /**
481e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Compose the layer defined in the current snapshot with the layer
482e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * defined by the previous snapshot.
483e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
484e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * The current snapshot *must* be a layer (flag kFlagIsLayer set.)
485e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
486e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * @param curent The current snapshot containing the layer to compose
487e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * @param previous The previous snapshot to compose the current layer with
488e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
489e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    virtual void composeLayer(sp<Snapshot> current, sp<Snapshot> previous);
490694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy
491ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    /**
492f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     * Marks the specified region as dirty at the specified bounds.
493ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     */
494f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    void dirtyLayerUnchecked(Rect& bounds, Region* region);
495ada830f639591b99c3e40de22b07296c7932a33fRomain Guy
496ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    /**
497f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     * Returns the current snapshot.
498ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     */
499624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    sp<Snapshot> getSnapshot() const {
500f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        return mSnapshot;
501f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    }
502ada830f639591b99c3e40de22b07296c7932a33fRomain Guy
50342f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    /**
50442f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     * Returns the region of the current layer.
50542f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     */
506624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual Region* getRegion() const {
507f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        return mSnapshot->region;
508f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    }
509f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy
51042f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    /**
51142f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     * Indicates whether rendering is currently targeted at a layer.
51242f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     */
513624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual bool hasLayer() const {
514f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        return (mSnapshot->flags & Snapshot::kFlagFboTarget) && mSnapshot->region;
515f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    }
5161bd1bad0b4a75e633c5edbe802bf6fb4dd765161Romain Guy
51742f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    /**
51842f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     * Returns the name of the FBO this renderer is rendering into.
51942f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy     */
520624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual GLint getTargetFbo() const {
52142f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy        return 0;
52242f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    }
52342f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy
52477a811610f99e21da7f88dafef60d09f345d0506Romain Guy    /**
52577a811610f99e21da7f88dafef60d09f345d0506Romain Guy     * Renders the specified layer as a textured quad.
52677a811610f99e21da7f88dafef60d09f345d0506Romain Guy     *
52777a811610f99e21da7f88dafef60d09f345d0506Romain Guy     * @param layer The layer to render
52877a811610f99e21da7f88dafef60d09f345d0506Romain Guy     * @param rect The bounds of the layer
52977a811610f99e21da7f88dafef60d09f345d0506Romain Guy     */
53077a811610f99e21da7f88dafef60d09f345d0506Romain Guy    void drawTextureLayer(Layer* layer, const Rect& rect);
53177a811610f99e21da7f88dafef60d09f345d0506Romain Guy
532be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    /**
533be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * Gets the alpha and xfermode out of a paint object. If the paint is null
53416ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both
53516ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * snapshot alpha, and overrideLayerAlpha
536be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     *
537be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * @param paint The paint to extract values from
538be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * @param alpha Where to store the resulting alpha
539be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * @param mode Where to store the resulting xfermode
540be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     */
54116ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const;
54216ecda5317c40fc3da284952d9b3add34d6763aeChris Craik
54316ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    /**
54416ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha
54516ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     *
54616ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     * @param layer The layer from which the alpha is extracted
54716ecda5317c40fc3da284952d9b3add34d6763aeChris Craik     */
54816ecda5317c40fc3da284952d9b3add34d6763aeChris Craik    inline float getLayerAlpha(Layer* layer) const;
549be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
550be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    /**
551be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * Safely retrieves the mode from the specified xfermode. If the specified
552be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
553be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy     */
554be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
555be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        SkXfermode::Mode resultMode;
556be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        if (!SkXfermode::AsMode(mode, &resultMode)) {
557be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy            resultMode = SkXfermode::kSrcOver_Mode;
558be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        }
559be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        return resultMode;
560be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    }
561be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
56211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    /**
56311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     * Set to true to suppress error checks at the end of a frame.
56411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy     */
565624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    virtual bool suppressErrorChecks() const {
56611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy        return false;
56711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    }
56811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
56908ae317c21ec3086b5017672bba87420cc38a407Romain Guyprivate:
5705cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
571dcfc836b457a87881da409e1acf251515f121446Romain Guy     * Discards the content of the framebuffer if supported by the driver.
572dcfc836b457a87881da409e1acf251515f121446Romain Guy     * This method should be called at the beginning of a frame to optimize
573dcfc836b457a87881da409e1acf251515f121446Romain Guy     * rendering on some tiler architectures.
574dcfc836b457a87881da409e1acf251515f121446Romain Guy     */
575dcfc836b457a87881da409e1acf251515f121446Romain Guy    void discardFramebuffer(float left, float top, float right, float bottom);
576dcfc836b457a87881da409e1acf251515f121446Romain Guy
577dcfc836b457a87881da409e1acf251515f121446Romain Guy    /**
578ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy     * Ensures the state of the renderer is the same as the state of
579ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy     * the GL context.
580ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy     */
581ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    void syncState();
582ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy
583ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    /**
5842b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     * Tells the GPU what part of the screen is about to be redrawn.
585c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     * This method will use the clip rect that we started drawing the
586c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     * frame with.
5872b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     * This method needs to be invoked every time getTargetFbo() is
5882b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     * bound again.
5892b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     */
59057b5268708c3b974296c7d4e58a02a957979224aRomain Guy    void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
5912b7028eabac80cec170572bc0e945a1d4224e595Romain Guy
5922b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    /**
593c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     * Tells the GPU what part of the screen is about to be redrawn.
594c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     * This method needs to be invoked every time getTargetFbo() is
595c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     * bound again.
596c3fedafc5f50100219449125a000e3138f6fb987Romain Guy     */
597c3fedafc5f50100219449125a000e3138f6fb987Romain Guy    void startTiling(const Rect& clip, int windowHeight, bool opaque = false);
598c3fedafc5f50100219449125a000e3138f6fb987Romain Guy
599c3fedafc5f50100219449125a000e3138f6fb987Romain Guy    /**
6002b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     * Tells the GPU that we are done drawing the frame or that we
6012b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     * are switching to another render target.
6022b7028eabac80cec170572bc0e945a1d4224e595Romain Guy     */
6032b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    void endTiling();
6042b7028eabac80cec170572bc0e945a1d4224e595Romain Guy
6052b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    /**
6065cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Saves the current state of the renderer as a new snapshot.
6075cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * The new snapshot is saved in mSnapshot and the previous snapshot
6085cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * is linked from mSnapshot->previous.
6095cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
6108aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy     * @param flags The save flags; see SkCanvas for more information
6118aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy     *
6125cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @return The new save count. This value can be passed to #restoreToCount()
6135cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
6148aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    int saveSnapshot(int flags);
6155cbbce535744b89df5ecea95de21ee3733298260Romain Guy
6165cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
6175cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Restores the current snapshot; mSnapshot becomes mSnapshot->previous.
6185cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
6192542d199745cdf3ec910b8e3e4cff5851ed24e9bRomain Guy     * @return True if the clip was modified.
6205cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
621bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    bool restoreSnapshot();
622bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
6235cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
6245cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Sets the clipping rectangle using glScissor. The clip is defined by
6255cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * the current snapshot's clipRect member.
6265cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
627bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    void setScissorFromClip();
628bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
6295cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
6308ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * Sets the clipping region using the stencil buffer. The clip region
6318ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * is defined by the current snapshot's clipRegion member.
6328ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     */
6338ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    void setStencilFromClip();
6348ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
6358ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    /**
636408eb12631376cbdc96803e918decf6ea804d346Chris Craik     * Given the local bounds of the layer, calculates ...
637d90144db52c7297879b950cbbc85137ed123ab5bChris Craik     */
638d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer);
639d90144db52c7297879b950cbbc85137ed123ab5bChris Craik
640d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    /**
641408eb12631376cbdc96803e918decf6ea804d346Chris Craik     * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible
642408eb12631376cbdc96803e918decf6ea804d346Chris Craik     */
643408eb12631376cbdc96803e918decf6ea804d346Chris Craik    void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip,
644408eb12631376cbdc96803e918decf6ea804d346Chris Craik            bool fboLayer, int alpha);
645408eb12631376cbdc96803e918decf6ea804d346Chris Craik
646408eb12631376cbdc96803e918decf6ea804d346Chris Craik    /**
647d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * Creates a new layer stored in the specified snapshot.
648d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     *
649d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param snapshot The snapshot associated with the new layer
650d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param left The left coordinate of the layer
651d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param top The top coordinate of the layer
652d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param right The right coordinate of the layer
653d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param bottom The bottom coordinate of the layer
654d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param alpha The translucency of the layer
655d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param mode The blending mode of the layer
656d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param flags The layer save flags
657d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     *
658d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @return True if the layer was successfully created, false otherwise
659d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     */
660d48885a6c8cd27a8a62552c33b5282e9882e19f6Chet Haase    bool createLayer(float left, float top, float right, float bottom,
661e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik            int alpha, SkXfermode::Mode mode, int flags);
662d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy
663d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    /**
6645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Creates a new layer stored in the specified snapshot as an FBO.
6655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     *
6665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param layer The layer to store as an FBO
6675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param snapshot The snapshot associated with the new layer
6685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param bounds The bounds of the layer
6695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
670e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik    bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip);
6715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
6725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
6735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Compose the specified layer as a region.
6745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     *
6755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param layer The layer to compose
6765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param rect The layer's bounds
6775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
6785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    void composeLayerRegion(Layer* layer, const Rect& rect);
6795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
6805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
6815b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Compose the specified layer as a simple rectangle.
6825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     *
6835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param layer The layer to compose
6845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param rect The layer's bounds
6855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param swap If true, the source and destination are swapped
6865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
6875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false);
6885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
68954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
69054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * Clears all the regions corresponding to the current list of layers.
69154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * This method MUST be invoked before any drawing operation.
69254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     */
69354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    void clearLayerRegions();
69454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
69554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
696f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     * Mark the layer as dirty at the specified coordinates. The coordinates
697f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     * are transformed with the supplied matrix.
698f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     */
699f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    void dirtyLayer(const float left, const float top,
700f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            const float right, const float bottom, const mat4 transform);
701f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy
702f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    /**
703f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     * Mark the layer as dirty at the specified coordinates.
704f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy     */
705f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    void dirtyLayer(const float left, const float top,
706f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            const float right, const float bottom);
707f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy
708f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    /**
7095cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Draws a colored rectangle with the specified color. The specified coordinates
710735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * are transformed by the current snapshot's transform matrix unless specified
711735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * otherwise.
7125cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
7135cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param left The left coordinate of the rectangle
7145cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param top The top coordinate of the rectangle
7155cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param right The right coordinate of the rectangle
7165cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param bottom The bottom coordinate of the rectangle
7175cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param color The rectangle's ARGB color, defined as a packed 32 bits word
718026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * @param mode The Skia xfermode to use
7193d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy     * @param ignoreTransform True if the current transform should be ignored
7205cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
721026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy    void drawColorRect(float left, float top, float right, float bottom,
7221c740bce8a762f02b5283045a0e2de7c8fb41277Romain Guy            int color, SkXfermode::Mode mode, bool ignoreTransform = false);
7235cbbce535744b89df5ecea95de21ee3733298260Romain Guy
72454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
725735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * Draws a series of colored rectangles with the specified color. The specified
726735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * coordinates are transformed by the current snapshot's transform matrix unless
727735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * specified otherwise.
728735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     *
729735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * @param rects A list of rectangles, 4 floats (left, top, right, bottom)
730735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     *              per rectangle
731735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * @param color The rectangles' ARGB color, defined as a packed 32 bits word
732735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * @param mode The Skia xfermode to use
733735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     * @param ignoreTransform True if the current transform should be ignored
7348ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * @param dirty True if calling this method should dirty the current layer
7353bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy     * @param clip True if the rects should be clipped, false otherwise
736735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy     */
737735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    status_t drawColorRects(const float* rects, int count, int color,
7383bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy            SkXfermode::Mode mode, bool ignoreTransform = false,
7393bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy            bool dirty = true, bool clip = true);
740735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
741735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    /**
74254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * Draws the shape represented by the specified path texture.
74354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * This method invokes drawPathTexture() but takes into account
74454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * the extra left/top offset and the texture offset to correctly
74554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * position the final shape.
74654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     *
74754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param left The left coordinate of the shape to render
74854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param top The top coordinate of the shape to render
74954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param texture The texture reprsenting the shape
75054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param paint The paint to draw the shape with
75154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     */
752486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
75354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
75454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
75554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
75654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * different compositing rules.
75754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     *
75854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param texture The texture to draw with
75954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param left The x coordinate of the bitmap
76054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param top The y coordinate of the bitmap
76154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param paint The paint to render with
76254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     */
763a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint);
764a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy
76554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
76665cd612face362d054a85d0f7e5881c59cd523beChris Craik     * Renders a strip of polygons with the specified paint, used for tessellated geometry.
76765cd612face362d054a85d0f7e5881c59cd523beChris Craik     *
76865cd612face362d054a85d0f7e5881c59cd523beChris Craik     * @param vertexBuffer The VertexBuffer to be drawn
76965cd612face362d054a85d0f7e5881c59cd523beChris Craik     * @param paint The paint to render with
77065cd612face362d054a85d0f7e5881c59cd523beChris Craik     * @param useOffset Offset the vertexBuffer (used in drawing non-AA lines)
77165cd612face362d054a85d0f7e5881c59cd523beChris Craik     */
77265cd612face362d054a85d0f7e5881c59cd523beChris Craik    status_t drawVertexBuffer(const VertexBuffer& vertexBuffer, SkPaint* paint,
77365cd612face362d054a85d0f7e5881c59cd523beChris Craik            bool useOffset = false);
77465cd612face362d054a85d0f7e5881c59cd523beChris Craik
77565cd612face362d054a85d0f7e5881c59cd523beChris Craik    /**
776710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik     * Renders the convex hull defined by the specified path as a strip of polygons.
77754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     *
778710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik     * @param path The hull of the path to draw
779cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik     * @param paint The paint to render with
78054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     */
78165cd612face362d054a85d0f7e5881c59cd523beChris Craik    status_t drawConvexPath(const SkPath& path, SkPaint* paint);
782858aa93ddb6e69e0503382af63bb681b6728aef1Chet Haase
7835cbbce535744b89df5ecea95de21ee3733298260Romain Guy    /**
7845cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * Draws a textured rectangle with the specified texture. The specified coordinates
7855cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * are transformed by the current snapshot's transform matrix.
7865cbbce535744b89df5ecea95de21ee3733298260Romain Guy     *
7875cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param left The left coordinate of the rectangle
7885cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param top The top coordinate of the rectangle
7895cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param right The right coordinate of the rectangle
7905cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param bottom The bottom coordinate of the rectangle
7915cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param texture The texture name to map onto the rectangle
7925cbbce535744b89df5ecea95de21ee3733298260Romain Guy     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
793d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy     * @param mode The blending mode
794c1396e93b6a5286a5183c00c781b62e940a12c1fRomain Guy     * @param blend True if the texture contains an alpha channel
7955cbbce535744b89df5ecea95de21ee3733298260Romain Guy     */
796bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy    void drawTextureRect(float left, float top, float right, float bottom, GLuint texture,
797a979474f15b454c8e2963f239a3770e200bb227cRomain Guy            float alpha, SkXfermode::Mode mode, bool blend);
798c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
799026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy    /**
80082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * Draws a textured rectangle with the specified texture. The specified coordinates
80182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * are transformed by the current snapshot's transform matrix.
80282ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     *
80382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param left The left coordinate of the rectangle
80482ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param top The top coordinate of the rectangle
80582ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param right The right coordinate of the rectangle
80682ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param bottom The bottom coordinate of the rectangle
80782ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param texture The texture to use
80882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param paint The paint containing the alpha, blending mode, etc.
80982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     */
810a979474f15b454c8e2963f239a3770e200bb227cRomain Guy    void drawTextureRect(float left, float top, float right, float bottom,
8118164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            Texture* texture, SkPaint* paint);
81282ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy
81382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    /**
81403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy     * Draws a textured mesh with the specified texture. If the indices are omitted,
81503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy     * the mesh is drawn as a simple quad. The mesh pointers become offsets when a
81603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy     * VBO is bound.
81782ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     *
81882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param left The left coordinate of the rectangle
81982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param top The top coordinate of the rectangle
82082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param right The right coordinate of the rectangle
82182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param bottom The bottom coordinate of the rectangle
82282ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param texture The texture name to map onto the rectangle
82382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
82482ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param mode The blending mode
82582ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param blend True if the texture contains an alpha channel
82682ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param vertices The vertices that define the mesh
82782ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param texCoords The texture coordinates of each vertex
82882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * @param elementsCount The number of elements in the mesh, required by indices
829f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy     * @param swapSrcDst Whether or not the src and dst blending operations should be swapped
830f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy     * @param ignoreTransform True if the current transform should be ignored
83103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy     * @param vbo The VBO used to draw the mesh
8325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param ignoreScale True if the model view matrix should not be scaled
8335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * @param dirty True if calling this method should dirty the current layer
834f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy     */
835f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture,
836a979474f15b454c8e2963f239a3770e200bb227cRomain Guy            float alpha, SkXfermode::Mode mode, bool blend,
8376820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
8385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
8395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            bool ignoreScale = false, bool dirty = true);
840f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
8413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void drawIndexedTextureMesh(float left, float top, float right, float bottom, GLuint texture,
8423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            float alpha, SkXfermode::Mode mode, bool blend,
8433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
8443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
8453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            bool ignoreScale = false, bool dirty = true);
8463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
847886b275e529e44a59c54b933453d9bc902973178Romain Guy    void drawAlpha8TextureMesh(float left, float top, float right, float bottom,
848886b275e529e44a59c54b933453d9bc902973178Romain Guy            GLuint texture, bool hasColor, int color, int alpha, SkXfermode::Mode mode,
849886b275e529e44a59c54b933453d9bc902973178Romain Guy            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
850527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            bool ignoreTransform, bool ignoreScale = false, bool dirty = true);
851886b275e529e44a59c54b933453d9bc902973178Romain Guy
852f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    /**
853448455fe783b0a711340322dca272b8cc0ebe473Romain Guy     * Draws the specified list of vertices as quads using indexed GL_TRIANGLES.
854448455fe783b0a711340322dca272b8cc0ebe473Romain Guy     * If the number of vertices to draw exceeds the number of indices we have
855448455fe783b0a711340322dca272b8cc0ebe473Romain Guy     * pre-allocated, this method will generate several glDrawElements() calls.
856448455fe783b0a711340322dca272b8cc0ebe473Romain Guy     */
857448455fe783b0a711340322dca272b8cc0ebe473Romain Guy    void drawIndexedQuads(Vertex* mesh, GLsizei quadsCount);
858448455fe783b0a711340322dca272b8cc0ebe473Romain Guy
859448455fe783b0a711340322dca272b8cc0ebe473Romain Guy    /**
8600a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * Draws text underline and strike-through if needed.
8610a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     *
8620a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * @param text The text to decor
8630a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * @param bytesCount The number of bytes in the text
86441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik     * @param totalAdvance The total advance in pixels, defines underline/strikethrough length
8650a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * @param x The x coordinate where the text will be drawn
8660a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * @param y The y coordinate where the text will be drawn
8670a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     * @param paint The paint to draw the text with
8680a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy     */
869e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik    void drawTextDecorations(float totalAdvance, float x, float y, SkPaint* paint);
8701e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy
871416a847633680d94efb926837efdc18726d54918Raph Levien   /**
872416a847633680d94efb926837efdc18726d54918Raph Levien     * Draws shadow layer on text (with optional positions).
873416a847633680d94efb926837efdc18726d54918Raph Levien     *
874416a847633680d94efb926837efdc18726d54918Raph Levien     * @param paint The paint to draw the shadow with
875416a847633680d94efb926837efdc18726d54918Raph Levien     * @param text The text to draw
876416a847633680d94efb926837efdc18726d54918Raph Levien     * @param bytesCount The number of bytes in the text
877416a847633680d94efb926837efdc18726d54918Raph Levien     * @param count The number of glyphs in the text
878416a847633680d94efb926837efdc18726d54918Raph Levien     * @param positions The x, y positions of individual glyphs (or NULL)
879416a847633680d94efb926837efdc18726d54918Raph Levien     * @param fontRenderer The font renderer object
880416a847633680d94efb926837efdc18726d54918Raph Levien     * @param alpha The alpha value for drawing the shadow
881416a847633680d94efb926837efdc18726d54918Raph Levien     * @param mode The xfermode for drawing the shadow
882416a847633680d94efb926837efdc18726d54918Raph Levien     * @param x The x coordinate where the shadow will be drawn
883416a847633680d94efb926837efdc18726d54918Raph Levien     * @param y The y coordinate where the shadow will be drawn
884416a847633680d94efb926837efdc18726d54918Raph Levien     */
885416a847633680d94efb926837efdc18726d54918Raph Levien    void drawTextShadow(SkPaint* paint, const char* text, int bytesCount, int count,
886416a847633680d94efb926837efdc18726d54918Raph Levien            const float* positions, FontRenderer& fontRenderer, int alpha, SkXfermode::Mode mode,
887416a847633680d94efb926837efdc18726d54918Raph Levien            float x, float y);
888416a847633680d94efb926837efdc18726d54918Raph Levien
88954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    /**
89054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * Draws a path texture. Path textures are alpha8 bitmaps that need special
89154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * compositing to apply colors/filters/etc.
89254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     *
89354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param texture The texture to render
89454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param x The x coordinate where the texture will be drawn
89554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param y The y coordinate where the texture will be drawn
89654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     * @param paint The paint to draw the texture with
89754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy     */
898416a847633680d94efb926837efdc18726d54918Raph Levien     void drawPathTexture(const PathTexture* texture, float x, float y, SkPaint* paint);
89901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
9001e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy    /**
901ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy     * Resets the texture coordinates stored in mMeshVertices. Setting the values
902026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * back to default is achieved by calling:
903026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     *
9048ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy     * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
905026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     *
906026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * @param u1 The left coordinate of the texture
907026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * @param v1 The bottom coordinate of the texture
908026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * @param u2 The right coordinate of the texture
909026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     * @param v2 The top coordinate of the texture
910026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy     */
911026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy    void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
912026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy
9138ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy    /**
914768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy     * Returns true if the specified paint will draw invisible text.
915768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy     */
916768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy    bool canSkipText(const SkPaint* paint) const;
917768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy
918768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy    /**
919746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     * Binds the specified texture. The texture unit must have been selected
920746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     * prior to calling this method.
921a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy     */
922746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    inline void bindTexture(GLuint texture) {
9238aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy        mCaches.bindTexture(texture);
924746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    }
925746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
926746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    /**
927aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy     * Binds the specified EGLImage texture. The texture unit must have been selected
928aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy     * prior to calling this method.
929aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy     */
930aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    inline void bindExternalTexture(GLuint texture) {
9318aa195d7081b889f3a7b1f426cbd8556377aae5eRomain Guy        mCaches.bindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
932aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    }
933aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy
934aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    /**
93582ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * Enable or disable blending as necessary. This function sets the appropriate
93682ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     * blend function based on the specified xfermode.
93782ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy     */
938f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy    inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description,
939f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy            bool swapSrcDst = false);
940a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
941f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy    /**
942d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * Use the specified program with the current GL context. If the program is already
943d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * in use, it will not be bound again. If it is not in use, the current program is
944d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * marked unused and the specified program becomes used and becomes the new
945d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * current program.
9466926c72e25b8dec3dd4b84af0819fa1937ae7296Romain Guy     *
947d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * @param program The program to use
948d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     *
949d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy     * @return true If the specified program was already in use, false otherwise.
950260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy     */
951889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    inline bool useProgram(Program* program);
952260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy
953746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    /**
954746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     * Invoked before any drawing operation. This sets required state.
955746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     */
95654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    void setupDraw(bool clear = true);
95717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
95870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    /**
95970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy     * Various methods to setup OpenGL rendering.
96070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy     */
96170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawWithTexture(bool isAlpha8 = false);
962ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    void setupDrawWithTextureAndColor(bool isAlpha8 = false);
963aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    void setupDrawWithExternalTexture();
96415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    void setupDrawNoTexture();
965710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik    void setupDrawAA();
9668d0d4783a0206c5884bf0b958d181f450ba5207dRomain Guy    void setupDrawColor(int color, int alpha);
96770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawColor(float r, float g, float b, float a);
96886568198f2c83d4ce5c4cd692eda074ba9de9ed2Romain Guy    void setupDrawAlpha8Color(int color, int alpha);
9694121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void setupDrawTextGamma(const SkPaint* paint);
97070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawShader();
97170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawColorFilter();
97270ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawBlending(SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
97370ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy            bool swapSrcDst = false);
97470ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawBlending(bool blend = true, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
97570ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy            bool swapSrcDst = false);
97670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawProgram();
97770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawDirtyRegionsDisabled();
9788a5cc92a150bae38ec43732d941b38bb381fe153Chet Haase    void setupDrawModelViewIdentity(bool offset = false);
97970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawModelView(float left, float top, float right, float bottom,
98070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy            bool ignoreTransform = false, bool ignoreModelView = false);
98170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawModelViewTranslate(float left, float top, float right, float bottom,
98270ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy            bool ignoreTransform = false);
98370ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawColorUniforms();
98486568198f2c83d4ce5c4cd692eda074ba9de9ed2Romain Guy    void setupDrawPureColorUniforms();
9858d0d4783a0206c5884bf0b958d181f450ba5207dRomain Guy    void setupDrawShaderIdentityUniforms();
98670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawShaderUniforms(bool ignoreTransform = false);
98770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawColorFilterUniforms();
98870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawSimpleMesh();
98970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    void setupDrawTexture(GLuint texture);
990aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy    void setupDrawExternalTexture(GLuint texture);
9918f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy    void setupDrawTextureTransform();
9928f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy    void setupDrawTextureTransformUniforms(mat4& transform);
9934121063313ac0d6f69f6253cac821d0c1c122086Romain Guy    void setupDrawTextGammaUniforms();
9948d0d4783a0206c5884bf0b958d181f450ba5207dRomain Guy    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0);
995ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords, GLvoid* colors);
9963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords, GLuint vbo = 0);
997448455fe783b0a711340322dca272b8cc0ebe473Romain Guy    void setupDrawIndexedVertices(GLvoid* vertices);
998f09ef51889f75289b041f9e9f949b7b82ed5b686Romain Guy    void accountForClear(SkXfermode::Mode mode);
999746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
100011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    bool updateLayer(Layer* layer, bool inFrame);
100111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    void updateLayers();
100296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    void flushLayers();
100311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
1004e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#if DEBUG_LAYERS_AS_REGIONS
100517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    /**
100617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * Renders the specified region as a series of rectangles. This method
100717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     * is used for debugging only.
100817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy     */
1009e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik    void drawRegionRectsDebug(const Region& region);
1010e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#endif
10113a3133d876caf60ebff2176ad75c3dcf0259148dRomain Guy
10128ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    /**
10138ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * Renders the specified region as a series of rectangles. The region
10148ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * must be in screen-space coordinates.
10158ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     */
10168ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    void drawRegionRects(const SkRegion& region, int color, SkXfermode::Mode mode,
10178ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy            bool dirty = false);
10188ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
10198ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    /**
10208ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS
10218ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     * is turned on.
10228ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy     */
10238ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    void debugClip();
10248ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
10257c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy    void debugOverdraw(bool enable, bool clear);
10267c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy    void renderOverdraw();
102778dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    void countOverdraw();
10287c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy
1029746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    /**
1030746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     * Should be invoked every time the glScissor is modified.
1031746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy     */
1032746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    inline void dirtyClip() {
1033746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy        mDirtyClip = true;
1034746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    }
1035746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
10363b753829ae858d424fe109f714745379a6daf455Romain Guy    inline mat4& currentTransform() const {
10373b753829ae858d424fe109f714745379a6daf455Romain Guy        return *mSnapshot->transform;
10383b753829ae858d424fe109f714745379a6daf455Romain Guy    }
10393b753829ae858d424fe109f714745379a6daf455Romain Guy
10403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    inline const UvMapper& getMapper(const Texture* texture) {
10413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper;
10423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
10433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
10443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
10453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * Returns a texture object for the specified bitmap. The texture can
10463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * come from the texture cache or an atlas. If this method returns
10473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * NULL, the texture could not be found and/or allocated.
10483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
10493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    Texture* getTexture(SkBitmap* bitmap);
10503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1051bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    // Dimensions of the drawing surface
1052bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    int mWidth, mHeight;
1053bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
105485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy    // Matrix used for ortho projection in shaders
1055260e102162322958cf17dbd895cd6bd30dc87e32Romain Guy    mat4 mOrthoMatrix;
1056bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
1057c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    // Model-view matrix used to position/size objects
1058c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy    mat4 mModelView;
1059c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy
1060bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    // Number of saved states
1061bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    int mSaveCount;
1062f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    // Base state
1063ae5575b3421c8fbe590ab046d7d5f2b36ecfd821Romain Guy    sp<Snapshot> mFirstSnapshot;
1064bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    // Current state
1065bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    sp<Snapshot> mSnapshot;
10662b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    // State used to define the clipping region
10675f803623559aab395a29d575c37c4e39c23a4b4eChris Craik    Rect mTilingClip;
106896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    // Is the target render surface opaque
106996885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    bool mOpaque;
107096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    // Is a frame currently being rendered
107196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    bool mFrameStarted;
10729d5316e3f56d138504565ff311145ac01621dff4Romain Guy
1073026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy    // Used to draw textured quads
1074ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    TextureVertex mMeshVertices[4];
1075ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
10763b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    // Default UV mapper
10773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    const UvMapper mUvMapper;
10783b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1079c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    // shader, filters, and shadow
1080c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    DrawModifiers mDrawModifiers;
10815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint mFilteredPaint;
10825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
108382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    // Various caches
1084fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    Caches& mCaches;
10853bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy    Extensions& mExtensions;
10868694230ff25fa0a60e480d424843e56b718f0516Romain Guy
10878f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    // List of rectangles to clear after saveLayer() is invoked
108854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    Vector<Rect*> mLayers;
10898f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy    // List of functors to invoke after a frame is drawn
1090ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    SortedVector<Functor*> mFunctors;
109111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    // List of layers to update at the beginning of a frame
109211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    Vector<Layer*> mLayerUpdates;
109354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
1094746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Indicates whether the clip must be restored
1095746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    bool mDirtyClip;
1096746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
109770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // The following fields are used to setup drawing
109870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // Used to describe the shaders to generate
109970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    ProgramDescription mDescription;
110070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // Color description
110170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    bool mColorSet;
110270ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    float mColorA, mColorR, mColorG, mColorB;
110370ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // Indicates that the shader should get a color
110470ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    bool mSetShaderColor;
110570ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // Current texture unit
110670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    GLuint mTextureUnit;
110770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    // Track dirty regions, true by default
110870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy    bool mTrackDirtyRegions;
11092b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    // Indicate whether we are drawing an opaque frame
11102b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    bool mOpaqueFrame;
111170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy
111287e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
111387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    // Properties.h
111487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    bool mScissorOptimizationDisabled;
111587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy
111654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    // No-ops start/endTiling when set
111754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    bool mSuppressTiling;
111854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
111978dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    // If true, this renderer will setup drawing to emulate
112078dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    // an increment stencil buffer in the color buffer
112178dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    bool mCountOverdraw;
112278dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy    float mOverdraw;
112378dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy
1124ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    // Optional name of the renderer
1125ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    String8 mName;
1126ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy
1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayListRenderer;
112896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy    friend class Layer;
1129257ae3502cfad43df681b1783528d645bdabc63fRomain Guy    friend class TextSetupFunctor;
113003c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy    friend class DrawBitmapOp;
113103c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy    friend class DrawPatchOp;
1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1133bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // class OpenGLRenderer
1134e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11359d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer
1136e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; // namespace android
1137e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
11385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_OPENGL_RENDERER_H
1139