OpenGLRenderer.h revision 3aadd60521960be063ee06208562ccb63dc414e3
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> 386e03543f6335a03f9c3dc7d9afa9752f67a2e14cDerek Sollenberger#include <SkDrawLooper.h> 39f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <SkMatrix.h> 40ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkPaint.h> 41079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include <SkRegion.h> 4285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <SkXfermode.h> 43e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 44c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger#include <utils/Blur.h> 45daf98e941e140e8739458126640183b9f296a2abChet Haase#include <utils/Functor.h> 46bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <utils/RefBase.h> 47ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy#include <utils/SortedVector.h> 48bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 497953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 507953745dd565167113f8cbfc461bc0521d32d870Romain Guy 513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <androidfw/ResourceTypes.h> 523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 53272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector> 54272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck 55d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins IIIclass SkShader; 56d1ad5e62fda248c6d185cde3cb6d9f01a223066cLeon Scroggins III 57e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android { 589d5316e3f56d138504565ff311145ac01621dff4Romain Guynamespace uirenderer { 59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 6003ae272459869b854e5db252fc81a64a516e111fChris Craikenum class DrawOpMode { 6103ae272459869b854e5db252fc81a64a516e111fChris Craik kImmediate, 6203ae272459869b854e5db252fc81a64a516e111fChris Craik kDefer, 6303ae272459869b854e5db252fc81a64a516e111fChris Craik kFlush 6403ae272459869b854e5db252fc81a64a516e111fChris Craik}; 6503ae272459869b854e5db252fc81a64a516e111fChris Craik 66b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass DeferredDisplayState; 67117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikstruct Glop; 683b20251a355c88193c439f928a84ae69483fb488John Reckclass RenderState; 69e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode; 70828407356dd5c34a3e441604aaf895cbec7c7e66Chris Craikclass TextDrawFunctor; 71b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikclass VertexBuffer; 72b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik 73ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikenum StateDeferFlags { 74ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik kStateDeferFlag_Draw = 0x1, 75ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik kStateDeferFlag_Clip = 0x2 76ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik}; 77ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik 7828ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craikenum ClipSideFlags { 79a02c4ed885d97e516f844ddb0a96083f1b45b4cbChris Craik kClipSide_None = 0x0, 8028ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Left = 0x1, 8128ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Top = 0x2, 8228ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Right = 0x4, 8328ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik kClipSide_Bottom = 0x8, 84d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik kClipSide_Full = 0xF, 85d72b73cea49f29c41661e55eb6bfdbc04f09d809Chris Craik kClipSide_ConservativeFull = 0x1F 8628ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik}; 8728ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik 88bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craikenum VertexBufferDisplayFlags { 89bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik kVertexBuffer_Offset = 0x1, 9091a8c7c62913c2597e3bf5a6d59d2ed5fc7ba4e0Chris Craik kVertexBuffer_ShadowInterp = 0x2, 91bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik}; 92bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik 934063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik/** 944063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Defines additional transformation that should be applied by the model view matrix, beyond that of 954063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * the currentTransform() 964063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 974063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craikenum ModelViewMode { 984063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 994063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Used when the model view should simply translate geometry passed to the shader. The resulting 1004063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * matrix will be a simple translation. 1014063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1024063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik kModelViewMode_Translate = 0, 1034063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik 1044063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik /** 1054063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * Used when the model view should translate and scale geometry. The resulting matrix will be a 1064063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik * translation + scale. This is frequently used together with VBO 0, the (0,0,1,1) rect. 1074063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik */ 1084063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik kModelViewMode_TranslateAndScale = 1, 1094063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik}; 1104063a0e03ba2e354cc6d19c0ffc073fd5b8aa2caChris Craik 111f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/////////////////////////////////////////////////////////////////////////////// 112f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy// Renderer 113f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/////////////////////////////////////////////////////////////////////////////// 1145cbbce535744b89df5ecea95de21ee3733298260Romain Guy/** 11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik * OpenGL Renderer implementation. 1165cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 11703ae272459869b854e5db252fc81a64a516e111fChris Craikclass OpenGLRenderer : public CanvasStateClient { 118e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guypublic: 1193b20251a355c88193c439f928a84ae69483fb488John Reck OpenGLRenderer(RenderState& renderState); 120e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy virtual ~OpenGLRenderer(); 121e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 12203ae272459869b854e5db252fc81a64a516e111fChris Craik /** 12303ae272459869b854e5db252fc81a64a516e111fChris Craik * Sets the dimension of the underlying drawing surface. This method must 12403ae272459869b854e5db252fc81a64a516e111fChris Craik * be called at least once every time the drawing surface changes size. 12503ae272459869b854e5db252fc81a64a516e111fChris Craik * 12603ae272459869b854e5db252fc81a64a516e111fChris Craik * @param width The width in pixels of the underlysing surface 12703ae272459869b854e5db252fc81a64a516e111fChris Craik * @param height The height in pixels of the underlysing surface 12803ae272459869b854e5db252fc81a64a516e111fChris Craik */ 12903ae272459869b854e5db252fc81a64a516e111fChris Craik void setViewport(int width, int height) { mState.setViewport(width, height); } 13003ae272459869b854e5db252fc81a64a516e111fChris Craik 1313b20251a355c88193c439f928a84ae69483fb488John Reck void initProperties(); 13250210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette void initLight(float lightRadius, uint8_t ambientShadowAlpha, 13350210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette uint8_t spotShadowAlpha); 13450210d912925aef14e4ce69be82e4949122a3cd9Alan Viverette void setLightCenter(const Vector3& lightCenter); 13587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy 13603ae272459869b854e5db252fc81a64a516e111fChris Craik /* 13703ae272459869b854e5db252fc81a64a516e111fChris Craik * Prepares the renderer to draw a frame. This method must be invoked 13803ae272459869b854e5db252fc81a64a516e111fChris Craik * at the beginning of each frame. Only the specified rectangle of the 13903ae272459869b854e5db252fc81a64a516e111fChris Craik * frame is assumed to be dirty. A clip will automatically be set to 14003ae272459869b854e5db252fc81a64a516e111fChris Craik * the specified rectangle. 14103ae272459869b854e5db252fc81a64a516e111fChris Craik * 14203ae272459869b854e5db252fc81a64a516e111fChris Craik * @param opaque If true, the target surface is considered opaque 14303ae272459869b854e5db252fc81a64a516e111fChris Craik * and will not be cleared. If false, the target surface 14403ae272459869b854e5db252fc81a64a516e111fChris Craik * will be cleared 14503ae272459869b854e5db252fc81a64a516e111fChris Craik */ 146e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void prepareDirty(float left, float top, float right, float bottom, 14703ae272459869b854e5db252fc81a64a516e111fChris Craik bool opaque); 14803ae272459869b854e5db252fc81a64a516e111fChris Craik 14903ae272459869b854e5db252fc81a64a516e111fChris Craik /** 15003ae272459869b854e5db252fc81a64a516e111fChris Craik * Prepares the renderer to draw a frame. This method must be invoked 15103ae272459869b854e5db252fc81a64a516e111fChris Craik * at the beginning of each frame. When this method is invoked, the 15203ae272459869b854e5db252fc81a64a516e111fChris Craik * entire drawing surface is assumed to be redrawn. 15303ae272459869b854e5db252fc81a64a516e111fChris Craik * 15403ae272459869b854e5db252fc81a64a516e111fChris Craik * @param opaque If true, the target surface is considered opaque 15503ae272459869b854e5db252fc81a64a516e111fChris Craik * and will not be cleared. If false, the target surface 15603ae272459869b854e5db252fc81a64a516e111fChris Craik * will be cleared 15703ae272459869b854e5db252fc81a64a516e111fChris Craik */ 15803ae272459869b854e5db252fc81a64a516e111fChris Craik void prepare(bool opaque) { 159984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson prepareDirty(0.0f, 0.0f, mState.getWidth(), mState.getHeight(), opaque); 160984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson } 161c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy 16203ae272459869b854e5db252fc81a64a516e111fChris Craik /** 16303ae272459869b854e5db252fc81a64a516e111fChris Craik * Indicates the end of a frame. This method must be invoked whenever 16403ae272459869b854e5db252fc81a64a516e111fChris Craik * the caller is done rendering a frame. 16503ae272459869b854e5db252fc81a64a516e111fChris Craik * Returns true if any drawing was done during the frame (the output 16603ae272459869b854e5db252fc81a64a516e111fChris Craik * has changed / is "dirty" and should be displayed to the user). 16703ae272459869b854e5db252fc81a64a516e111fChris Craik */ 16803ae272459869b854e5db252fc81a64a516e111fChris Craik virtual bool finish(); 16903ae272459869b854e5db252fc81a64a516e111fChris Craik 17003ae272459869b854e5db252fc81a64a516e111fChris Craik void callDrawGLFunction(Functor* functor, Rect& dirty); 17108ae317c21ec3086b5017672bba87420cc38a407Romain Guy 1723b20251a355c88193c439f928a84ae69483fb488John Reck void pushLayerUpdate(Layer* layer); 1733b20251a355c88193c439f928a84ae69483fb488John Reck void cancelLayerUpdate(Layer* layer); 1743b20251a355c88193c439f928a84ae69483fb488John Reck void flushLayerUpdates(); 175443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck void markLayersAsBuildLayers(); 17611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 1773b20251a355c88193c439f928a84ae69483fb488John Reck virtual int saveLayer(float left, float top, float right, float bottom, 17803ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint, int flags) { 179e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return saveLayer(left, top, right, bottom, paint, flags, nullptr); 1803f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik } 1813f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik 1823f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik // Specialized saveLayer implementation, which will pass the convexMask to an FBO layer, if 1833f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik // created, which will in turn clip to that mask when drawn back/restored. 1843f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik int saveLayer(float left, float top, float right, float bottom, 1853f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const SkPaint* paint, int flags, const SkPath* convexMask); 186bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy 187d90144db52c7297879b950cbbc85137ed123ab5bChris Craik int saveLayerDeferred(float left, float top, float right, float bottom, 188d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger const SkPaint* paint, int flags); 189d90144db52c7297879b950cbbc85137ed123ab5bChris Craik 19003ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRenderNode(RenderNode* displayList, Rect& dirty, int32_t replayFlags = 1); 1913aadd60521960be063ee06208562ccb63dc414e3Chris Craik void drawLayer(Layer* layer); 19203ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 193107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawBitmaps(const SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount, 194d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik TextureVertex* vertices, bool pureTranslate, const Rect& bounds, const SkPaint* paint); 19503ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmap(const SkBitmap* bitmap, Rect src, Rect dst, 19603ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 19703ae272459869b854e5db252fc81a64a516e111fChris Craik void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, 19803ae272459869b854e5db252fc81a64a516e111fChris Craik const float* vertices, const int* colors, const SkPaint* paint); 199107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* entry, 200d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik TextureVertex* vertices, uint32_t indexCount, const SkPaint* paint); 201107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawPatch(const SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry, 202d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float left, float top, float right, float bottom, const SkPaint* paint); 20303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawColor(int color, SkXfermode::Mode mode); 20403ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRect(float left, float top, float right, float bottom, 20503ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 20603ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRoundRect(float left, float top, float right, float bottom, 20703ae272459869b854e5db252fc81a64a516e111fChris Craik float rx, float ry, const SkPaint* paint); 20803ae272459869b854e5db252fc81a64a516e111fChris Craik void drawCircle(float x, float y, float radius, const SkPaint* paint); 20903ae272459869b854e5db252fc81a64a516e111fChris Craik void drawOval(float left, float top, float right, float bottom, 21003ae272459869b854e5db252fc81a64a516e111fChris Craik const SkPaint* paint); 21103ae272459869b854e5db252fc81a64a516e111fChris Craik void drawArc(float left, float top, float right, float bottom, 21203ae272459869b854e5db252fc81a64a516e111fChris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint); 21303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPath(const SkPath* path, const SkPaint* paint); 21403ae272459869b854e5db252fc81a64a516e111fChris Craik void drawLines(const float* points, int count, const SkPaint* paint); 21503ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPoints(const float* points, int count, const SkPaint* paint); 21603ae272459869b854e5db252fc81a64a516e111fChris Craik void drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, 21703ae272459869b854e5db252fc81a64a516e111fChris Craik float hOffset, float vOffset, const SkPaint* paint); 21803ae272459869b854e5db252fc81a64a516e111fChris Craik void drawPosText(const char* text, int bytesCount, int count, 21903ae272459869b854e5db252fc81a64a516e111fChris Craik const float* positions, const SkPaint* paint); 22003ae272459869b854e5db252fc81a64a516e111fChris Craik void drawText(const char* text, int bytesCount, int count, float x, float y, 221d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, 22203ae272459869b854e5db252fc81a64a516e111fChris Craik DrawOpMode drawOpMode = DrawOpMode::kImmediate); 22303ae272459869b854e5db252fc81a64a516e111fChris Craik void drawRects(const float* rects, int count, const SkPaint* paint); 22485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 225107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawShadow(float casterAlpha, 226e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const VertexBuffer* ambientShadowVertexBuffer, 227e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const VertexBuffer* spotShadowVertexBuffer); 228f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik 22903ae272459869b854e5db252fc81a64a516e111fChris Craik void setDrawFilter(SkDrawFilter* filter); 2305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 2315e49b307eb99269db2db257760508b8efd7bb97dChris Craik /** 2325e49b307eb99269db2db257760508b8efd7bb97dChris Craik * Store the current display state (most importantly, the current clip and transform), and 2335e49b307eb99269db2db257760508b8efd7bb97dChris Craik * additionally map the state's bounds from local to window coordinates. 2345e49b307eb99269db2db257760508b8efd7bb97dChris Craik * 2355e49b307eb99269db2db257760508b8efd7bb97dChris Craik * Returns true if quick-rejected 2365e49b307eb99269db2db257760508b8efd7bb97dChris Craik */ 237ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags); 238527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false); 23928ce94a4ffc7576f40776d212f1ada79fafaa061Chris Craik void setupMergedMultiDraw(const Rect* clipRect); 240c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik 2413b20251a355c88193c439f928a84ae69483fb488John Reck bool isCurrentTransformSimple() { 242d6b65f67717025b1162f86f04e2caa5723566cacChris Craik return currentTransform()->isSimple(); 243672433d90fab7383cd28beac9d4485b566a90940Romain Guy } 244672433d90fab7383cd28beac9d4485b566a90940Romain Guy 2450f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy Caches& getCaches() { 2460f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy return mCaches; 2470f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy } 2480f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 24965fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik RenderState& renderState() { 25065fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik return mRenderState; 25165fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik } 25265fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik 253984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson int getViewportWidth() { return mState.getViewportWidth(); } 254984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson int getViewportHeight() { return mState.getViewportHeight(); } 2550e87f00f8cb79635aa70b9a2dfa02bf19dc7473dChris Craik 25617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 257a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik * Scales the alpha on the current snapshot. This alpha value will be modulated 25817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * with other alpha values when drawing primitives. 25917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 260984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void scaleAlpha(float alpha) { mState.scaleAlpha(alpha); } 26117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy 26217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 2630f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy * Inserts a named event marker in the stream of GL commands. 2640f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy */ 2650f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy void eventMark(const char* name) const; 2660f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy 2670f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy /** 26862d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik * Inserts a formatted event marker in the stream of GL commands. 26962d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik */ 27062d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik void eventMarkDEBUG(const char *fmt, ...) const; 27162d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik 27262d307c2402777d5e53b4590af5f32f8c55afd81Chris Craik /** 27317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Inserts a named group marker in the stream of GL commands. This marker 27417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * can be used by tools to group commands into logical groups. A call to 27517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * this method must always be followed later on by a call to endMark(). 27617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 27713631f3da855f200a151e7837ed9f6b079622b58Romain Guy void startMark(const char* name) const; 27817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy 27917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 28017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Closes the last group marker opened by startMark(). 28117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 28213631f3da855f200a151e7837ed9f6b079622b58Romain Guy void endMark() const; 28313631f3da855f200a151e7837ed9f6b079622b58Romain Guy 284d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase /** 285d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * Gets the alpha and xfermode out of a paint object. If the paint is null 286d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * alpha will be 255 and the xfermode will be SRC_OVER. This method does 28716ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * not multiply the paint's alpha by the current snapshot's alpha, and does 28816ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * not replace the alpha with the overrideLayerAlpha 289d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * 290d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param paint The paint to extract values from 291d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param alpha Where to store the resulting alpha 292d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * @param mode Where to store the resulting xfermode 293d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase */ 294e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik static inline void getAlphaAndModeDirect(const SkPaint* paint, int* alpha, 295e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik SkXfermode::Mode* mode) { 296527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *mode = getXfermodeDirect(paint); 297527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *alpha = getAlphaDirect(paint); 298527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 299527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 300d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik static inline SkXfermode::Mode getXfermodeDirect(const SkPaint* paint) { 301527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (!paint) return SkXfermode::kSrcOver_Mode; 3028dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return PaintUtils::getXfermode(paint->getXfermode()); 303527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 304527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 305c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik static inline int getAlphaDirect(const SkPaint* paint) { 306527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (!paint) return 255; 307527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik return paint->getAlpha(); 308d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 309d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 310c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger struct TextShadow { 311c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkScalar radius; 312c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger float dx; 313c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger float dy; 314c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkColor color; 315c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger }; 316c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 317c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger static inline bool getTextShadow(const SkPaint* paint, TextShadow* textShadow) { 318c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger SkDrawLooper::BlurShadowRec blur; 319c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger if (paint && paint->getLooper() && paint->getLooper()->asABlurShadow(&blur)) { 320c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger if (textShadow) { 321c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->radius = Blur::convertSigmaToRadius(blur.fSigma); 322c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->dx = blur.fOffset.fX; 323c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->dy = blur.fOffset.fY; 324c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger textShadow->color = blur.fColor; 325c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 326c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger return true; 327c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 328c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger return false; 329c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 330c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 331c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger static inline bool hasTextShadow(const SkPaint* paint) { 332e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik return getTextShadow(paint, nullptr); 333c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger } 334c29a0a4664a4b9871fadd668b632469a0db240b9Derek Sollenberger 335624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy /** 33659744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * Build the best transform to use to rasterize text given a full 33759744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * transform matrix, and whether filteration is needed. 33859744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * 33959744b79ec302000802cd56d30a1bf70f0183c80Chris Craik * Returns whether filtration is needed 340624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy */ 34159744b79ec302000802cd56d30a1bf70f0183c80Chris Craik bool findBestFontTransform(const mat4& transform, SkMatrix* outMatrix) const; 342624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy 343527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#if DEBUG_MERGE_BEHAVIOR 344527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) { 345527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik mCaches.setScissorEnabled(false); 346527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 347527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // should only be called outside of other draw ops, so stencil can only be in test state 348527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik bool stencilWasEnabled = mCaches.stencil.isTestEnabled(); 349527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik mCaches.stencil.disable(); 350527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 351527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true); 352527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 353527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik if (stencilWasEnabled) mCaches.stencil.enableTest(); 354107843de4507b3511006cb9c77b8d0364374385aTom Hudson mDirty = true; 355527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 356527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#endif 357527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 358984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Vector3& getLightCenter() const { return mState.currentLightCenter(); } 35905f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik float getLightRadius() const { return mLightRadius; } 36069e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik uint8_t getAmbientShadowAlpha() const { return mAmbientShadowAlpha; } 36169e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik uint8_t getSpotShadowAlpha() const { return mSpotShadowAlpha; } 36205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 363984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /////////////////////////////////////////////////////////////////// 364984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /// State manipulation 365984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 36603ae272459869b854e5db252fc81a64a516e111fChris Craik int getSaveCount() const; 36703ae272459869b854e5db252fc81a64a516e111fChris Craik int save(int flags); 36803ae272459869b854e5db252fc81a64a516e111fChris Craik void restore(); 36903ae272459869b854e5db252fc81a64a516e111fChris Craik void restoreToCount(int saveCount); 370984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 3716daa13c5fa7577fa1d8371deca446f6ca911f38fChris Craik void setGlobalMatrix(const Matrix4& matrix) { 3726daa13c5fa7577fa1d8371deca446f6ca911f38fChris Craik mState.setMatrix(matrix); 3736daa13c5fa7577fa1d8371deca446f6ca911f38fChris Craik } 3746daa13c5fa7577fa1d8371deca446f6ca911f38fChris Craik void setLocalMatrix(const Matrix4& matrix); 375ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson void setLocalMatrix(const SkMatrix& matrix); 37603ae272459869b854e5db252fc81a64a516e111fChris Craik void concatMatrix(const SkMatrix& matrix) { mState.concatMatrix(matrix); } 377984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 37803ae272459869b854e5db252fc81a64a516e111fChris Craik void translate(float dx, float dy, float dz = 0.0f); 37903ae272459869b854e5db252fc81a64a516e111fChris Craik void rotate(float degrees); 38003ae272459869b854e5db252fc81a64a516e111fChris Craik void scale(float sx, float sy); 38103ae272459869b854e5db252fc81a64a516e111fChris Craik void skew(float sx, float sy); 382984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 383984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setMatrix(const Matrix4& matrix); // internal only convenience method 384984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void concatMatrix(const Matrix4& matrix); // internal only convenience method 385984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 38603ae272459869b854e5db252fc81a64a516e111fChris Craik const Rect& getLocalClipBounds() const { return mState.getLocalClipBounds(); } 387984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Rect& getRenderTargetClipBounds() const { return mState.getRenderTargetClipBounds(); } 38803ae272459869b854e5db252fc81a64a516e111fChris Craik bool quickRejectConservative(float left, float top, 38903ae272459869b854e5db252fc81a64a516e111fChris Craik float right, float bottom) const { 390984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.quickRejectConservative(left, top, right, bottom); 391984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson } 392984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 39303ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipRect(float left, float top, 39403ae272459869b854e5db252fc81a64a516e111fChris Craik float right, float bottom, SkRegion::Op op); 39503ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipPath(const SkPath* path, SkRegion::Op op); 39603ae272459869b854e5db252fc81a64a516e111fChris Craik bool clipRegion(const SkRegion* region, SkRegion::Op op); 397984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 398984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /** 399984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * Does not support different clipping Ops (that is, every call to setClippingOutline is 400984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * effectively using SkRegion::kReplaceOp) 401984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * 402984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson * The clipping outline is independent from the regular clip. 403984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson */ 404984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setClippingOutline(LinearAllocator& allocator, const Outline* outline); 405984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson void setClippingRoundRect(LinearAllocator& allocator, 406984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Rect& rect, float radius, bool highPriority = true); 407fca52b7583d1e5f5ff8ed06554875d2a30ef56faChris Craik void setProjectionPathMask(LinearAllocator& allocator, const SkPath* path); 408984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 409984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline bool hasRectToRectTransform() const { return mState.hasRectToRectTransform(); } 410984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline const mat4* currentTransform() const { return mState.currentTransform(); } 411984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 412984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /////////////////////////////////////////////////////////////////// 413984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson /// CanvasStateClient interface 414984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 415e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onViewportInitialized() override; 416e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override; 4176b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik virtual GLuint getTargetFbo() const override { return 0; } 418984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 4194ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik SkPath* allocPathForFrame() { 42051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<SkPath> path(new SkPath()); 42151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik SkPath* returnPath = path.get(); 42251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mTempPaths.push_back(std::move(path)); 42351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik return returnPath; 4244ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik } 4254ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik 426ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson void setBaseTransform(const Matrix4& matrix) { mBaseTransform = matrix; } 427ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson 428e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyprotected: 429e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy /** 43096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * Perform the setup specific to a frame. This method does not 43196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * issue any OpenGL commands. 43296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy */ 43396885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy void setupFrameState(float left, float top, float right, float bottom, bool opaque); 43496885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy 43596885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy /** 43696885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * Indicates the start of rendering. This method will setup the 43796885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy * initial OpenGL state (viewport, clearing the buffer, etc.) 43896885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy */ 439107843de4507b3511006cb9c77b8d0364374385aTom Hudson void startFrame(); 44096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy 44196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy /** 4427c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy * Clears the underlying surface if needed. 4437c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy */ 444107843de4507b3511006cb9c77b8d0364374385aTom Hudson virtual void clear(float left, float top, float right, float bottom, bool opaque); 4457c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy 4467c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy /** 44735643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy * Call this method after updating a layer during a drawing pass. 44835643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy */ 44935643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy void resumeAfterLayer(); 45035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy 45135643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy /** 4528ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * This method is called whenever a stencil buffer is required. Subclasses 4538ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * should override this method and call attachStencilBufferToLayer() on the 4548ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * appropriate layer(s). 4558ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 4568ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy virtual void ensureStencilBuffer(); 4578ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 4588ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 4598ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Obtains a stencil render buffer (allocating it if necessary) and 4608ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * attaches it to the specified layer. 4618ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 4628ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void attachStencilBufferToLayer(Layer* layer); 4638ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 464487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk /** 465487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Draw a rectangle list. Currently only used for the the stencil buffer so that the stencil 466487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * will have a value of 'n' in every unclipped pixel, where 'n' is the number of rectangles 467487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * in the list. 468487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk */ 469487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk void drawRectangleList(const RectangleList& rectangleList); 470487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk 471f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik bool quickRejectSetupScissor(float left, float top, float right, float bottom, 472e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik const SkPaint* paint = nullptr); 473e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik bool quickRejectSetupScissor(const Rect& bounds, const SkPaint* paint = nullptr) { 474f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik return quickRejectSetupScissor(bounds.left, bounds.top, 475f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik bounds.right, bounds.bottom, paint); 476f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik } 477f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik 4788ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 479e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * Compose the layer defined in the current snapshot with the layer 480e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * defined by the previous snapshot. 481e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 482e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * The current snapshot *must* be a layer (flag kFlagIsLayer set.) 483e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 484e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * @param curent The current snapshot containing the layer to compose 485e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * @param previous The previous snapshot to compose the current layer with 486e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy */ 48714e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void composeLayer(const Snapshot& current, const Snapshot& previous); 488694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy 489ada830f639591b99c3e40de22b07296c7932a33fRomain Guy /** 490f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Marks the specified region as dirty at the specified bounds. 491ada830f639591b99c3e40de22b07296c7932a33fRomain Guy */ 492f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayerUnchecked(Rect& bounds, Region* region); 493ada830f639591b99c3e40de22b07296c7932a33fRomain Guy 49442f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy /** 49542f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy * Returns the region of the current layer. 49642f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy */ 497624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual Region* getRegion() const { 498984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.currentRegion(); 499f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy } 500f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 50142f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy /** 50242f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy * Indicates whether rendering is currently targeted at a layer. 50342f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy */ 504624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual bool hasLayer() const { 505984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return (mState.currentFlags() & Snapshot::kFlagFboTarget) && mState.currentRegion(); 506f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy } 5071bd1bad0b4a75e633c5edbe802bf6fb4dd765161Romain Guy 50877a811610f99e21da7f88dafef60d09f345d0506Romain Guy /** 50977a811610f99e21da7f88dafef60d09f345d0506Romain Guy * Renders the specified layer as a textured quad. 51077a811610f99e21da7f88dafef60d09f345d0506Romain Guy * 51177a811610f99e21da7f88dafef60d09f345d0506Romain Guy * @param layer The layer to render 51277a811610f99e21da7f88dafef60d09f345d0506Romain Guy * @param rect The bounds of the layer 51377a811610f99e21da7f88dafef60d09f345d0506Romain Guy */ 51477a811610f99e21da7f88dafef60d09f345d0506Romain Guy void drawTextureLayer(Layer* layer, const Rect& rect); 51577a811610f99e21da7f88dafef60d09f345d0506Romain Guy 516be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy /** 517be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * Gets the alpha and xfermode out of a paint object. If the paint is null 5188df5ffa9ae0667d9e0241adf4675753156fcef84Chris Craik * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for snapshot alpha. 519be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * 520be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param paint The paint to extract values from 521be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param alpha Where to store the resulting alpha 522be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy * @param mode Where to store the resulting xfermode 523be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy */ 524d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline void getAlphaAndMode(const SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const; 52516ecda5317c40fc3da284952d9b3add34d6763aeChris Craik 52616ecda5317c40fc3da284952d9b3add34d6763aeChris Craik /** 5278df5ffa9ae0667d9e0241adf4675753156fcef84Chris Craik * Gets the alpha from a layer, accounting for snapshot alpha 52816ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * 52916ecda5317c40fc3da284952d9b3add34d6763aeChris Craik * @param layer The layer from which the alpha is extracted 53016ecda5317c40fc3da284952d9b3add34d6763aeChris Craik */ 53176d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger inline float getLayerAlpha(const Layer* layer) const; 532be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 533be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy /** 53411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy * Set to true to suppress error checks at the end of a frame. 53511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy */ 536624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy virtual bool suppressErrorChecks() const { 53711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy return false; 53811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy } 53911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 540984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson CanvasState mState; 54165fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik Caches& mCaches; 54265fe5eeb19e2e15c8b1ee91e8a2dcf0c25e48ca6Chris Craik RenderState& mRenderState; 543984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 54408ae317c21ec3086b5017672bba87420cc38a407Romain Guyprivate: 5453375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik enum class GlopRenderType { 5463375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik Standard, 5473375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik Multi, 5483375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik LayerClear 5493375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik }; 5503375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik 5513375f8ad30997482317b5ade5618cc8a01b96d7dChris Craik void renderGlop(const Glop& glop, GlopRenderType type = GlopRenderType::Standard); 552117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik 5535cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 554dcfc836b457a87881da409e1acf251515f121446Romain Guy * Discards the content of the framebuffer if supported by the driver. 555dcfc836b457a87881da409e1acf251515f121446Romain Guy * This method should be called at the beginning of a frame to optimize 556dcfc836b457a87881da409e1acf251515f121446Romain Guy * rendering on some tiler architectures. 557dcfc836b457a87881da409e1acf251515f121446Romain Guy */ 558dcfc836b457a87881da409e1acf251515f121446Romain Guy void discardFramebuffer(float left, float top, float right, float bottom); 559dcfc836b457a87881da409e1acf251515f121446Romain Guy 560dcfc836b457a87881da409e1acf251515f121446Romain Guy /** 5615cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Sets the clipping rectangle using glScissor. The clip is defined by 5625cbbce535744b89df5ecea95de21ee3733298260Romain Guy * the current snapshot's clipRect member. 5635cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 564bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy void setScissorFromClip(); 565bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 5665cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 5678ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Sets the clipping region using the stencil buffer. The clip region 5688ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * is defined by the current snapshot's clipRegion member. 5698ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 5708ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void setStencilFromClip(); 5718ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 5728ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 573408eb12631376cbdc96803e918decf6ea804d346Chris Craik * Given the local bounds of the layer, calculates ... 574d90144db52c7297879b950cbbc85137ed123ab5bChris Craik */ 575d90144db52c7297879b950cbbc85137ed123ab5bChris Craik void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer); 576d90144db52c7297879b950cbbc85137ed123ab5bChris Craik 577d90144db52c7297879b950cbbc85137ed123ab5bChris Craik /** 578408eb12631376cbdc96803e918decf6ea804d346Chris Craik * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible 579408eb12631376cbdc96803e918decf6ea804d346Chris Craik */ 580408eb12631376cbdc96803e918decf6ea804d346Chris Craik void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip, 581408eb12631376cbdc96803e918decf6ea804d346Chris Craik bool fboLayer, int alpha); 582408eb12631376cbdc96803e918decf6ea804d346Chris Craik 583408eb12631376cbdc96803e918decf6ea804d346Chris Craik /** 584d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * Creates a new layer stored in the specified snapshot. 585d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * 586d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param snapshot The snapshot associated with the new layer 587d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param left The left coordinate of the layer 588d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param top The top coordinate of the layer 589d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param right The right coordinate of the layer 590d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param bottom The bottom coordinate of the layer 591d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param alpha The translucency of the layer 592d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param mode The blending mode of the layer 593d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @param flags The layer save flags 5943f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik * @param mask A mask to use when drawing the layer back, may be empty 595d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * 596d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy * @return True if the layer was successfully created, false otherwise 597d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy */ 598d48885a6c8cd27a8a62552c33b5282e9882e19f6Chet Haase bool createLayer(float left, float top, float right, float bottom, 5993f085429fd47ebd32ac2463b3eae2a5a6c17be25Chris Craik const SkPaint* paint, int flags, const SkPath* convexMask); 600d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy 601d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy /** 6025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Creates a new layer stored in the specified snapshot as an FBO. 6035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 6045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param layer The layer to store as an FBO 6055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param snapshot The snapshot associated with the new layer 6065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param bounds The bounds of the layer 6075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 608e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip); 6095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 6105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 6115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Compose the specified layer as a region. 6125b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 6135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param layer The layer to compose 6145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * @param rect The layer's bounds 6155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 6165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy void composeLayerRegion(Layer* layer, const Rect& rect); 6175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 6185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 61953e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Restores the content in layer to the screen, swapping the blend mode, 62053e51e4aa933f9603587e1780f446c18816bf9beChris Craik * specifically used in the restore() of a saveLayerAlpha(). 6215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * 62253e51e4aa933f9603587e1780f446c18816bf9beChris Craik * This allows e.g. a layer that would have been drawn on top of existing content (with SrcOver) 62353e51e4aa933f9603587e1780f446c18816bf9beChris Craik * to be drawn underneath. 62453e51e4aa933f9603587e1780f446c18816bf9beChris Craik * 62553e51e4aa933f9603587e1780f446c18816bf9beChris Craik * This will always ignore the canvas transform. 62653e51e4aa933f9603587e1780f446c18816bf9beChris Craik */ 62753e51e4aa933f9603587e1780f446c18816bf9beChris Craik void composeLayerRectSwapped(Layer* layer, const Rect& rect); 62853e51e4aa933f9603587e1780f446c18816bf9beChris Craik 62953e51e4aa933f9603587e1780f446c18816bf9beChris Craik /** 63053e51e4aa933f9603587e1780f446c18816bf9beChris Craik * Draws the content in layer to the screen. 6315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 63253e51e4aa933f9603587e1780f446c18816bf9beChris Craik void composeLayerRect(Layer* layer, const Rect& rect); 6335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 63454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 63554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Clears all the regions corresponding to the current list of layers. 63654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * This method MUST be invoked before any drawing operation. 63754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 63854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy void clearLayerRegions(); 63954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 64054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 641f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Mark the layer as dirty at the specified coordinates. The coordinates 642f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * are transformed with the supplied matrix. 643f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy */ 644f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayer(const float left, const float top, 645083e733e8223a7d416d6c139f318e61864b28ad6Chris Craik const float right, const float bottom, const Matrix4& transform); 646f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 647f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy /** 648f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy * Mark the layer as dirty at the specified coordinates. 649f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy */ 650f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy void dirtyLayer(const float left, const float top, 651f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy const float right, const float bottom); 652f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy 653f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy /** 6545cbbce535744b89df5ecea95de21ee3733298260Romain Guy * Draws a colored rectangle with the specified color. The specified coordinates 655735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * are transformed by the current snapshot's transform matrix unless specified 656735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * otherwise. 6575cbbce535744b89df5ecea95de21ee3733298260Romain Guy * 6585cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param left The left coordinate of the rectangle 6595cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param top The top coordinate of the rectangle 6605cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param right The right coordinate of the rectangle 6615cbbce535744b89df5ecea95de21ee3733298260Romain Guy * @param bottom The bottom coordinate of the rectangle 66276d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * @param paint The paint containing the color, blending mode, etc. 6633d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy * @param ignoreTransform True if the current transform should be ignored 6645cbbce535744b89df5ecea95de21ee3733298260Romain Guy */ 665026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy void drawColorRect(float left, float top, float right, float bottom, 66676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const SkPaint* paint, bool ignoreTransform = false); 6675cbbce535744b89df5ecea95de21ee3733298260Romain Guy 66854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 669735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * Draws a series of colored rectangles with the specified color. The specified 670735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * coordinates are transformed by the current snapshot's transform matrix unless 671735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * specified otherwise. 672735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * 673735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * @param rects A list of rectangles, 4 floats (left, top, right, bottom) 674735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * per rectangle 67576d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger * @param paint The paint containing the color, blending mode, etc. 676735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy * @param ignoreTransform True if the current transform should be ignored 6778ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * @param dirty True if calling this method should dirty the current layer 6783bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy * @param clip True if the rects should be clipped, false otherwise 679735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy */ 680107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawColorRects(const float* rects, int count, const SkPaint* paint, 68176d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger bool ignoreTransform = false, bool dirty = true, bool clip = true); 682735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 683735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy /** 68454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Draws the shape represented by the specified path texture. 68554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * This method invokes drawPathTexture() but takes into account 68654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * the extra left/top offset and the texture offset to correctly 68754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * position the final shape. 68854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 68954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param left The left coordinate of the shape to render 69054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param top The top coordinate of the shape to render 69154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param texture The texture reprsenting the shape 69254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param paint The paint to draw the shape with 69354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 69430036092b40badecbe64d9c2bff4850132147f78Chris Craik void drawShape(float left, float top, PathTexture* texture, const SkPaint* paint); 69554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 69654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 69765cd612face362d054a85d0f7e5881c59cd523beChris Craik * Renders a strip of polygons with the specified paint, used for tessellated geometry. 69865cd612face362d054a85d0f7e5881c59cd523beChris Craik * 69965cd612face362d054a85d0f7e5881c59cd523beChris Craik * @param vertexBuffer The VertexBuffer to be drawn 70065cd612face362d054a85d0f7e5881c59cd523beChris Craik * @param paint The paint to render with 701bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik * @param flags flags with which to draw 70265cd612face362d054a85d0f7e5881c59cd523beChris Craik */ 703107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawVertexBuffer(float translateX, float translateY, const VertexBuffer& vertexBuffer, 704bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik const SkPaint* paint, int flags = 0); 70565cd612face362d054a85d0f7e5881c59cd523beChris Craik 70665cd612face362d054a85d0f7e5881c59cd523beChris Craik /** 70705f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik * Convenience for translating method 70805f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik */ 709107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawVertexBuffer(const VertexBuffer& vertexBuffer, 710bf75945e7a1ae7c1000682716643c942c1e19ba6Chris Craik const SkPaint* paint, int flags = 0) { 711107843de4507b3511006cb9c77b8d0364374385aTom Hudson drawVertexBuffer(0.0f, 0.0f, vertexBuffer, paint, flags); 71205f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik } 71305f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik 71405f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik /** 715710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * Renders the convex hull defined by the specified path as a strip of polygons. 71654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 717710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik * @param path The hull of the path to draw 718cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik * @param paint The paint to render with 71954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 720107843de4507b3511006cb9c77b8d0364374385aTom Hudson void drawConvexPath(const SkPath& path, const SkPaint* paint); 721858aa93ddb6e69e0503382af63bb681b6728aef1Chet Haase 7225cbbce535744b89df5ecea95de21ee3733298260Romain Guy /** 7230a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * Draws text underline and strike-through if needed. 7240a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * 7250a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param text The text to decor 7260a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param bytesCount The number of bytes in the text 72741541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik * @param totalAdvance The total advance in pixels, defines underline/strikethrough length 7280a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param x The x coordinate where the text will be drawn 7290a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param y The y coordinate where the text will be drawn 7300a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy * @param paint The paint to draw the text with 7310a41749953f35d33f61b3119e3161a82bb5fa59eRomain Guy */ 732d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void drawTextDecorations(float totalAdvance, float x, float y, const SkPaint* paint); 7331e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy 734416a847633680d94efb926837efdc18726d54918Raph Levien /** 735416a847633680d94efb926837efdc18726d54918Raph Levien * Draws shadow layer on text (with optional positions). 736416a847633680d94efb926837efdc18726d54918Raph Levien * 737416a847633680d94efb926837efdc18726d54918Raph Levien * @param paint The paint to draw the shadow with 738416a847633680d94efb926837efdc18726d54918Raph Levien * @param text The text to draw 739416a847633680d94efb926837efdc18726d54918Raph Levien * @param bytesCount The number of bytes in the text 740416a847633680d94efb926837efdc18726d54918Raph Levien * @param count The number of glyphs in the text 741416a847633680d94efb926837efdc18726d54918Raph Levien * @param positions The x, y positions of individual glyphs (or NULL) 742416a847633680d94efb926837efdc18726d54918Raph Levien * @param fontRenderer The font renderer object 743416a847633680d94efb926837efdc18726d54918Raph Levien * @param alpha The alpha value for drawing the shadow 744416a847633680d94efb926837efdc18726d54918Raph Levien * @param x The x coordinate where the shadow will be drawn 745416a847633680d94efb926837efdc18726d54918Raph Levien * @param y The y coordinate where the shadow will be drawn 746416a847633680d94efb926837efdc18726d54918Raph Levien */ 747d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void drawTextShadow(const SkPaint* paint, const char* text, int bytesCount, int count, 74876d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger const float* positions, FontRenderer& fontRenderer, int alpha, 749416a847633680d94efb926837efdc18726d54918Raph Levien float x, float y); 750416a847633680d94efb926837efdc18726d54918Raph Levien 75154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy /** 75254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * Draws a path texture. Path textures are alpha8 bitmaps that need special 75354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * compositing to apply colors/filters/etc. 75454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * 75554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param texture The texture to render 75654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param x The x coordinate where the texture will be drawn 75754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param y The y coordinate where the texture will be drawn 75854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy * @param paint The paint to draw the texture with 75954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy */ 76030036092b40badecbe64d9c2bff4850132147f78Chris Craik void drawPathTexture(PathTexture* texture, float x, float y, const SkPaint* paint); 76101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 7621e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy /** 763ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Resets the texture coordinates stored in mMeshVertices. Setting the values 764026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * back to default is achieved by calling: 765026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * 7668ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); 767026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * 768026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param u1 The left coordinate of the texture 769026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param v1 The bottom coordinate of the texture 770026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param u2 The right coordinate of the texture 771026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy * @param v2 The top coordinate of the texture 772026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy */ 773026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2); 774026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy 7758ba548f81d1ab5f1750cbf86098c4a14e0b8beadRomain Guy /** 776768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy * Returns true if the specified paint will draw invisible text. 777768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy */ 778768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy bool canSkipText(const SkPaint* paint) const; 779768bffc9b814f6a1f7d9ff59d91285895c23bbe9Romain Guy 78011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy bool updateLayer(Layer* layer, bool inFrame); 78111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy void updateLayers(); 78296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy void flushLayers(); 78311cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy 784e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#if DEBUG_LAYERS_AS_REGIONS 78517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy /** 78617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * Renders the specified region as a series of rectangles. This method 78717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy * is used for debugging only. 78817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy */ 789e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik void drawRegionRectsDebug(const Region& region); 790e63f7c622a2086aefa80983c6f41b74fb166bb42Chris Craik#endif 7913a3133d876caf60ebff2176ad75c3dcf0259148dRomain Guy 7928ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 7938ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Renders the specified region as a series of rectangles. The region 7948ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * must be in screen-space coordinates. 7958ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 79676d3a1b8d035d27bc80b0f2fc480a903bd001514Derek Sollenberger void drawRegionRects(const SkRegion& region, const SkPaint& paint, bool dirty = false); 7978ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 7988ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy /** 7998ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS 8008ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy * is turned on. 8018ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy */ 8028ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy void debugClip(); 8038ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 8047c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void debugOverdraw(bool enable, bool clear); 8057c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy void renderOverdraw(); 80678dd96d5af20f489f0e8b288617d57774ec284f7Romain Guy void countOverdraw(); 8077c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy 808746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy /** 809746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy * Should be invoked every time the glScissor is modified. 810746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy */ 811984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline void dirtyClip() { mState.setDirtyClip(true); } 812746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy 8133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy inline const UvMapper& getMapper(const Texture* texture) { 8143b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper; 8153b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 8163b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 8173b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy /** 8183b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * Returns a texture object for the specified bitmap. The texture can 8193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * come from the texture cache or an atlas. If this method returns 8203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * NULL, the texture could not be found and/or allocated. 8213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 822d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik Texture* getTexture(const SkBitmap* bitmap); 8233b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 824107843de4507b3511006cb9c77b8d0364374385aTom Hudson bool reportAndClearDirty() { bool ret = mDirty; mDirty = false; return ret; } 825984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline Snapshot* writableSnapshot() { return mState.writableSnapshot(); } 826984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson inline const Snapshot* currentSnapshot() const { return mState.currentSnapshot(); } 827107843de4507b3511006cb9c77b8d0364374385aTom Hudson 8282b7028eabac80cec170572bc0e945a1d4224e595Romain Guy // State used to define the clipping region 8295f803623559aab395a29d575c37c4e39c23a4b4eChris Craik Rect mTilingClip; 83096885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy // Is the target render surface opaque 83196885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy bool mOpaque; 83296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy // Is a frame currently being rendered 83396885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy bool mFrameStarted; 8349d5316e3f56d138504565ff311145ac01621dff4Romain Guy 8353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy // Default UV mapper 8363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const UvMapper mUvMapper; 8373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 8388f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy // List of rectangles to clear after saveLayer() is invoked 83951d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::vector<Rect> mLayers; 84011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy // List of layers to update at the beginning of a frame 841272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck std::vector< sp<Layer> > mLayerUpdates; 84254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy 84387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in 84487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy // Properties.h 84587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy bool mScissorOptimizationDisabled; 84687e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy 847deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik bool mSkipOutlineClip; 848deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 849107843de4507b3511006cb9c77b8d0364374385aTom Hudson // True if anything has been drawn since the last call to 850107843de4507b3511006cb9c77b8d0364374385aTom Hudson // reportAndClearDirty() 851107843de4507b3511006cb9c77b8d0364374385aTom Hudson bool mDirty; 852107843de4507b3511006cb9c77b8d0364374385aTom Hudson 853058fc640017c90120c599d378a4cbc55668b05b7Chris Craik // Lighting + shadows 854058fc640017c90120c599d378a4cbc55668b05b7Chris Craik Vector3 mLightCenter; 855058fc640017c90120c599d378a4cbc55668b05b7Chris Craik float mLightRadius; 856058fc640017c90120c599d378a4cbc55668b05b7Chris Craik uint8_t mAmbientShadowAlpha; 857058fc640017c90120c599d378a4cbc55668b05b7Chris Craik uint8_t mSpotShadowAlpha; 858058fc640017c90120c599d378a4cbc55668b05b7Chris Craik 8594ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik // Paths kept alive for the duration of the frame 86051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::vector<std::unique_ptr<SkPath>> mTempPaths; 8614ac36f80beb958c77a92a3e1a235f6ed9daaa510Chris Craik 862ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson /** 863ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * Initial transform for a rendering pass; transform from global device 864ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * coordinates to the current RenderNode's drawing content coordinates, 865ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * with the RenderNode's RenderProperty transforms already applied. 866ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * Calling setMatrix(mBaseTransform) will result in drawing at the origin 867ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * of the DisplayList's recorded surface prior to any Canvas 868ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson * transformation. 869ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson */ 870ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson Matrix4 mBaseTransform; 871ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson 87296885eb480c5e0526fe2f77d30f6e551f3f3ceabRomain Guy friend class Layer; 873828407356dd5c34a3e441604aaf895cbec7c7e66Chris Craik friend class TextDrawFunctor; 87403c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy friend class DrawBitmapOp; 87503c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy friend class DrawPatchOp; 876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 877bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}; // class OpenGLRenderer 878e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 8799d5316e3f56d138504565ff311145ac01621dff4Romain Guy}; // namespace uirenderer 880e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy}; // namespace android 881e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 8825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_OPENGL_RENDERER_H 883