OpenGLRenderer.h revision 6b109c74982033d4a220cd10a0eab8b024b351c9
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 2003ae272459869b854e5db252fc81a64a516e111fChris Craik#include "CanvasState.h" 2103ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Debug.h" 2203ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Extensions.h" 2303ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Matrix.h" 2403ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Program.h" 2503ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Rect.h" 2603ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Snapshot.h" 2703ae272459869b854e5db252fc81a64a516e111fChris Craik#include "UvMapper.h" 2803ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Vertex.h" 2903ae272459869b854e5db252fc81a64a516e111fChris Craik#include "Caches.h" 3003ae272459869b854e5db252fc81a64a516e111fChris Craik#include "utils/PaintUtils.h" 3103ae272459869b854e5db252fc81a64a516e111fChris Craik 329d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <GLES2/gl2.h> 339d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <GLES2/gl2ext.h> 3485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 35ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h> 3676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger#include <SkCanvas.h> 3776d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger#include <SkColorFilter.h> 38f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h> 39ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkPaint.h> 40079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h> 4185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 42e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 43c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger#include <utils/Blur.h> 44daf98e941e140e8739458126640183b9f296a2abChet Haase#include <utils/Functor.h> 45bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <utils/RefBase.h> 46ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy#include <utils/SortedVector.h> 478694230ff25fa0a60e480d424843e56b718f0516Romain Guy#include <utils/Vector.h> 48bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 497953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 507953745dd565167113f8cbfc461bc0521d32d870Romain Guy 513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <androidfw/ResourceTypes.h> 523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 53d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkShader; 54d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III 55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 569d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer { 57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 5803ae272459869b854e5db252fc81a64a516e111fChris Craikenum class DrawOpMode { 5903ae272459869b854e5db252fc81a64a516e111fChris Craik kImmediate, 6003ae272459869b854e5db252fc81a64a516e111fChris Craik kDefer, 6103ae272459869b854e5db252fc81a64a516e111fChris Craik kFlush 6203ae272459869b854e5db252fc81a64a516e111fChris Craik}; 6303ae272459869b854e5db252fc81a64a516e111fChris Craik 64b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass DeferredDisplayState; 65117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikstruct Glop; 663b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState; 67e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode; 68b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass TextSetupFunctor; 69b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass VertexBuffer; 70b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 71c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstruct DrawModifiers { 7251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik DrawModifiers() 7351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik : mOverrideLayerAlpha(0.0f) {} 749b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy 759b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy void reset() { 7651d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mOverrideLayerAlpha = 0.0f; 779b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy } 789b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy 7916ecda5317c40fc3da284952d9b3add34d6763aeChris Craik float mOverrideLayerAlpha; 80c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}; 81c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 82ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikenum StateDeferFlags { 83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik kStateDeferFlag_Draw = 0x1, 84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik kStateDeferFlag_Clip = 0x2 85ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik}; 86ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 8728ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craikenum ClipSideFlags { 88a02c4ed885d97e516f844ddb0a96083f1b45b4cbChris Craik kClipSide_None = 0x0, 8928ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Left = 0x1, 9028ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Top = 0x2, 9128ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Right = 0x4, 9228ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Bottom = 0x8, 93d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik kClipSide_Full = 0xF, 94d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik kClipSide_ConservativeFull = 0x1F 9528ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik}; 9628ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik 97bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craikenum VertexBufferDisplayFlags { 98bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik kVertexBuffer_Offset = 0x1, 9991a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik kVertexBuffer_ShadowInterp = 0x2, 100bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik}; 101bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik 1024063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik/** 1034063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Defines additional transformation that should be applied by the model view matrix, beyond that of 1044063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * the currentTransform() 1054063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1064063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craikenum ModelViewMode { 1074063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 1084063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Used when the model view should simply translate geometry passed to the shader. The resulting 1094063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * matrix will be a simple translation. 1104063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1114063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik kModelViewMode_Translate = 0, 1124063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik 1134063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 1144063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Used when the model view should translate and scale geometry. The resulting matrix will be a 1154063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * translation + scale. This is frequently used together with VBO 0, the (0,0,1,1) rect. 1164063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1174063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik kModelViewMode_TranslateAndScale = 1, 1184063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik}; 1194063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik 120f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/////////////////////////////////////////////////////////////////////////////// 121f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Renderer 122f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/////////////////////////////////////////////////////////////////////////////// 1235cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 12414e513058ed4168c94e015638d16f5f87fd8063aChris Craik * OpenGL Renderer implementation. 1255cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 12603ae272459869b854e5db252fc81a64a516e111fChris Craikclass OpenGLRenderer : public CanvasStateClient { 127e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guypublic: 1283b20251a355c88193c439f928a84ae69483fb488John Reck OpenGLRenderer(RenderState& renderState); 129e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy virtual ~OpenGLRenderer(); 130e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 13103ae272459869b854e5db252fc81a64a516e111fChris Craik /** 13203ae272459869b854e5db252fc81a64a516e111fChris Craik * Sets the dimension of the underlying drawing surface. This method must 13303ae272459869b854e5db252fc81a64a516e111fChris Craik * be called at least once every time the drawing surface changes size. 13403ae272459869b854e5db252fc81a64a516e111fChris Craik * 13503ae272459869b854e5db252fc81a64a516e111fChris Craik * @param width The width in pixels of the underlysing surface 13603ae272459869b854e5db252fc81a64a516e111fChris Craik * @param height The height in pixels of the underlysing surface 13703ae272459869b854e5db252fc81a64a516e111fChris Craik */ 13803ae272459869b854e5db252fc81a64a516e111fChris Craik void setViewport(int width, int height) { mState.setViewport(width, height); } 13903ae272459869b854e5db252fc81a64a516e111fChris Craik 1403b20251a355c88193c439f928a84ae69483fb488John Reck void initProperties(); 141058fc640017c90120c599d378a4cbc55668b05b7Chris Craik void initLight(const Vector3& lightCenter, float lightRadius, 142058fc640017c90120c599d378a4cbc55668b05b7Chris Craik uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha); 14387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy 14403ae272459869b854e5db252fc81a64a516e111fChris Craik /* 14503ae272459869b854e5db252fc81a64a516e111fChris Craik * Prepares the renderer to draw a frame. This method must be invoked 14603ae272459869b854e5db252fc81a64a516e111fChris Craik * at the beginning of each frame. Only the specified rectangle of the 14703ae272459869b854e5db252fc81a64a516e111fChris Craik * frame is assumed to be dirty. A clip will automatically be set to 14803ae272459869b854e5db252fc81a64a516e111fChris Craik * the specified rectangle. 14903ae272459869b854e5db252fc81a64a516e111fChris Craik * 15003ae272459869b854e5db252fc81a64a516e111fChris Craik * @param opaque If true, the target surface is considered opaque 15103ae272459869b854e5db252fc81a64a516e111fChris Craik * and will not be cleared. If false, the target surface 15203ae272459869b854e5db252fc81a64a516e111fChris Craik * will be cleared 15303ae272459869b854e5db252fc81a64a516e111fChris Craik */ 154e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void prepareDirty(float left, float top, float right, float bottom, 15503ae272459869b854e5db252fc81a64a516e111fChris Craik bool opaque); 15603ae272459869b854e5db252fc81a64a516e111fChris Craik 15703ae272459869b854e5db252fc81a64a516e111fChris Craik /** 15803ae272459869b854e5db252fc81a64a516e111fChris Craik * Prepares the renderer to draw a frame. This method must be invoked 15903ae272459869b854e5db252fc81a64a516e111fChris Craik * at the beginning of each frame. When this method is invoked, the 16003ae272459869b854e5db252fc81a64a516e111fChris Craik * entire drawing surface is assumed to be redrawn. 16103ae272459869b854e5db252fc81a64a516e111fChris Craik * 16203ae272459869b854e5db252fc81a64a516e111fChris Craik * @param opaque If true, the target surface is considered opaque 16303ae272459869b854e5db252fc81a64a516e111fChris Craik * and will not be cleared. If false, the target surface 16403ae272459869b854e5db252fc81a64a516e111fChris Craik * will be cleared 16503ae272459869b854e5db252fc81a64a516e111fChris Craik */ 16603ae272459869b854e5db252fc81a64a516e111fChris Craik void prepare(bool opaque) { 167984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson prepareDirty(0.0f, 0.0f, mState.getWidth(), mState.getHeight(), opaque); 168984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson } 169c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy 17003ae272459869b854e5db252fc81a64a516e111fChris Craik /** 17103ae272459869b854e5db252fc81a64a516e111fChris Craik * Indicates the end of a frame. This method must be invoked whenever 17203ae272459869b854e5db252fc81a64a516e111fChris Craik * the caller is done rendering a frame. 17303ae272459869b854e5db252fc81a64a516e111fChris Craik * Returns true if any drawing was done during the frame (the output 17403ae272459869b854e5db252fc81a64a516e111fChris Craik * has changed / is "dirty" and should be displayed to the user). 17503ae272459869b854e5db252fc81a64a516e111fChris Craik */ 17603ae272459869b854e5db252fc81a64a516e111fChris Craik virtual bool finish(); 17703ae272459869b854e5db252fc81a64a516e111fChris Craik 17803ae272459869b854e5db252fc81a64a516e111fChris Craik void callDrawGLFunction(Functor* functor, Rect& dirty); 17908ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1803b20251a355c88193c439f928a84ae69483fb488John Reck void pushLayerUpdate(Layer* layer); 1813b20251a355c88193c439f928a84ae69483fb488John Reck void cancelLayerUpdate(Layer* layer); 1823b20251a355c88193c439f928a84ae69483fb488John Reck void flushLayerUpdates(); 183443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck void markLayersAsBuildLayers(); 18411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 1853b20251a355c88193c439f928a84ae69483fb488John Reck virtual int saveLayer(float left, float top, float right, float bottom, 18603ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint, int flags) { 187e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return saveLayer(left, top, right, bottom, paint, flags, nullptr); 1883f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik } 1893f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik 1903f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik // Specialized saveLayer implementation, which will pass the convexMask to an FBO layer, if 1913f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik // created, which will in turn clip to that mask when drawn back/restored. 1923f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik int saveLayer(float left, float top, float right, float bottom, 1933f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const SkPaint* paint, int flags, const SkPath* convexMask); 194bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 195d90144db52c7297879b950cbbc85137ed123ab5bChris Craik int saveLayerDeferred(float left, float top, float right, float bottom, 196d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger const SkPaint* paint, int flags); 197d90144db52c7297879b950cbbc85137ed123ab5bChris Craik 19803ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRenderNode(RenderNode* displayList, Rect& dirty, int32_t replayFlags = 1); 19903ae272459869b854e5db252fc81a64a516e111fChris Craik void drawLayer(Layer* layer, float x, float y); 20003ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 201107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawBitmaps(const SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount, 202d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik TextureVertex* vertices, bool pureTranslate, const Rect& bounds, const SkPaint* paint); 20303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmap(const SkBitmap* bitmap, Rect src, Rect dst, 20403ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 20503ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, 20603ae272459869b854e5db252fc81a64a516e111fChris Craik const float* vertices, const int* colors, const SkPaint* paint); 207107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* entry, 208d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik TextureVertex* vertices, uint32_t indexCount, const SkPaint* paint); 20903ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch, 21003ae272459869b854e5db252fc81a64a516e111fChris Craik float left, float top, float right, float bottom, const SkPaint* paint); 211107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawPatch(const SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry, 212d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float left, float top, float right, float bottom, const SkPaint* paint); 21303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawColor(int color, SkXfermode::Mode mode); 21403ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRect(float left, float top, float right, float bottom, 21503ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 21603ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRoundRect(float left, float top, float right, float bottom, 21703ae272459869b854e5db252fc81a64a516e111fChris Craik float rx, float ry, const SkPaint* paint); 21803ae272459869b854e5db252fc81a64a516e111fChris Craik void drawCircle(float x, float y, float radius, const SkPaint* paint); 21903ae272459869b854e5db252fc81a64a516e111fChris Craik void drawOval(float left, float top, float right, float bottom, 22003ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 22103ae272459869b854e5db252fc81a64a516e111fChris Craik void drawArc(float left, float top, float right, float bottom, 22203ae272459869b854e5db252fc81a64a516e111fChris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint); 22303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPath(const SkPath* path, const SkPaint* paint); 22403ae272459869b854e5db252fc81a64a516e111fChris Craik void drawLines(const float* points, int count, const SkPaint* paint); 22503ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPoints(const float* points, int count, const SkPaint* paint); 22603ae272459869b854e5db252fc81a64a516e111fChris Craik void drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, 22703ae272459869b854e5db252fc81a64a516e111fChris Craik float hOffset, float vOffset, const SkPaint* paint); 22803ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPosText(const char* text, int bytesCount, int count, 22903ae272459869b854e5db252fc81a64a516e111fChris Craik const float* positions, const SkPaint* paint); 23003ae272459869b854e5db252fc81a64a516e111fChris Craik void drawText(const char* text, int bytesCount, int count, float x, float y, 231d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, 23203ae272459869b854e5db252fc81a64a516e111fChris Craik DrawOpMode drawOpMode = DrawOpMode::kImmediate); 23303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRects(const float* rects, int count, const SkPaint* paint); 23485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 235107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawShadow(float casterAlpha, 236e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const VertexBuffer* ambientShadowVertexBuffer, 237e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const VertexBuffer* spotShadowVertexBuffer); 238f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 23903ae272459869b854e5db252fc81a64a516e111fChris Craik void setDrawFilter(SkDrawFilter* filter); 2405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 24116ecda5317c40fc3da284952d9b3add34d6763aeChris Craik // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer) 24216ecda5317c40fc3da284952d9b3add34d6763aeChris Craik void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; } 24316ecda5317c40fc3da284952d9b3add34d6763aeChris Craik 2445e49b307eb99269db2db257760508b8efd7bb97dChris Craik /** 2455e49b307eb99269db2db257760508b8efd7bb97dChris Craik * Store the current display state (most importantly, the current clip and transform), and 2465e49b307eb99269db2db257760508b8efd7bb97dChris Craik * additionally map the state's bounds from local to window coordinates. 2475e49b307eb99269db2db257760508b8efd7bb97dChris Craik * 2485e49b307eb99269db2db257760508b8efd7bb97dChris Craik * Returns true if quick-rejected 2495e49b307eb99269db2db257760508b8efd7bb97dChris Craik */ 250ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags); 251527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false); 25228ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik void setupMergedMultiDraw(const Rect* clipRect); 253c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 254d90144db52c7297879b950cbbc85137ed123ab5bChris Craik const DrawModifiers& getDrawModifiers() { return mDrawModifiers; } 255d90144db52c7297879b950cbbc85137ed123ab5bChris Craik void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; } 256d90144db52c7297879b950cbbc85137ed123ab5bChris Craik 2573b20251a355c88193c439f928a84ae69483fb488John Reck bool isCurrentTransformSimple() { 258d6b65f67717025b1162f86f04e2caa5723566cacChris Craik return currentTransform()->isSimple(); 259672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 260672433d90fab7383cd28beac9d4485b566a90940Romain Guy 2610f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy Caches& getCaches() { 2620f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy return mCaches; 2630f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 2640f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 26565fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik RenderState& renderState() { 26665fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik return mRenderState; 26765fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik } 26865fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik 269984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson int getViewportWidth() { return mState.getViewportWidth(); } 270984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson int getViewportHeight() { return mState.getViewportHeight(); } 2710e87f00f8cb79635aa70b9a2dfa02bf19dc7473dChris Craik 27217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 273a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik * Scales the alpha on the current snapshot. This alpha value will be modulated 27417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * with other alpha values when drawing primitives. 27517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 276984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void scaleAlpha(float alpha) { mState.scaleAlpha(alpha); } 27717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy 27817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 2790f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy * Inserts a named event marker in the stream of GL commands. 2800f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy */ 2810f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy void eventMark(const char* name) const; 2820f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 2830f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy /** 28462d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik * Inserts a formatted event marker in the stream of GL commands. 28562d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik */ 28662d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik void eventMarkDEBUG(const char *fmt, ...) const; 28762d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik 28862d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik /** 28917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Inserts a named group marker in the stream of GL commands. This marker 29017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * can be used by tools to group commands into logical groups. A call to 29117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * this method must always be followed later on by a call to endMark(). 29217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 29313631f3da855f200a151e7837ed9f6b079622b58Romain Guy void startMark(const char* name) const; 29417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy 29517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 29617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Closes the last group marker opened by startMark(). 29717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 29813631f3da855f200a151e7837ed9f6b079622b58Romain Guy void endMark() const; 29913631f3da855f200a151e7837ed9f6b079622b58Romain Guy 300d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase /** 301d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * Gets the alpha and xfermode out of a paint object. If the paint is null 302d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * alpha will be 255 and the xfermode will be SRC_OVER. This method does 30316ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * not multiply the paint's alpha by the current snapshot's alpha, and does 30416ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * not replace the alpha with the overrideLayerAlpha 305d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * 306d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param paint The paint to extract values from 307d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param alpha Where to store the resulting alpha 308d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param mode Where to store the resulting xfermode 309d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase */ 310e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik static inline void getAlphaAndModeDirect(const SkPaint* paint, int* alpha, 311e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik SkXfermode::Mode* mode) { 312527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *mode = getXfermodeDirect(paint); 313527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *alpha = getAlphaDirect(paint); 314527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 315527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 316d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik static inline SkXfermode::Mode getXfermodeDirect(const SkPaint* paint) { 317527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (!paint) return SkXfermode::kSrcOver_Mode; 3188dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return PaintUtils::getXfermode(paint->getXfermode()); 319527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 320527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 321c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik static inline int getAlphaDirect(const SkPaint* paint) { 322527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (!paint) return 255; 323527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik return paint->getAlpha(); 324d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 325d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 326c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger struct TextShadow { 327c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkScalar radius; 328c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger float dx; 329c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger float dy; 330c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkColor color; 331c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger }; 332c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 333c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger static inline bool getTextShadow(const SkPaint* paint, TextShadow* textShadow) { 334c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkDrawLooper::BlurShadowRec blur; 335c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger if (paint && paint->getLooper() && paint->getLooper()->asABlurShadow(&blur)) { 336c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger if (textShadow) { 337c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->radius = Blur::convertSigmaToRadius(blur.fSigma); 338c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->dx = blur.fOffset.fX; 339c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->dy = blur.fOffset.fY; 340c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->color = blur.fColor; 341c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 342c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger return true; 343c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 344c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger return false; 345c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 346c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 347c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger static inline bool hasTextShadow(const SkPaint* paint) { 348e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return getTextShadow(paint, nullptr); 349c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 350c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 351624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy /** 35259744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * Build the best transform to use to rasterize text given a full 35359744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * transform matrix, and whether filteration is needed. 35459744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * 35559744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * Returns whether filtration is needed 356624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy */ 35759744b79ec302000802cd56d30a1bf70f0183c80Chris Craik bool findBestFontTransform(const mat4& transform, SkMatrix* outMatrix) const; 358624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy 359527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#if DEBUG_MERGE_BEHAVIOR 360527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) { 361527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik mCaches.setScissorEnabled(false); 362527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 363527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // should only be called outside of other draw ops, so stencil can only be in test state 364527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik bool stencilWasEnabled = mCaches.stencil.isTestEnabled(); 365527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik mCaches.stencil.disable(); 366527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 367527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true); 368527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 369527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (stencilWasEnabled) mCaches.stencil.enableTest(); 370107843de4507b3511006cb9c77b8d0364374385aTom Hudson mDirty = true; 371527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 372527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#endif 373527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 374984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Vector3& getLightCenter() const { return mState.currentLightCenter(); } 37505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik float getLightRadius() const { return mLightRadius; } 37669e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik uint8_t getAmbientShadowAlpha() const { return mAmbientShadowAlpha; } 37769e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik uint8_t getSpotShadowAlpha() const { return mSpotShadowAlpha; } 37805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 379984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /////////////////////////////////////////////////////////////////// 380984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /// State manipulation 381984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 38203ae272459869b854e5db252fc81a64a516e111fChris Craik int getSaveCount() const; 38303ae272459869b854e5db252fc81a64a516e111fChris Craik int save(int flags); 38403ae272459869b854e5db252fc81a64a516e111fChris Craik void restore(); 38503ae272459869b854e5db252fc81a64a516e111fChris Craik void restoreToCount(int saveCount); 386984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 38703ae272459869b854e5db252fc81a64a516e111fChris Craik void getMatrix(SkMatrix* outMatrix) const { mState.getMatrix(outMatrix); } 38803ae272459869b854e5db252fc81a64a516e111fChris Craik void setMatrix(const SkMatrix& matrix) { mState.setMatrix(matrix); } 38903ae272459869b854e5db252fc81a64a516e111fChris Craik void concatMatrix(const SkMatrix& matrix) { mState.concatMatrix(matrix); } 390984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 39103ae272459869b854e5db252fc81a64a516e111fChris Craik void translate(float dx, float dy, float dz = 0.0f); 39203ae272459869b854e5db252fc81a64a516e111fChris Craik void rotate(float degrees); 39303ae272459869b854e5db252fc81a64a516e111fChris Craik void scale(float sx, float sy); 39403ae272459869b854e5db252fc81a64a516e111fChris Craik void skew(float sx, float sy); 395984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 396984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setMatrix(const Matrix4& matrix); // internal only convenience method 397984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void concatMatrix(const Matrix4& matrix); // internal only convenience method 398984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 39903ae272459869b854e5db252fc81a64a516e111fChris Craik const Rect& getLocalClipBounds() const { return mState.getLocalClipBounds(); } 400984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Rect& getRenderTargetClipBounds() const { return mState.getRenderTargetClipBounds(); } 40103ae272459869b854e5db252fc81a64a516e111fChris Craik bool quickRejectConservative(float left, float top, 40203ae272459869b854e5db252fc81a64a516e111fChris Craik float right, float bottom) const { 403984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.quickRejectConservative(left, top, right, bottom); 404984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson } 405984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 40603ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipRect(float left, float top, 40703ae272459869b854e5db252fc81a64a516e111fChris Craik float right, float bottom, SkRegion::Op op); 40803ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipPath(const SkPath* path, SkRegion::Op op); 40903ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipRegion(const SkRegion* region, SkRegion::Op op); 410984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 411984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /** 412984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * Does not support different clipping Ops (that is, every call to setClippingOutline is 413984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * effectively using SkRegion::kReplaceOp) 414984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * 415984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * The clipping outline is independent from the regular clip. 416984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson */ 417984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setClippingOutline(LinearAllocator& allocator, const Outline* outline); 418984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setClippingRoundRect(LinearAllocator& allocator, 419984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Rect& rect, float radius, bool highPriority = true); 420984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 421984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline bool hasRectToRectTransform() const { return mState.hasRectToRectTransform(); } 422984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline const mat4* currentTransform() const { return mState.currentTransform(); } 423984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 424984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /////////////////////////////////////////////////////////////////// 425984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /// CanvasStateClient interface 426984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 427e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onViewportInitialized() override; 428e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override; 4296b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik virtual GLuint getTargetFbo() const override { return 0; } 430984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 4314ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik SkPath* allocPathForFrame() { 43251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<SkPath> path(new SkPath()); 43351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik SkPath* returnPath = path.get(); 43451d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mTempPaths.push_back(std::move(path)); 43551d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik return returnPath; 4364ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik } 4374ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik 438e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyprotected: 439e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy /** 44096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * Perform the setup specific to a frame. This method does not 44196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * issue any OpenGL commands. 44296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy */ 44396885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy void setupFrameState(float left, float top, float right, float bottom, bool opaque); 44496885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy 44596885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy /** 44696885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * Indicates the start of rendering. This method will setup the 44796885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * initial OpenGL state (viewport, clearing the buffer, etc.) 44896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy */ 449107843de4507b3511006cb9c77b8d0364374385aTom Hudson void startFrame(); 45096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy 45196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy /** 4527c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy * Clears the underlying surface if needed. 4537c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy */ 454107843de4507b3511006cb9c77b8d0364374385aTom Hudson virtual void clear(float left, float top, float right, float bottom, bool opaque); 4557c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy 4567c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy /** 45735643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy * Call this method after updating a layer during a drawing pass. 45835643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy */ 45935643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy void resumeAfterLayer(); 46035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy 46135643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy /** 4628ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * This method is called whenever a stencil buffer is required. Subclasses 4638ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * should override this method and call attachStencilBufferToLayer() on the 4648ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * appropriate layer(s). 4658ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 4668ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy virtual void ensureStencilBuffer(); 4678ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 4688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 4698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Obtains a stencil render buffer (allocating it if necessary) and 4708ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * attaches it to the specified layer. 4718ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 4728ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void attachStencilBufferToLayer(Layer* layer); 4738ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 474487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk /** 475487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Draw a rectangle list. Currently only used for the the stencil buffer so that the stencil 476487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * will have a value of 'n' in every unclipped pixel, where 'n' is the number of rectangles 477487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * in the list. 478487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk */ 479487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk void drawRectangleList(const RectangleList& rectangleList); 480487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 481f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik bool quickRejectSetupScissor(float left, float top, float right, float bottom, 482e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const SkPaint* paint = nullptr); 483e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik bool quickRejectSetupScissor(const Rect& bounds, const SkPaint* paint = nullptr) { 484f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik return quickRejectSetupScissor(bounds.left, bounds.top, 485f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik bounds.right, bounds.bottom, paint); 486f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik } 487f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik 4888ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 489e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * Compose the layer defined in the current snapshot with the layer 490e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * defined by the previous snapshot. 491e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 492e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * The current snapshot *must* be a layer (flag kFlagIsLayer set.) 493e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 494e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * @param curent The current snapshot containing the layer to compose 495e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * @param previous The previous snapshot to compose the current layer with 496e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy */ 49714e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void composeLayer(const Snapshot& current, const Snapshot& previous); 498694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy 499ada830f639591b99c3e40de22b07296c7932a33fRomain Guy /** 500f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Marks the specified region as dirty at the specified bounds. 501ada830f639591b99c3e40de22b07296c7932a33fRomain Guy */ 502f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayerUnchecked(Rect& bounds, Region* region); 503ada830f639591b99c3e40de22b07296c7932a33fRomain Guy 50442f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy /** 50542f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy * Returns the region of the current layer. 50642f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy */ 507624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual Region* getRegion() const { 508984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.currentRegion(); 509f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy } 510f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 51142f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy /** 51242f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy * Indicates whether rendering is currently targeted at a layer. 51342f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy */ 514624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual bool hasLayer() const { 515984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return (mState.currentFlags() & Snapshot::kFlagFboTarget) && mState.currentRegion(); 516f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy } 5171bd1bad0b4a75e633c5edbe802bf6fb4dd765161Romain Guy 51877a811610f99e21da7f88dafef60d09f345d0506Romain Guy /** 51977a811610f99e21da7f88dafef60d09f345d0506Romain Guy * Renders the specified layer as a textured quad. 52077a811610f99e21da7f88dafef60d09f345d0506Romain Guy * 52177a811610f99e21da7f88dafef60d09f345d0506Romain Guy * @param layer The layer to render 52277a811610f99e21da7f88dafef60d09f345d0506Romain Guy * @param rect The bounds of the layer 52377a811610f99e21da7f88dafef60d09f345d0506Romain Guy */ 52477a811610f99e21da7f88dafef60d09f345d0506Romain Guy void drawTextureLayer(Layer* layer, const Rect& rect); 52577a811610f99e21da7f88dafef60d09f345d0506Romain Guy 526be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy /** 527be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * Gets the alpha and xfermode out of a paint object. If the paint is null 52816ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both 52916ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * snapshot alpha, and overrideLayerAlpha 530be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * 531be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param paint The paint to extract values from 532be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param alpha Where to store the resulting alpha 533be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param mode Where to store the resulting xfermode 534be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy */ 535d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline void getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const; 53616ecda5317c40fc3da284952d9b3add34d6763aeChris Craik 53716ecda5317c40fc3da284952d9b3add34d6763aeChris Craik /** 53816ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha 53916ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * 54016ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * @param layer The layer from which the alpha is extracted 54116ecda5317c40fc3da284952d9b3add34d6763aeChris Craik */ 54276d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger inline float getLayerAlpha(const Layer* layer) const; 543be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 544be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy /** 54576d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * Safely retrieves the ColorFilter from the given Paint. If the paint is 54676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * null then null is returned. 547be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy */ 54876d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger static inline SkColorFilter* getColorFilter(const SkPaint* paint) { 549e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return paint ? paint->getColorFilter() : nullptr; 550be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy } 551be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 55211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy /** 553d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * Safely retrieves the Shader from the given Paint. If the paint is 554d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * null then null is returned. 555d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III */ 556d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III static inline const SkShader* getShader(const SkPaint* paint) { 557e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return paint ? paint->getShader() : nullptr; 558d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III } 559d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III 560d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III /** 56111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy * Set to true to suppress error checks at the end of a frame. 56211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy */ 563624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual bool suppressErrorChecks() const { 56411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy return false; 56511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy } 56611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 567984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson CanvasState mState; 56865fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik Caches& mCaches; 56965fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik RenderState& mRenderState; 570984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 57108ae317c21ec3086b5017672bba87420cc38a407Romain Guyprivate: 5726b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik void renderGlop(const Glop& glop, bool clearLayer = true); 573117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik 5745cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 575dcfc836b457a87881da409e1acf251515f121446Romain Guy * Discards the content of the framebuffer if supported by the driver. 576dcfc836b457a87881da409e1acf251515f121446Romain Guy * This method should be called at the beginning of a frame to optimize 577dcfc836b457a87881da409e1acf251515f121446Romain Guy * rendering on some tiler architectures. 578dcfc836b457a87881da409e1acf251515f121446Romain Guy */ 579dcfc836b457a87881da409e1acf251515f121446Romain Guy void discardFramebuffer(float left, float top, float right, float bottom); 580dcfc836b457a87881da409e1acf251515f121446Romain Guy 581dcfc836b457a87881da409e1acf251515f121446Romain Guy /** 5822b7028eabac80cec170572bc0e945a1d4224e595Romain Guy * Tells the GPU what part of the screen is about to be redrawn. 583d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * This method will use the current layer space clip rect. 5842b7028eabac80cec170572bc0e945a1d4224e595Romain Guy * This method needs to be invoked every time getTargetFbo() is 5852b7028eabac80cec170572bc0e945a1d4224e595Romain Guy * bound again. 5862b7028eabac80cec170572bc0e945a1d4224e595Romain Guy */ 58733f5a59ac3e304970920dda824958870f85f76efhenry.uh_chen void startTilingCurrentClip(bool opaque = false, bool expand = false); 5882b7028eabac80cec170572bc0e945a1d4224e595Romain Guy 5892b7028eabac80cec170572bc0e945a1d4224e595Romain Guy /** 590c3fedafc5f50100219449125a000e3138f6fb987Romain Guy * Tells the GPU what part of the screen is about to be redrawn. 591c3fedafc5f50100219449125a000e3138f6fb987Romain Guy * This method needs to be invoked every time getTargetFbo() is 592c3fedafc5f50100219449125a000e3138f6fb987Romain Guy * bound again. 593c3fedafc5f50100219449125a000e3138f6fb987Romain Guy */ 59433f5a59ac3e304970920dda824958870f85f76efhenry.uh_chen void startTiling(const Rect& clip, int windowHeight, bool opaque = false, bool expand = false); 595c3fedafc5f50100219449125a000e3138f6fb987Romain Guy 596c3fedafc5f50100219449125a000e3138f6fb987Romain Guy /** 5972b7028eabac80cec170572bc0e945a1d4224e595Romain Guy * Tells the GPU that we are done drawing the frame or that we 5982b7028eabac80cec170572bc0e945a1d4224e595Romain Guy * are switching to another render target. 5992b7028eabac80cec170572bc0e945a1d4224e595Romain Guy */ 6002b7028eabac80cec170572bc0e945a1d4224e595Romain Guy void endTiling(); 6012b7028eabac80cec170572bc0e945a1d4224e595Romain Guy 6025cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 6035cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Sets the clipping rectangle using glScissor. The clip is defined by 6045cbbce535744b89df5ecea95de21ee3733298260Romain Guy * the current snapshot's clipRect member. 6055cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 606bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy void setScissorFromClip(); 607bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 6085cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 6098ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Sets the clipping region using the stencil buffer. The clip region 6108ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * is defined by the current snapshot's clipRegion member. 6118ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 6128ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void setStencilFromClip(); 6138ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 6148ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 615408eb12631376cbdc96803e918decf6ea804d346Chris Craik * Given the local bounds of the layer, calculates ... 616d90144db52c7297879b950cbbc85137ed123ab5bChris Craik */ 617d90144db52c7297879b950cbbc85137ed123ab5bChris Craik void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer); 618d90144db52c7297879b950cbbc85137ed123ab5bChris Craik 619d90144db52c7297879b950cbbc85137ed123ab5bChris Craik /** 620408eb12631376cbdc96803e918decf6ea804d346Chris Craik * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible 621408eb12631376cbdc96803e918decf6ea804d346Chris Craik */ 622408eb12631376cbdc96803e918decf6ea804d346Chris Craik void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip, 623408eb12631376cbdc96803e918decf6ea804d346Chris Craik bool fboLayer, int alpha); 624408eb12631376cbdc96803e918decf6ea804d346Chris Craik 625408eb12631376cbdc96803e918decf6ea804d346Chris Craik /** 626d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * Creates a new layer stored in the specified snapshot. 627d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * 628d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param snapshot The snapshot associated with the new layer 629d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param left The left coordinate of the layer 630d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param top The top coordinate of the layer 631d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param right The right coordinate of the layer 632d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param bottom The bottom coordinate of the layer 633d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param alpha The translucency of the layer 634d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param mode The blending mode of the layer 635d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param flags The layer save flags 6363f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik * @param mask A mask to use when drawing the layer back, may be empty 637d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * 638d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @return True if the layer was successfully created, false otherwise 639d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy */ 640d48885a6c8cd27a8a62552c33b5282e9882e19f6Chet Haase bool createLayer(float left, float top, float right, float bottom, 6413f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const SkPaint* paint, int flags, const SkPath* convexMask); 642d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy 643d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy /** 6445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Creates a new layer stored in the specified snapshot as an FBO. 6455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 6465b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param layer The layer to store as an FBO 6475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param snapshot The snapshot associated with the new layer 6485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param bounds The bounds of the layer 6495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 650e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip); 6515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 6525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 6535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Compose the specified layer as a region. 6545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 6555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param layer The layer to compose 6565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param rect The layer's bounds 6575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 6585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void composeLayerRegion(Layer* layer, const Rect& rect); 6595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 6605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 6615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Compose the specified layer as a simple rectangle. 6625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 6635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param layer The layer to compose 6645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param rect The layer's bounds 6655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param swap If true, the source and destination are swapped 6665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 6675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false); 6685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 66954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 67054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Clears all the regions corresponding to the current list of layers. 67154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * This method MUST be invoked before any drawing operation. 67254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 67354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy void clearLayerRegions(); 67454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 67554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 676f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Mark the layer as dirty at the specified coordinates. The coordinates 677f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * are transformed with the supplied matrix. 678f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy */ 679f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayer(const float left, const float top, 680f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy const float right, const float bottom, const mat4 transform); 681f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 682f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy /** 683f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Mark the layer as dirty at the specified coordinates. 684f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy */ 685f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayer(const float left, const float top, 686f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy const float right, const float bottom); 687f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 688f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy /** 6895cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Draws a colored rectangle with the specified color. The specified coordinates 690735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * are transformed by the current snapshot's transform matrix unless specified 691735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * otherwise. 6925cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 6935cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param left The left coordinate of the rectangle 6945cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param top The top coordinate of the rectangle 6955cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param right The right coordinate of the rectangle 6965cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param bottom The bottom coordinate of the rectangle 69776d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * @param paint The paint containing the color, blending mode, etc. 6983d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy * @param ignoreTransform True if the current transform should be ignored 6995cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 700026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy void drawColorRect(float left, float top, float right, float bottom, 70176d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const SkPaint* paint, bool ignoreTransform = false); 7025cbbce535744b89df5ecea95de21ee3733298260Romain Guy 70354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 704735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * Draws a series of colored rectangles with the specified color. The specified 705735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * coordinates are transformed by the current snapshot's transform matrix unless 706735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * specified otherwise. 707735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * 708735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * @param rects A list of rectangles, 4 floats (left, top, right, bottom) 709735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * per rectangle 71076d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * @param paint The paint containing the color, blending mode, etc. 711735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * @param ignoreTransform True if the current transform should be ignored 7128ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * @param dirty True if calling this method should dirty the current layer 7133bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy * @param clip True if the rects should be clipped, false otherwise 714735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy */ 715107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawColorRects(const float* rects, int count, const SkPaint* paint, 71676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger bool ignoreTransform = false, bool dirty = true, bool clip = true); 717735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 718735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy /** 71954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Draws the shape represented by the specified path texture. 72054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * This method invokes drawPathTexture() but takes into account 72154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * the extra left/top offset and the texture offset to correctly 72254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * position the final shape. 72354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 72454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param left The left coordinate of the shape to render 72554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param top The top coordinate of the shape to render 72654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param texture The texture reprsenting the shape 72754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param paint The paint to draw the shape with 72854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 72930036092b40badecbe64d9c2bff4850132147f78Chris Craik void drawShape(float left, float top, PathTexture* texture, const SkPaint* paint); 73054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 73154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 73254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey 73354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * different compositing rules. 73454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 73554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param texture The texture to draw with 73654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param paint The paint to render with 73754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 7380519c810a56bded1284fcb2ae40f438878c6585fChris Craik void drawAlphaBitmap(Texture* texture, const SkPaint* paint); 739a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy 74054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 74165cd612face362d054a85d0f7e5881c59cd523beChris Craik * Renders a strip of polygons with the specified paint, used for tessellated geometry. 74265cd612face362d054a85d0f7e5881c59cd523beChris Craik * 74365cd612face362d054a85d0f7e5881c59cd523beChris Craik * @param vertexBuffer The VertexBuffer to be drawn 74465cd612face362d054a85d0f7e5881c59cd523beChris Craik * @param paint The paint to render with 745bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik * @param flags flags with which to draw 74665cd612face362d054a85d0f7e5881c59cd523beChris Craik */ 747107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawVertexBuffer(float translateX, float translateY, const VertexBuffer& vertexBuffer, 748bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik const SkPaint* paint, int flags = 0); 74965cd612face362d054a85d0f7e5881c59cd523beChris Craik 75065cd612face362d054a85d0f7e5881c59cd523beChris Craik /** 75105f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Convenience for translating method 75205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 753107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawVertexBuffer(const VertexBuffer& vertexBuffer, 754bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik const SkPaint* paint, int flags = 0) { 755107843de4507b3511006cb9c77b8d0364374385aTom Hudson drawVertexBuffer(0.0f, 0.0f, vertexBuffer, paint, flags); 75605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } 75705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 75805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 759710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * Renders the convex hull defined by the specified path as a strip of polygons. 76054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 761710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * @param path The hull of the path to draw 762cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik * @param paint The paint to render with 76354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 764107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawConvexPath(const SkPath& path, const SkPaint* paint); 765858aa93ddb6e69e0503382af63bb681b6728aef1Chet Haase 7665cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 7670519c810a56bded1284fcb2ae40f438878c6585fChris Craik * Draws a textured rectangle with the specified texture. 7685cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 76982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param texture The texture to use 77082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param paint The paint containing the alpha, blending mode, etc. 77182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy */ 7720519c810a56bded1284fcb2ae40f438878c6585fChris Craik void drawTextureRect(Texture* texture, const SkPaint* paint); 77382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy 77482ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy /** 77503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy * Draws a textured mesh with the specified texture. If the indices are omitted, 77603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy * the mesh is drawn as a simple quad. The mesh pointers become offsets when a 77703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy * VBO is bound. 77882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * 77982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param left The left coordinate of the rectangle 78082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param top The top coordinate of the rectangle 78182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param right The right coordinate of the rectangle 78282ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param bottom The bottom coordinate of the rectangle 78382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param texture The texture name to map onto the rectangle 78476d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * @param paint The paint containing the alpha, blending mode, colorFilter, etc. 78582ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param blend True if the texture contains an alpha channel 78682ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param vertices The vertices that define the mesh 78782ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param texCoords The texture coordinates of each vertex 78882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * @param elementsCount The number of elements in the mesh, required by indices 789f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * @param swapSrcDst Whether or not the src and dst blending operations should be swapped 790f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy * @param ignoreTransform True if the current transform should be ignored 79103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy * @param vbo The VBO used to draw the mesh 7924063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * @param modelViewMode Defines whether the model view matrix should be scaled 7935b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param dirty True if calling this method should dirty the current layer 794f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */ 795f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture, 79676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const SkPaint* paint, bool blend, 7976820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, 7985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0, 7994063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik ModelViewMode modelViewMode = kModelViewMode_TranslateAndScale, bool dirty = true); 800f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy 8013b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy void drawIndexedTextureMesh(float left, float top, float right, float bottom, GLuint texture, 80276d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const SkPaint* paint, bool blend, 8033b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, 8043b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0, 8054063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik ModelViewMode modelViewMode = kModelViewMode_TranslateAndScale, bool dirty = true); 8063b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 807886b275e529e44a59c54b933453d9bc902973178Romain Guy void drawAlpha8TextureMesh(float left, float top, float right, float bottom, 80876d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger GLuint texture, const SkPaint* paint, 809886b275e529e44a59c54b933453d9bc902973178Romain Guy GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount, 8104063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik bool ignoreTransform, ModelViewMode modelViewMode = kModelViewMode_TranslateAndScale, 8114063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik bool dirty = true); 812886b275e529e44a59c54b933453d9bc902973178Romain Guy 813f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy /** 814448455fe783b0a711340322dca272b8cc0ebe473Romain Guy * Draws the specified list of vertices as quads using indexed GL_TRIANGLES. 815448455fe783b0a711340322dca272b8cc0ebe473Romain Guy * If the number of vertices to draw exceeds the number of indices we have 816448455fe783b0a711340322dca272b8cc0ebe473Romain Guy * pre-allocated, this method will generate several glDrawElements() calls. 817448455fe783b0a711340322dca272b8cc0ebe473Romain Guy */ 8184063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik void issueIndexedQuadDraw(Vertex* mesh, GLsizei quadsCount); 819448455fe783b0a711340322dca272b8cc0ebe473Romain Guy 820448455fe783b0a711340322dca272b8cc0ebe473Romain Guy /** 8210a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * Draws text underline and strike-through if needed. 8220a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * 8230a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param text The text to decor 8240a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param bytesCount The number of bytes in the text 82541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik * @param totalAdvance The total advance in pixels, defines underline/strikethrough length 8260a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param x The x coordinate where the text will be drawn 8270a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param y The y coordinate where the text will be drawn 8280a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param paint The paint to draw the text with 8290a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy */ 830d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void drawTextDecorations(float totalAdvance, float x, float y, const SkPaint* paint); 8311e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy 832416a847633680d94efb926837efdc18726d54918Raph Levien /** 833416a847633680d94efb926837efdc18726d54918Raph Levien * Draws shadow layer on text (with optional positions). 834416a847633680d94efb926837efdc18726d54918Raph Levien * 835416a847633680d94efb926837efdc18726d54918Raph Levien * @param paint The paint to draw the shadow with 836416a847633680d94efb926837efdc18726d54918Raph Levien * @param text The text to draw 837416a847633680d94efb926837efdc18726d54918Raph Levien * @param bytesCount The number of bytes in the text 838416a847633680d94efb926837efdc18726d54918Raph Levien * @param count The number of glyphs in the text 839416a847633680d94efb926837efdc18726d54918Raph Levien * @param positions The x, y positions of individual glyphs (or NULL) 840416a847633680d94efb926837efdc18726d54918Raph Levien * @param fontRenderer The font renderer object 841416a847633680d94efb926837efdc18726d54918Raph Levien * @param alpha The alpha value for drawing the shadow 842416a847633680d94efb926837efdc18726d54918Raph Levien * @param x The x coordinate where the shadow will be drawn 843416a847633680d94efb926837efdc18726d54918Raph Levien * @param y The y coordinate where the shadow will be drawn 844416a847633680d94efb926837efdc18726d54918Raph Levien */ 845d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void drawTextShadow(const SkPaint* paint, const char* text, int bytesCount, int count, 84676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const float* positions, FontRenderer& fontRenderer, int alpha, 847416a847633680d94efb926837efdc18726d54918Raph Levien float x, float y); 848416a847633680d94efb926837efdc18726d54918Raph Levien 84954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 85054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Draws a path texture. Path textures are alpha8 bitmaps that need special 85154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * compositing to apply colors/filters/etc. 85254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 85354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param texture The texture to render 85454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param x The x coordinate where the texture will be drawn 85554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param y The y coordinate where the texture will be drawn 85654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param paint The paint to draw the texture with 85754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 85830036092b40badecbe64d9c2bff4850132147f78Chris Craik void drawPathTexture(PathTexture* texture, float x, float y, const SkPaint* paint); 85901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 8601e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy /** 861ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Resets the texture coordinates stored in mMeshVertices. Setting the values 862026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * back to default is achieved by calling: 863026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * 8648ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); 865026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * 866026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param u1 The left coordinate of the texture 867026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param v1 The bottom coordinate of the texture 868026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param u2 The right coordinate of the texture 869026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param v2 The top coordinate of the texture 870026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy */ 871026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2); 872026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy 8738ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy /** 874768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy * Returns true if the specified paint will draw invisible text. 875768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy */ 876768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy bool canSkipText(const SkPaint* paint) const; 877768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy 878768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy /** 87982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * Enable or disable blending as necessary. This function sets the appropriate 88082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy * blend function based on the specified xfermode. 88182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy */ 882f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description, 883f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy bool swapSrcDst = false); 884a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy 885f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guy /** 886746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy * Invoked before any drawing operation. This sets required state. 887746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy */ 88854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy void setupDraw(bool clear = true); 88917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy 89070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy /** 89170ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy * Various methods to setup OpenGL rendering. 89270ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy */ 89370ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawWithTexture(bool isAlpha8 = false); 894ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy void setupDrawWithTextureAndColor(bool isAlpha8 = false); 895aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy void setupDrawWithExternalTexture(); 89615bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy void setupDrawNoTexture(); 89791a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik void setupDrawVertexAlpha(bool useShadowAlphaInterp); 8988d0d4783a0206c5884bf0b958d181f450ba5207dRomain Guy void setupDrawColor(int color, int alpha); 89970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawColor(float r, float g, float b, float a); 90086568198f2c83d4ce5c4cd692eda074ba9de9ed2Romain Guy void setupDrawAlpha8Color(int color, int alpha); 9014121063313ac0d6f69f6253cac821d0c1c122086Romain Guy void setupDrawTextGamma(const SkPaint* paint); 902d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III void setupDrawShader(const SkShader* shader); 90376d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void setupDrawColorFilter(const SkColorFilter* filter); 90476d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void setupDrawBlending(const Layer* layer, bool swapSrcDst = false); 90576d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void setupDrawBlending(const SkPaint* paint, bool blend = true, bool swapSrcDst = false); 90670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawProgram(); 90770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawDirtyRegionsDisabled(); 9084063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik 9094063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 9104063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Setup the current program matrices based upon the nature of the geometry. 9114063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 9124063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * @param mode If kModelViewMode_Translate, the geometry must be translated by the left and top 9134063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * parameters. If kModelViewMode_TranslateAndScale, the geometry that exists in the (0,0, 1,1) 9144063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * space must be scaled up and translated to fill the quad provided in (l,t,r,b). These 9154063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * transformations are stored in the modelView matrix and uploaded to the shader. 9164063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 917e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik * @param offset Set to true if the the matrix should be fudged (translated) slightly to 918e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik * disambiguate geometry pixel positioning. See Vertex::GeometryFudgeFactor(). 9194063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 9204063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * @param ignoreTransform Set to true if l,t,r,b coordinates already in layer space, 9214063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * currentTransform() will be ignored. (e.g. when drawing clip in layer coordinates to stencil, 9224063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * or when simple translation has been extracted) 9234063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 9244063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik void setupDrawModelView(ModelViewMode mode, bool offset, 9254063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik float left, float top, float right, float bottom, bool ignoreTransform = false); 926d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III void setupDrawColorUniforms(bool hasShader); 92786568198f2c83d4ce5c4cd692eda074ba9de9ed2Romain Guy void setupDrawPureColorUniforms(); 928d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III 929d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III /** 930d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * Setup uniforms for the current shader. 931d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * 932d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * @param shader SkShader on the current paint. 933d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * 934d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III * @param ignoreTransform Set to true to ignore the transform in shader. 935d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III */ 936d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III void setupDrawShaderUniforms(const SkShader* shader, bool ignoreTransform = false); 93776d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void setupDrawColorFilterUniforms(const SkColorFilter* paint); 93870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawSimpleMesh(); 93970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy void setupDrawTexture(GLuint texture); 940aa6c24c21c727a196451332448d4e3b11a80be69Romain Guy void setupDrawExternalTexture(GLuint texture); 9418f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy void setupDrawTextureTransform(); 9428f0095cd33558e9cc8a440047908e53b68906f5fRomain Guy void setupDrawTextureTransformUniforms(mat4& transform); 9434121063313ac0d6f69f6253cac821d0c1c122086Romain Guy void setupDrawTextGammaUniforms(); 944e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik void setupDrawMesh(const GLvoid* vertices, const GLvoid* texCoords = nullptr, GLuint vbo = 0); 945564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craik void setupDrawMesh(const GLvoid* vertices, const GLvoid* texCoords, const GLvoid* colors); 946564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craik void setupDrawMeshIndices(const GLvoid* vertices, const GLvoid* texCoords, GLuint vbo = 0); 947448455fe783b0a711340322dca272b8cc0ebe473Romain Guy void setupDrawIndexedVertices(GLvoid* vertices); 948f09ef51889f75289b041f9e9f949b7b82ed5b686Romain Guy void accountForClear(SkXfermode::Mode mode); 949746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy 95011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy bool updateLayer(Layer* layer, bool inFrame); 95111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy void updateLayers(); 95296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy void flushLayers(); 95311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 954e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#if DEBUG_LAYERS_AS_REGIONS 95517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 95617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Renders the specified region as a series of rectangles. This method 95717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * is used for debugging only. 95817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 959e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik void drawRegionRectsDebug(const Region& region); 960e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#endif 9613a3133d876caf60ebff2176ad75c3dcf0259148dRomain Guy 9628ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 9638ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Renders the specified region as a series of rectangles. The region 9648ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * must be in screen-space coordinates. 9658ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 96676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void drawRegionRects(const SkRegion& region, const SkPaint& paint, bool dirty = false); 9678ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 9688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 9698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS 9708ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * is turned on. 9718ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 9728ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void debugClip(); 9738ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 9747c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void debugOverdraw(bool enable, bool clear); 9757c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void renderOverdraw(); 97678dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy void countOverdraw(); 9777c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 978746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy /** 979746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy * Should be invoked every time the glScissor is modified. 980746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy */ 981984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline void dirtyClip() { mState.setDirtyClip(true); } 982746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy 9833b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy inline const UvMapper& getMapper(const Texture* texture) { 9843b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper; 9853b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 9863b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 9873b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy /** 9883b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Returns a texture object for the specified bitmap. The texture can 9893b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * come from the texture cache or an atlas. If this method returns 9903b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * NULL, the texture could not be found and/or allocated. 9913b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 992d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik Texture* getTexture(const SkBitmap* bitmap); 9933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 994107843de4507b3511006cb9c77b8d0364374385aTom Hudson bool reportAndClearDirty() { bool ret = mDirty; mDirty = false; return ret; } 995984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline Snapshot* writableSnapshot() { return mState.writableSnapshot(); } 996984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline const Snapshot* currentSnapshot() const { return mState.currentSnapshot(); } 997107843de4507b3511006cb9c77b8d0364374385aTom Hudson 9984063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 9994063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Model-view matrix used to position/size objects 10004063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 10014063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Stores operation-local modifications to the draw matrix that aren't incorporated into the 10024063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * currentTransform(). 10034063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 1004e10e827ed68b0a9487cf8dd1fc545f9a09517ae9Chris Craik * If generated with kModelViewMode_Translate, mModelViewMatrix will reflect an x/y offset, 10054063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * e.g. the offset in drawLayer(). If generated with kModelViewMode_TranslateAndScale, 1006e10e827ed68b0a9487cf8dd1fc545f9a09517ae9Chris Craik * mModelViewMatrix will reflect a translation and scale, e.g. the translation and scale 1007e10e827ed68b0a9487cf8dd1fc545f9a09517ae9Chris Craik * required to make VBO 0 (a rect of (0,0,1,1)) scaled to match the x,y offset, and width/height 1008e10e827ed68b0a9487cf8dd1fc545f9a09517ae9Chris Craik * of a bitmap. 10094063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * 10104063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Used as input to SkiaShader transformation. 10114063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1012e10e827ed68b0a9487cf8dd1fc545f9a09517ae9Chris Craik mat4 mModelViewMatrix; 1013c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 10142b7028eabac80cec170572bc0e945a1d4224e595Romain Guy // State used to define the clipping region 10155f803623559aab395a29d575c37c4e39c23a4b4eChris Craik Rect mTilingClip; 101696885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy // Is the target render surface opaque 101796885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy bool mOpaque; 101896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy // Is a frame currently being rendered 101996885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy bool mFrameStarted; 10209d5316e3f56d138504565ff311145ac01621dff4Romain Guy 1021026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy // Used to draw textured quads 1022ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy TextureVertex mMeshVertices[4]; 1023ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 10243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy // Default UV mapper 10253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const UvMapper mUvMapper; 10263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 1027c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik // shader, filters, and shadow 1028c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik DrawModifiers mDrawModifiers; 10295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint mFilteredPaint; 10305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 10318f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy // List of rectangles to clear after saveLayer() is invoked 103251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::vector<Rect> mLayers; 103311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy // List of layers to update at the beginning of a frame 10340e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck Vector< sp<Layer> > mLayerUpdates; 103554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 103670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // The following fields are used to setup drawing 103770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // Used to describe the shaders to generate 103870ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy ProgramDescription mDescription; 103970ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // Color description 104070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy bool mColorSet; 10410519c810a56bded1284fcb2ae40f438878c6585fChris Craik FloatColor mColor; 104270ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // Indicates that the shader should get a color 104370ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy bool mSetShaderColor; 104470ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // Current texture unit 104570ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy GLuint mTextureUnit; 104670ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy // Track dirty regions, true by default 104770ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy bool mTrackDirtyRegions; 10482b7028eabac80cec170572bc0e945a1d4224e595Romain Guy // Indicate whether we are drawing an opaque frame 10492b7028eabac80cec170572bc0e945a1d4224e595Romain Guy bool mOpaqueFrame; 105070ca14e08ae197547ac412e8a1210e1ebdfb2eb1Romain Guy 105187e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in 105287e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy // Properties.h 105387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy bool mScissorOptimizationDisabled; 105487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy 105554c1a64d5441a964890b44280e4457e11f4f924aRomain Guy // No-ops start/endTiling when set 105654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy bool mSuppressTiling; 1057284b24358410cb0200e525a5ba36994090c83f20Chris Craik bool mFirstFrameAfterResize; 105854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 1059deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik bool mSkipOutlineClip; 1060deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 1061107843de4507b3511006cb9c77b8d0364374385aTom Hudson // True if anything has been drawn since the last call to 1062107843de4507b3511006cb9c77b8d0364374385aTom Hudson // reportAndClearDirty() 1063107843de4507b3511006cb9c77b8d0364374385aTom Hudson bool mDirty; 1064107843de4507b3511006cb9c77b8d0364374385aTom Hudson 1065058fc640017c90120c599d378a4cbc55668b05b7Chris Craik // Lighting + shadows 1066058fc640017c90120c599d378a4cbc55668b05b7Chris Craik Vector3 mLightCenter; 1067058fc640017c90120c599d378a4cbc55668b05b7Chris Craik float mLightRadius; 1068058fc640017c90120c599d378a4cbc55668b05b7Chris Craik uint8_t mAmbientShadowAlpha; 1069058fc640017c90120c599d378a4cbc55668b05b7Chris Craik uint8_t mSpotShadowAlpha; 1070058fc640017c90120c599d378a4cbc55668b05b7Chris Craik 10714ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik // Paths kept alive for the duration of the frame 107251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::vector<std::unique_ptr<SkPath>> mTempPaths; 10734ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik 107496885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy friend class Layer; 1075257ae3502cfad43df681b1783528d645bdabc63fRomain Guy friend class TextSetupFunctor; 107603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy friend class DrawBitmapOp; 107703c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy friend class DrawPatchOp; 1078b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1079bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // class OpenGLRenderer 1080e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 10819d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer 1082e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; // namespace android 1083e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 10845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_OPENGL_RENDERER_H 1085