DisplayListCanvas.h revision 8d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
209fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "Canvas.h"
219fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "CanvasState.h"
229fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "DisplayList.h"
239fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "RenderNode.h"
249fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "ResourceCache.h"
259fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "SkiaCanvasProxy.h"
269fded232a9548a304e0145011df8849fba0dcda7Chris Craik#include "utils/Macros.h"
279fded232a9548a304e0145011df8849fba0dcda7Chris Craik
2809c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger#include <SkDrawFilter.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
322dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkRegion.h>
3309c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger#include <SkTLazy.h>
347953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
357953745dd565167113f8cbfc461bc0521d32d870Romain Guy
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
51b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList;
5512f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reckclass DeferredLayerUpdater;
562af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp;
572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp;
588d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craikclass DrawRenderNodeOp;
592dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass RenderNode;
602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp;
612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
63d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer.
64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
65db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikclass ANDROID_API DisplayListCanvas: public Canvas, public CanvasStateClient {
66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
67cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    DisplayListCanvas(int width, int height);
68db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik    virtual ~DisplayListCanvas();
69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
70cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    void reset(int width, int height);
719fded232a9548a304e0145011df8849fba0dcda7Chris Craik    WARN_UNUSED_RESULT DisplayList* finishRecording();
725977baa1fa24125c148a72699b53e62abaf08960Chet Haase
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
748dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas state operations
7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
76984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson
77cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger    void insertReorderBarrier(bool enableReorder);
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7914e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
808dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas draw operations
8114e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
8314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Shapes
848dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
85072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom,
86072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry,
87072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPaint* paint);
888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
8952244fff29042926e21fa897ef5ab11148e35299John Reck                CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint);
9014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
938dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas draw operations - special
9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
953aadd60521960be063ee06208562ccb63dc414e3Chris Craik    void drawLayer(DeferredLayerUpdater* layerHandle);
96956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik    void drawRenderNode(RenderNode* renderNode);
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // TODO: rename for consistency
99956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik    void callDrawGLFunction(Functor* functor);
1005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
101984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson// ----------------------------------------------------------------------------
1028dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// CanvasStateClient interface
103984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson// ----------------------------------------------------------------------------
104e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik    virtual void onViewportInitialized() override { }
105e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik    virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override { }
1066b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik    virtual GLuint getTargetFbo() const override { return -1; }
107984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson
1088dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
1098dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas interface
1108dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
1111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    virtual SkCanvas* asSkCanvas() override;
1121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
113c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck    virtual void setBitmap(const SkBitmap& bitmap) override {
114db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik        LOG_ALWAYS_FATAL("DisplayListCanvas is not backed by a bitmap.");
1158dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    }
1168dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
117d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool isOpaque() override { return false; }
118d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual int width() override { return mState.getWidth(); }
119d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual int height() override { return mState.getHeight(); }
1208dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1216578a989566e585eee053095dc80e2552e125db2Derek Sollenberger    virtual void setHighContrastText(bool highContrastText) override {
1226578a989566e585eee053095dc80e2552e125db2Derek Sollenberger        mHighContrastText = highContrastText;
1236578a989566e585eee053095dc80e2552e125db2Derek Sollenberger    }
1246578a989566e585eee053095dc80e2552e125db2Derek Sollenberger    virtual bool isHighContrastText() override { return mHighContrastText; }
1256578a989566e585eee053095dc80e2552e125db2Derek Sollenberger
1268dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
1278dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas state operations
1288dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
1298dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Save (layer)
130d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual int getSaveCount() const override { return mState.getSaveCount(); }
131d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual int save(SkCanvas::SaveFlags flags) override;
132d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void restore() override;
133d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void restoreToCount(int saveCount) override;
1348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint,
136d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik        SkCanvas::SaveFlags flags) override;
1378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
138d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            int alpha, SkCanvas::SaveFlags flags) override {
1398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        SkPaint paint;
1408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        paint.setAlpha(alpha);
1418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        return saveLayer(left, top, right, bottom, &paint, flags);
1428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    }
1438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Matrix
145d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); }
146d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void setMatrix(const SkMatrix& matrix) override;
1478dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
148d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void concat(const SkMatrix& matrix) override;
149d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void rotate(float degrees) override;
150d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void scale(float sx, float sy) override;
151d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void skew(float sx, float sy) override;
152d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void translate(float dx, float dy) override;
1538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1548dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Clip
155d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool getClipBounds(SkRect* outRect) const override;
156d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool quickRejectRect(float left, float top, float right, float bottom) const override;
157d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool quickRejectPath(const SkPath& path) const override;
1588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
159d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) override;
160d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op) override;
161d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) override;
1628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1638dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Misc
164d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual SkDrawFilter* getDrawFilter() override { return mDrawFilter.get(); }
165d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void setDrawFilter(SkDrawFilter* filter) override;
1668dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1678dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
1688dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas draw operations
1698dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ----------------------------------------------------------------------------
170d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawColor(int color, SkXfermode::Mode mode) override;
171d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawPaint(const SkPaint& paint) override;
1728dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1738dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Geometry
174d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawPoint(float x, float y, const SkPaint& paint) override {
1758dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        float points[2] = { x, y };
1768dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        drawPoints(points, 2, paint);
1778dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    }
178d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawPoints(const float* points, int count, const SkPaint& paint) override;
1798dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawLine(float startX, float startY, float stopX, float stopY,
180d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            const SkPaint& paint) override {
1818dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        float points[4] = { startX, startY, stopX, stopY };
1828dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson        drawLines(points, 4, paint);
1838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    }
184d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawLines(const float* points, int count, const SkPaint& paint) override;
185d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override;
18694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger    virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override;
1878dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawRoundRect(float left, float top, float right, float bottom,
188d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            float rx, float ry, const SkPaint& paint) override;
189d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override;
190d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawOval(float left, float top, float right, float bottom, const SkPaint& paint) override;
1918dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawArc(float left, float top, float right, float bottom,
192d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) override;
193d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawPath(const SkPath& path, const SkPaint& paint) override;
1948dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount,
1958dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson            const float* verts, const float* tex, const int* colors,
196d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            const uint16_t* indices, int indexCount, const SkPaint& paint) override
197db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik        { /* DisplayListCanvas does not support drawVertices(); ignore */ }
1988dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
1998dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Bitmap-based
200d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual void drawBitmap(const SkBitmap& bitmap, float left, float top, const SkPaint* paint) override;
2018dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix,
202d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik                            const SkPaint* paint) override;
2038dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop,
2048dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson            float srcRight, float srcBottom, float dstLeft, float dstTop,
205d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            float dstRight, float dstBottom, const SkPaint* paint) override;
2068dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight,
207d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            const float* vertices, const int* colors, const SkPaint* paint) override;
2084c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger    virtual void drawNinePatch(const SkBitmap& bitmap, const android::Res_png_9patch& chunk,
2094c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger            float dstLeft, float dstTop, float dstRight, float dstBottom,
2104c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger            const SkPaint* paint) override;
2118dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
2128dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    // Text
2138dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawText(const uint16_t* glyphs, const float* positions, int count,
2148dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson            const SkPaint& paint, float x, float y, float boundsLeft, float boundsTop,
215d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            float boundsRight, float boundsBottom, float totalAdvance) override;
2168dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson    virtual void drawTextOnPath(const uint16_t* glyphs, int count, const SkPath& path,
217d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik            float hOffset, float vOffset, const SkPaint& paint) override;
218d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual bool drawTextAbsolutePos() const override { return false; }
2198dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
2208dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
222984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson
223984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson    CanvasState mState;
2241db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    std::unique_ptr<SkiaCanvasProxy> mSkiaCanvasProxy;
225984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson
2268afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    enum DeferredBarrierType {
2278afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_None,
2288afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_InOrder,
2298afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_OutOfOrder,
2308afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    };
2318afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
23294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger    void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint);
23394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger    void drawRects(const float* rects, int count, const SkPaint* paint);
23494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger
2358afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushRestoreToCount();
2368afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushTranslate();
2378afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushReorderBarrier();
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
239003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    LinearAllocator& alloc() { return mDisplayList->allocator; }
240b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik
241b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik    // Each method returns final index of op
2428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addOpAndUpdateChunk(DisplayListOp* op);
2438afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    // flushes any deferred operations, and appends the op
2448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t flushAndAddOp(DisplayListOp* op);
2458afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
2468afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addStateOp(StateOp* op);
2478afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addDrawOp(DrawOp* op);
2488afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addRenderNodeOp(DrawRenderNodeOp* op);
2498afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
25037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck    void refBitmapsInShader(const SkShader* shader);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    template<class T>
253d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const T* refBuffer(const T* srcBuffer, int32_t count) {
254e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik        if (!srcBuffer) return nullptr;
255d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
256003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        T* dstBuffer = (T*) mDisplayList->allocator.alloc(count * sizeof(T));
2572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        memcpy(dstBuffer, srcBuffer, count * sizeof(T));
2582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return dstBuffer;
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    inline char* refText(const char* text, size_t byteLength) {
2622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength);
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
265d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPath* refPath(const SkPath* path) {
266e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik        if (!path) return nullptr;
2672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
268ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger        // The points/verbs within the path are refcounted so this copy operation
269ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger        // is inexpensive and maintains the generationID of the original path.
270ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger        const SkPath* cachedPath = new SkPath(*path);
271003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        mDisplayList->pathResources.push_back(cachedPath);
27251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik        return cachedPath;
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
275d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPaint* refPaint(const SkPaint* paint) {
276e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik        if (!paint) return nullptr;
2770fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
27809c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        // If there is a draw filter apply it here and store the modified paint
27909c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        // so that we don't need to modify the paint every time we access it.
280da3198a550bdd91ccdc8a09c3a6e00d3b61c0c20Chris Craik        SkTLazy<SkPaint> filteredPaint;
28109c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        if (mDrawFilter.get()) {
2820b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger            filteredPaint.set(*paint);
28351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            mDrawFilter->filter(filteredPaint.get(), SkDrawFilter::kPaint_Type);
2840b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger            paint = filteredPaint.get();
28509c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        }
28609c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger
28709c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        // compute the hash key for the paint and check the cache.
28809c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        const uint32_t key = paint->getHash();
28909c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        const SkPaint* cachedPaint = mPaintMap.valueFor(key);
29009c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        // In the unlikely event that 2 unique paints have the same hash we do a
29109c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        // object equality check to ensure we don't erroneously dedup them.
292e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik        if (cachedPaint == nullptr || *cachedPaint != *paint) {
29351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            cachedPaint = new SkPaint(*paint);
29451d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            std::unique_ptr<const SkPaint> copy(cachedPaint);
295003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik            mDisplayList->paints.push_back(std::move(copy));
29651d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik
29796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
29809c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger            mPaintMap.replaceValueFor(key, cachedPaint);
29937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck            refBitmapsInShader(cachedPaint->getShader());
300d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
30209c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger        return cachedPaint;
3030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
3040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
305d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkRegion* refRegion(const SkRegion* region) {
306735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        if (!region) {
307735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            return region;
308735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
309735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
31051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik        const SkRegion* cachedRegion = mRegionMap.valueFor(region);
311735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        // TODO: Add generation ID to SkRegion
31251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik        if (cachedRegion == nullptr) {
31351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            std::unique_ptr<const SkRegion> copy(new SkRegion(*region));
31451d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            cachedRegion = copy.get();
315003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik            mDisplayList->regions.push_back(std::move(copy));
31651d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik
317735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            // replaceValueFor() performs an add if the entry doesn't exist
31851d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik            mRegionMap.replaceValueFor(region, cachedRegion);
319735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
320735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
32151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik        return cachedRegion;
322735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    }
323735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
3247c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck    inline const SkBitmap* refBitmap(const SkBitmap& bitmap) {
325d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
326d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
327d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
328d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
32998ae4dfbbc2bf5d61786674dd75127eb4ca238e9John Reck        SkBitmap* localBitmap = new (alloc()) SkBitmap(bitmap);
330e75ab4c26a4f661334845f7bc4132011694836a4John Reck        alloc().autoDestroy(localBitmap);
331003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        mDisplayList->bitmapResources.push_back(localBitmap);
332e75ab4c26a4f661334845f7bc4132011694836a4John Reck        return localBitmap;
33349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
33449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
335d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
336003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik        mDisplayList->patchResources.push_back(patch);
337a35778c799e8073a42b9e22191bde9d838327ab7John Reck        mResourceCache.incrementRefcount(patch);
338e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        return patch;
339e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
340e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
34109c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger    DefaultKeyedVector<uint32_t, const SkPaint*> mPaintMap;
342d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap;
343d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap;
34424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
345a35778c799e8073a42b9e22191bde9d838327ab7John Reck    ResourceCache& mResourceCache;
346003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik    DisplayList* mDisplayList;
34758ecc204fbcacef34806290492384677a330d4d4Romain Guy
34833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
34933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
3508afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    bool mHasDeferredTranslate;
3518afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    DeferredBarrierType mDeferredBarrierType;
352cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    bool mHighContrastText;
35354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
354eea6ef9c767c734797912022113191dd255c4ae6Chris Craik    int mRestoreSaveCount;
355eea6ef9c767c734797912022113191dd255c4ae6Chris Craik
35609c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger    SkAutoTUnref<SkDrawFilter> mDrawFilter;
35709c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger
358e18264b079481a244b30e3f71012c53bbd861f92John Reck    friend class RenderNode;
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
360db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik}; // class DisplayListCanvas
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
366