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