DisplayListCanvas.h revision 003cc3dec8e2a92e51086fbcd5ee1bb236efa701
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/* 223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Copyright (C) 2010 The Android Open Source Project 323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Licensed under the Apache License, Version 2.0 (the "License"); 523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * you may not use this file except in compliance with the License. 623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * You may obtain a copy of the License at 723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * http://www.apache.org/licenses/LICENSE-2.0 923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * 1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * Unless required by applicable law or agreed to in writing, software 1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * distributed under the License is distributed on an "AS IS" BASIS, 1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * See the License for the specific language governing permissions and 1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck * limitations under the License. 1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck */ 1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 1823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 19998a6d81896df8b662cc10ddeb35087b78b38d72John Reck 204f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <SkDrawFilter.h> 2123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <SkMatrix.h> 2223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <SkPaint.h> 233b20251a355c88193c439f928a84ae69483fb488John Reck#include <SkPath.h> 244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include <SkRegion.h> 25119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck#include <SkTLazy.h> 2623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cutils/compiler.h> 2719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 283b20251a355c88193c439f928a84ae69483fb488John Reck#include "Canvas.h" 2919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck#include "CanvasState.h" 304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#include "DisplayList.h" 3123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include "SkiaCanvasProxy.h" 3223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include "RenderNode.h" 33f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck#include "ResourceCache.h" 34f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 35f47a594f5250b1914c36423ee6b371f0b8db09d0John Recknamespace android { 3623b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace uirenderer { 3723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 3823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/////////////////////////////////////////////////////////////////////////////// 3923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// Defines 40119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck/////////////////////////////////////////////////////////////////////////////// 41119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck 423b20251a355c88193c439f928a84ae69483fb488John Reck// Debug 433b20251a355c88193c439f928a84ae69483fb488John Reck#if DEBUG_DISPLAY_LIST 444f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 451125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck#else 461125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck #define DISPLAY_LIST_LOGD(...) 474f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck#endif 483b20251a355c88193c439f928a84ae69483fb488John Reck 49e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/////////////////////////////////////////////////////////////////////////////// 50e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck// Display list 51119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck/////////////////////////////////////////////////////////////////////////////// 52443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck 5323b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass DeferredDisplayList; 5423b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass DeferredLayerUpdater; 5523b797ab5151eb2474f3bdd679f2f07bfd723042John Reckclass DisplayListOp; 5617035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass DrawOp; 57119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reckclass RenderNode; 58443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reckclass StateOp; 594f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 604f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck/** 6117035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck * Records drawing commands in a display list for later playback into an OpenGLRenderer. 6217035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reck */ 6317035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass ANDROID_API DisplayListCanvas: public Canvas, public CanvasStateClient { 6417035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckpublic: 65e2478d45ccbe5b6abb360ac9d44771b5f4a50bdeJohn Reck DisplayListCanvas(int width, int height); 664f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual ~DisplayListCanvas(); 674f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 684f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void reset(int width, int height); 694f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck __attribute__((warn_unused_result)) DisplayList* finishRecording(); 7023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 7123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// ---------------------------------------------------------------------------- 7223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// HWUI Canvas state operations 73a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck// ---------------------------------------------------------------------------- 74a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 75a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck void insertReorderBarrier(bool enableReorder); 7623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 773b20251a355c88193c439f928a84ae69483fb488John Reck// ---------------------------------------------------------------------------- 7823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// HWUI Canvas draw operations 7923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// ---------------------------------------------------------------------------- 8023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 8123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck // Shapes 823b20251a355c88193c439f928a84ae69483fb488John Reck void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 8323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 8423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 8523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck CanvasPropertyPaint* paint); 861125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 871125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint); 884f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 89dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck 90368cdd85268999997fb495cf90c4417221797de0John Reck// ---------------------------------------------------------------------------- 91368cdd85268999997fb495cf90c4417221797de0John Reck// HWUI Canvas draw operations - special 924f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// ---------------------------------------------------------------------------- 934f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void drawLayer(DeferredLayerUpdater* layerHandle); 944f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void drawRenderNode(RenderNode* renderNode); 954f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 962cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5eaJohn Reck // TODO: rename for consistency 972cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5eaJohn Reck void callDrawGLFunction(Functor* functor); 982cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5eaJohn Reck 994f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// ---------------------------------------------------------------------------- 1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// CanvasStateClient interface 1014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// ---------------------------------------------------------------------------- 102f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck virtual void onViewportInitialized() override { } 103f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override { } 104f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck virtual GLuint getTargetFbo() const override { return -1; } 105dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck 1064f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// ---------------------------------------------------------------------------- 1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// android/graphics/Canvas interface 1081125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck// ---------------------------------------------------------------------------- 1091125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck virtual SkCanvas* asSkCanvas() override; 1101125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck 1111125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck virtual void setBitmap(const SkBitmap& bitmap) override { 112a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck LOG_ALWAYS_FATAL("DisplayListCanvas is not backed by a bitmap."); 1134f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 1142cdbc7d2283aae3d77b12c8fdbba8ca4bd3db5eaJohn Reck 1153b20251a355c88193c439f928a84ae69483fb488John Reck virtual bool isOpaque() override { return false; } 1164f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual int width() override { return mState.getWidth(); } 1174f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual int height() override { return mState.getHeight(); } 1184f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 1194f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual void setHighContrastText(bool highContrastText) override { 120a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck mHighContrastText = highContrastText; 1214f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck } 122f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck virtual bool isHighContrastText() override { return mHighContrastText; } 123f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck 124a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck// ---------------------------------------------------------------------------- 1251661715d4066a557ab0877271d62762579a38fa9John Reck// android/graphics/Canvas state operations 1264f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck// ---------------------------------------------------------------------------- 1274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // Save (layer) 128284b24358410cb0200e525a5ba36994090c83f20Chris Craik virtual int getSaveCount() const override { return mState.getSaveCount(); } 129058fc640017c90120c599d378a4cbc55668b05b7Chris Craik virtual int save(SkCanvas::SaveFlags flags) override; 130058fc640017c90120c599d378a4cbc55668b05b7Chris Craik virtual void restore() override; 1314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual void restoreToCount(int saveCount) override; 132058fc640017c90120c599d378a4cbc55668b05b7Chris Craik 1334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, 1344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck SkCanvas::SaveFlags flags) override; 13563a06673253914510bbeebd500655008682dade1John Reck virtual int saveLayerAlpha(float left, float top, float right, float bottom, 13663a06673253914510bbeebd500655008682dade1John Reck int alpha, SkCanvas::SaveFlags flags) override { 13763a06673253914510bbeebd500655008682dade1John Reck SkPaint paint; 13863a06673253914510bbeebd500655008682dade1John Reck paint.setAlpha(alpha); 139860d155f866cc15a725e7ce03763280987f24901John Reck return saveLayer(left, top, right, bottom, &paint, flags); 140dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck } 141dbc9a86d05e5e835051de22f6cb30ec1921e9705John Reck 1423b20251a355c88193c439f928a84ae69483fb488John Reck // Matrix 143860d155f866cc15a725e7ce03763280987f24901John Reck virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); } 144860d155f866cc15a725e7ce03763280987f24901John Reck virtual void setMatrix(const SkMatrix& matrix) override; 14568bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck 14668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck virtual void concat(const SkMatrix& matrix) override; 147d72e0a339b54af0c4e731513bbad120dff694723John Reck virtual void rotate(float degrees) override; 148d72e0a339b54af0c4e731513bbad120dff694723John Reck virtual void scale(float sx, float sy) override; 149d72e0a339b54af0c4e731513bbad120dff694723John Reck virtual void skew(float sx, float sy) override; 15019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck virtual void translate(float dx, float dy) override; 15119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 15219b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // Clip 153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual bool getClipBounds(SkRect* outRect) const override; 154f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck virtual bool quickRejectRect(float left, float top, float right, float bottom) const override; 15518f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck virtual bool quickRejectPath(const SkPath& path) const override; 156e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 15725fbb3fa1138675379102a44405852555cefccbdJohn Reck virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) override; 158998a6d81896df8b662cc10ddeb35087b78b38d72John Reck virtual bool clipPath(const SkPath* path, SkRegion::Op op) override; 159998a6d81896df8b662cc10ddeb35087b78b38d72John Reck virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) override; 160998a6d81896df8b662cc10ddeb35087b78b38d72John Reck 161ec845a215e343cdb3b2e4c7b6aff7b24beb0236bJohn Reck // Misc 162e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual SkDrawFilter* getDrawFilter() override { return mDrawFilter.get(); } 163119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck virtual void setDrawFilter(SkDrawFilter* filter) override; 164e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 165998a6d81896df8b662cc10ddeb35087b78b38d72John Reck// ---------------------------------------------------------------------------- 166998a6d81896df8b662cc10ddeb35087b78b38d72John Reck// android/graphics/Canvas draw operations 167998a6d81896df8b662cc10ddeb35087b78b38d72John Reck// ---------------------------------------------------------------------------- 168998a6d81896df8b662cc10ddeb35087b78b38d72John Reck virtual void drawColor(int color, SkXfermode::Mode mode) override; 169aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck virtual void drawPaint(const SkPaint& paint) override; 170aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck 171aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck // Geometry 172aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck virtual void drawPoint(float x, float y, const SkPaint& paint) override { 173aa95a88327d9a3ac8a4a00b065b78ac0f28b3a19John Reck float points[2] = { x, y }; 174a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck drawPoints(points, 2, paint); 175a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 176a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck virtual void drawPoints(const float* points, int count, const SkPaint& paint) override; 177a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck virtual void drawLine(float startX, float startY, float stopX, float stopY, 178a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck const SkPaint& paint) override { 179a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck float points[4] = { startX, startY, stopX, stopY }; 180a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck drawLines(points, 4, paint); 181a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 182a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck virtual void drawLines(const float* points, int count, const SkPaint& paint) override; 183cd028f336e36b22dbe8cf623eb5bd2361314495cJohn Reck virtual void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override; 184f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override; 185f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck virtual void drawRoundRect(float left, float top, float right, float bottom, 186f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck float rx, float ry, const SkPaint& paint) override; 187f9be77940e365036fecd8cc0e491e8545c34e79bJohn Reck virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override; 188e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void drawOval(float left, float top, float right, float bottom, const SkPaint& paint) override; 189e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck virtual void drawArc(float left, float top, float right, float bottom, 190e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) override; 191f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck virtual void drawPath(const SkPath& path, const SkPaint& paint) override; 192f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount, 193f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck const float* verts, const float* tex, const int* colors, 194f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck const uint16_t* indices, int indexCount, const SkPaint& paint) override 195a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck { /* DisplayListCanvas does not support drawVertices(); ignore */ } 196a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck 197a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck // Bitmap-based 198a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck virtual void drawBitmap(const SkBitmap& bitmap, float left, float top, const SkPaint* paint) override; 199a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck virtual void drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 200e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck const SkPaint* paint) override; 2014f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual void drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 202a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik float srcRight, float srcBottom, float dstLeft, float dstTop, 2034f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck float dstRight, float dstBottom, const SkPaint* paint) override; 204fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 205fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck const float* vertices, const int* colors, const SkPaint* paint) override; 206e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck virtual void drawNinePatch(const SkBitmap& bitmap, const android::Res_png_9patch& chunk, 207e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck float dstLeft, float dstTop, float dstRight, float dstBottom, 208e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck const SkPaint* paint) override; 2094f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2103b20251a355c88193c439f928a84ae69483fb488John Reck // Text 2114f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck virtual void drawText(const uint16_t* glyphs, const float* positions, int count, 2124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck const SkPaint& paint, float x, float y, float boundsLeft, float boundsTop, 213e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck float boundsRight, float boundsBottom, float totalAdvance) override; 2141125d1fa92ab9f3b8315bbfb72e038b62dfd454bJohn Reck virtual void drawPosText(const uint16_t* text, const float* positions, int count, 215e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck int posCount, const SkPaint& paint) override; 216fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck virtual void drawTextOnPath(const uint16_t* glyphs, int count, const SkPath& path, 2175cdb8f998c58a2226112b36e4c391866346e5e17John Reck float hOffset, float vOffset, const SkPaint& paint) override; 2180a97330b98dd633b58dcfff405d94476c89e867dJohn Reck virtual bool drawTextAbsolutePos() const override { return false; } 2190a97330b98dd633b58dcfff405d94476c89e867dJohn Reck 2200a97330b98dd633b58dcfff405d94476c89e867dJohn Reck 2210a97330b98dd633b58dcfff405d94476c89e867dJohn Reckprivate: 222e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 2234f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck CanvasState mState; 2244f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck std::unique_ptr<SkiaCanvasProxy> mSkiaCanvasProxy; 2254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 226e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck enum DeferredBarrierType { 227e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck kBarrier_None, 228e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck kBarrier_InOrder, 2294f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck kBarrier_OutOfOrder, 2304f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck }; 2314f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 2334f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void drawRects(const float* rects, int count, const SkPaint* paint); 234a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik 2354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void flushRestoreToCount(); 236fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck void flushTranslate(); 2374f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck void flushReorderBarrier(); 2384f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck 2394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck LinearAllocator& alloc() { return mDisplayList->allocator; } 240fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 241fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck // Each method returns final index of op 2424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck size_t addOpAndUpdateChunk(DisplayListOp* op); 2434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck // flushes any deferred operations, and appends the op 2440e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck size_t flushAndAddOp(DisplayListOp* op); 2450e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck 24623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck size_t addStateOp(StateOp* op); 247fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck size_t addDrawOp(DrawOp* op); 248fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck size_t addRenderNodeOp(DrawRenderNodeOp* op); 24923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 25023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck void refBitmapsInShader(const SkShader* shader); 251e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 25218f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck template<class T> 253368cdd85268999997fb495cf90c4417221797de0John Reck inline const T* refBuffer(const T* srcBuffer, int32_t count) { 254368cdd85268999997fb495cf90c4417221797de0John Reck if (!srcBuffer) return nullptr; 255368cdd85268999997fb495cf90c4417221797de0John Reck 256368cdd85268999997fb495cf90c4417221797de0John Reck T* dstBuffer = (T*) mDisplayList->allocator.alloc(count * sizeof(T)); 257e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 258e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return dstBuffer; 259fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck } 260fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck 2613b20251a355c88193c439f928a84ae69483fb488John Reck inline char* refText(const char* text, size_t byteLength) { 262e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 263a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck } 264e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck 265a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck inline const SkPath* refPath(const SkPath* path) { 266e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck if (!path) return nullptr; 267e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck 2683b20251a355c88193c439f928a84ae69483fb488John Reck // The points/verbs within the path are refcounted so this copy operation 269d3d8dafc2f61fb118c060720b52684c59303f3dbJohn Reck // is inexpensive and maintains the generationID of the original path. 2700d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck const SkPath* cachedPath = new SkPath(*path); 2713b20251a355c88193c439f928a84ae69483fb488John Reck mDisplayList->pathResources.push_back(cachedPath); 2723b20251a355c88193c439f928a84ae69483fb488John Reck return cachedPath; 2730d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck } 2740d1f634f4b5e1bb37aa51777efb6a68619488d01John Reck 2756f07a0dc875a9eac67312085a8e0133b9e2f4771John Reck inline const SkPaint* refPaint(const SkPaint* paint) { 2763b20251a355c88193c439f928a84ae69483fb488John Reck if (!paint) return nullptr; 27723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck 27823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck // If there is a draw filter apply it here and store the modified paint 279998a6d81896df8b662cc10ddeb35087b78b38d72John Reck // so that we don't need to modify the paint every time we access it. 280998a6d81896df8b662cc10ddeb35087b78b38d72John Reck SkTLazy<SkPaint> filteredPaint; 281998a6d81896df8b662cc10ddeb35087b78b38d72John Reck if (mDrawFilter.get()) { 282998a6d81896df8b662cc10ddeb35087b78b38d72John Reck filteredPaint.set(*paint); 283998a6d81896df8b662cc10ddeb35087b78b38d72John Reck mDrawFilter->filter(filteredPaint.get(), SkDrawFilter::kPaint_Type); 284998a6d81896df8b662cc10ddeb35087b78b38d72John Reck paint = filteredPaint.get(); 285998a6d81896df8b662cc10ddeb35087b78b38d72John Reck } 286998a6d81896df8b662cc10ddeb35087b78b38d72John Reck 287998a6d81896df8b662cc10ddeb35087b78b38d72John Reck // compute the hash key for the paint and check the cache. 288998a6d81896df8b662cc10ddeb35087b78b38d72John Reck const uint32_t key = paint->getHash(); 289998a6d81896df8b662cc10ddeb35087b78b38d72John Reck const SkPaint* cachedPaint = mPaintMap.valueFor(key); 290998a6d81896df8b662cc10ddeb35087b78b38d72John Reck // In the unlikely event that 2 unique paints have the same hash we do a 291998a6d81896df8b662cc10ddeb35087b78b38d72John Reck // object equality check to ensure we don't erroneously dedup them. 292998a6d81896df8b662cc10ddeb35087b78b38d72John Reck if (cachedPaint == nullptr || *cachedPaint != *paint) { 293998a6d81896df8b662cc10ddeb35087b78b38d72John Reck cachedPaint = new SkPaint(*paint); 294998a6d81896df8b662cc10ddeb35087b78b38d72John Reck std::unique_ptr<const SkPaint> copy(cachedPaint); 295998a6d81896df8b662cc10ddeb35087b78b38d72John Reck mDisplayList->paints.push_back(std::move(copy)); 296998a6d81896df8b662cc10ddeb35087b78b38d72John Reck 297998a6d81896df8b662cc10ddeb35087b78b38d72John Reck // replaceValueFor() performs an add if the entry doesn't exist 298998a6d81896df8b662cc10ddeb35087b78b38d72John Reck mPaintMap.replaceValueFor(key, cachedPaint); 2993e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck refBitmapsInShader(cachedPaint->getShader()); 3003e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck } 3013e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 3023e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck return cachedPaint; 3033e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck } 3043e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 3053e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck inline const SkRegion* refRegion(const SkRegion* region) { 3063e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck if (!region) { 3073e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck return region; 3083e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck } 3093e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 3103e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck const SkRegion* cachedRegion = mRegionMap.valueFor(region); 3119eb9f6f8cbbbd87d45da8071aa54cb066a797723John Reck // TODO: Add generation ID to SkRegion 3123e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck if (cachedRegion == nullptr) { 3133e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck std::unique_ptr<const SkRegion> copy(new SkRegion(*region)); 3143e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck cachedRegion = copy.get(); 3153e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck mDisplayList->regions.push_back(std::move(copy)); 3163e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 3173e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck // replaceValueFor() performs an add if the entry doesn't exist 3183e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck mRegionMap.replaceValueFor(region, cachedRegion); 319443a714fa7c0dd07fee3527cc5bc3d3ca1fb7d44John Reck } 3203e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck 321998a6d81896df8b662cc10ddeb35087b78b38d72John Reck return cachedRegion; 322998a6d81896df8b662cc10ddeb35087b78b38d72John Reck } 323998a6d81896df8b662cc10ddeb35087b78b38d72John Reck 3243e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck inline const SkBitmap* refBitmap(const SkBitmap& bitmap) { 3253e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck // Note that this assumes the bitmap is immutable. There are cases this won't handle 32619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // correctly, such as creating the bitmap from scratch, drawing with it, changing its 32719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck // contents, and drawing again. The only fix would be to always copy it the first time, 32868bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck // which doesn't seem worth the extra cycles for this unlikely case. 3293b20251a355c88193c439f928a84ae69483fb488John Reck SkBitmap* localBitmap = new (alloc()) SkBitmap(bitmap); 33019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck alloc().autoDestroy(localBitmap); 33119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck mDisplayList->bitmapResources.push_back(localBitmap); 332f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck return localBitmap; 333f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck } 3343b20251a355c88193c439f928a84ae69483fb488John Reck 335e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { 336dff9957cc22a1174a4cf91de6609c50934d29434John Reck mDisplayList->patchResources.push_back(patch); 337dcba6725e8b9d3eba9ad7a01258d6aa974feafbaJohn Reck mResourceCache.incrementRefcount(patch); 338f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck return patch; 339f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck } 340f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 341f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck DefaultKeyedVector<uint32_t, const SkPaint*> mPaintMap; 342f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap; 343f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap; 344f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck 345f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck ResourceCache& mResourceCache; 346786afcb3eec18315ec54987a08814ff28f13d09fJorim Jaggi DisplayList* mDisplayList; 3473c2b7fa8c584c5ed56f1bd6ad53f2e87f0a6eb44John Reck 348f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck float mTranslateX; 349f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck float mTranslateY; 350f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck bool mHasDeferredTranslate; 351f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck DeferredBarrierType mDeferredBarrierType; 352f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck bool mHighContrastText; 353e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 354e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck int mRestoreSaveCount; 355e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck 356fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck SkAutoTUnref<SkDrawFilter> mDrawFilter; 35719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 35819b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck friend class RenderNode; 35919b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck 36019b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck}; // class DisplayListCanvas 3611949e7928eeec22cd3f74b5f763a4eb433238453John Reck 362f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck}; // namespace uirenderer 3633b20251a355c88193c439f928a84ae69483fb488John Reck}; // namespace android 3641949e7928eeec22cd3f74b5f763a4eb433238453John Reck 3651949e7928eeec22cd3f74b5f763a4eb433238453John Reck#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 36619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck