DisplayListCanvas.h revision e75ab4c26a4f661334845f7bc4132011694836a4
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 2009c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger#include <SkDrawFilter.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 242dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkRegion.h> 2509c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger#include <SkTLazy.h> 267953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 277953745dd565167113f8cbfc461bc0521d32d870Romain Guy 28849911a9c4315fc552faa38516c842b2541b1909John Reck#include "Canvas.h" 29984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson#include "CanvasState.h" 302dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include "DisplayList.h" 311db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include "SkiaCanvasProxy.h" 32984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson#include "RenderNode.h" 33a35778c799e8073a42b9e22191bde9d838327ab7John Reck#include "ResourceCache.h" 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 50b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList; 5412f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reckclass DeferredLayerUpdater; 552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp; 562af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp; 572dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass RenderNode; 582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp; 592af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 61d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer. 62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 63db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikclass ANDROID_API DisplayListCanvas: public Canvas, public CanvasStateClient { 64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 65db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik DisplayListCanvas(); 66db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik virtual ~DisplayListCanvas(); 67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 688afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void insertReorderBarrier(bool enableReorder); 698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 703b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListData* finishRecording(); 715977baa1fa24125c148a72699b53e62abaf08960Chet Haase 7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 738dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Frame state operations 7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 758dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 768dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void prepareDirty(float left, float top, float right, float bottom); 778dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void prepare() { prepareDirty(0.0f, 0.0f, width(), height()); } 788dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bool finish(); 798dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void interrupt(); 808dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void resume(); 81daf98e941e140e8739458126640183b9f296a2abChet Haase 8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas state operations 8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 85984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 868dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void setViewport(int width, int height) { mState.setViewport(width, height); } 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 88984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson const Rect& getRenderTargetClipBounds() const { return mState.getRenderTargetClipBounds(); } 8914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 903b20251a355c88193c439f928a84ae69483fb488John Reck bool isCurrentTransformSimple() { 91984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.currentTransform()->isSimple(); 923b20251a355c88193c439f928a84ae69483fb488John Reck } 933b20251a355c88193c439f928a84ae69483fb488John Reck 9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 958dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas draw operations 9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Bitmap-based 998dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 1008dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // TODO: move drawPatch() to Canvas.h 1017c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck void drawPatch(const SkBitmap& bitmap, const Res_png_9patch* patch, 1028dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float left, float top, float right, float bottom, const SkPaint* paint); 10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 10414e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Shapes 1058dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void drawRects(const float* rects, int count, const SkPaint* paint); 1068dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 107072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 108072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 109072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paint); 1108dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 11152244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint); 11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 1158dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// HWUI Canvas draw operations - special 11614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 1178dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson void drawLayer(DeferredLayerUpdater* layerHandle, float x, float y); 118956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik void drawRenderNode(RenderNode* renderNode); 1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12014e513058ed4168c94e015638d16f5f87fd8063aChris Craik // TODO: rename for consistency 121956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craik void callDrawGLFunction(Functor* functor); 1225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 123cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik void setHighContrastText(bool highContrastText) { 124cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik mHighContrastText = highContrastText; 125cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 126984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 127984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson// ---------------------------------------------------------------------------- 1288dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// CanvasStateClient interface 129984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson// ---------------------------------------------------------------------------- 130e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onViewportInitialized() override { } 131e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik virtual void onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) override { } 1326b109c74982033d4a220cd10a0eab8b024b351c9Chris Craik virtual GLuint getTargetFbo() const override { return -1; } 133984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 1348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 1358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas interface 1368dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 1371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger virtual SkCanvas* asSkCanvas() override; 1381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 139c1b33d665c8caf5760f68c45c6ca0baa649b832aJohn Reck virtual void setBitmap(const SkBitmap& bitmap) override { 140db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik LOG_ALWAYS_FATAL("DisplayListCanvas is not backed by a bitmap."); 1418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 1428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 143d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool isOpaque() override { return false; } 144d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual int width() override { return mState.getWidth(); } 145d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual int height() override { return mState.getHeight(); } 1468dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1478dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 1488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas state operations 1498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 1508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Save (layer) 151d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual int getSaveCount() const override { return mState.getSaveCount(); } 152d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual int save(SkCanvas::SaveFlags flags) override; 153d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void restore() override; 154d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void restoreToCount(int saveCount) override; 1558dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1568dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, 157d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik SkCanvas::SaveFlags flags) override; 1588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual int saveLayerAlpha(float left, float top, float right, float bottom, 159d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik int alpha, SkCanvas::SaveFlags flags) override { 1608dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkPaint paint; 1618dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson paint.setAlpha(alpha); 1628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return saveLayer(left, top, right, bottom, &paint, flags); 1638dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 1648dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1658dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Matrix 166d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); } 167d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void setMatrix(const SkMatrix& matrix) override; 1688dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 169d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void concat(const SkMatrix& matrix) override; 170d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void rotate(float degrees) override; 171d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void scale(float sx, float sy) override; 172d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void skew(float sx, float sy) override; 173d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void translate(float dx, float dy) override; 1748dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1758dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Clip 176d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool getClipBounds(SkRect* outRect) const override; 177d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool quickRejectRect(float left, float top, float right, float bottom) const override; 178d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool quickRejectPath(const SkPath& path) const override; 1798dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 180d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) override; 181d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool clipPath(const SkPath* path, SkRegion::Op op) override; 182d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) override; 1838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1848dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Misc 185d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual SkDrawFilter* getDrawFilter() override { return mDrawFilter.get(); } 186d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void setDrawFilter(SkDrawFilter* filter) override; 1878dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 1898dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// android/graphics/Canvas draw operations 1908dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson// ---------------------------------------------------------------------------- 191d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawColor(int color, SkXfermode::Mode mode) override; 192d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawPaint(const SkPaint& paint) override; 1938dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1948dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Geometry 195d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawPoint(float x, float y, const SkPaint& paint) override { 1968dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float points[2] = { x, y }; 1978dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawPoints(points, 2, paint); 1988dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 199d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawPoints(const float* points, int count, const SkPaint& paint) override; 2008dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawLine(float startX, float startY, float stopX, float stopY, 201d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik const SkPaint& paint) override { 2028dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float points[4] = { startX, startY, stopX, stopY }; 2038dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawLines(points, 4, paint); 2048dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 205d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawLines(const float* points, int count, const SkPaint& paint) override; 206d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawRect(float left, float top, float right, float bottom, const SkPaint& paint) override; 2078dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawRoundRect(float left, float top, float right, float bottom, 208d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik float rx, float ry, const SkPaint& paint) override; 209d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override; 210d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawOval(float left, float top, float right, float bottom, const SkPaint& paint) override; 2118dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawArc(float left, float top, float right, float bottom, 212d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) override; 213d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawPath(const SkPath& path, const SkPaint& paint) override; 2148dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount, 2158dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const float* verts, const float* tex, const int* colors, 216d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik const uint16_t* indices, int indexCount, const SkPaint& paint) override 217db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik { /* DisplayListCanvas does not support drawVertices(); ignore */ } 2188dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 2198dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Bitmap-based 220d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual void drawBitmap(const SkBitmap& bitmap, float left, float top, const SkPaint* paint) override; 2218dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 222d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik const SkPaint* paint) override; 2238dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 2248dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float srcRight, float srcBottom, float dstLeft, float dstTop, 225d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik float dstRight, float dstBottom, const SkPaint* paint) override; 2268dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 227d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik const float* vertices, const int* colors, const SkPaint* paint) override; 2288dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 2298dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // Text 2308dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawText(const uint16_t* glyphs, const float* positions, int count, 2318dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint, float x, float y, float boundsLeft, float boundsTop, 232d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik float boundsRight, float boundsBottom, float totalAdvance) override; 2338dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawPosText(const uint16_t* text, const float* positions, int count, 234d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik int posCount, const SkPaint& paint) override; 2358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson virtual void drawTextOnPath(const uint16_t* glyphs, int count, const SkPath& path, 236d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik float hOffset, float vOffset, const SkPaint& paint) override; 237d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik virtual bool drawTextAbsolutePos() const override { return false; } 2388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 2398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 241984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 242984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson CanvasState mState; 2431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger std::unique_ptr<SkiaCanvasProxy> mSkiaCanvasProxy; 244984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson 2458afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik enum DeferredBarrierType { 2468afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_None, 2478afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_InOrder, 2488afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_OutOfOrder, 2498afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik }; 2508afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 2518afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushRestoreToCount(); 2528afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushTranslate(); 2538afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushReorderBarrier(); 2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik LinearAllocator& alloc() { return mDisplayListData->allocator; } 256b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik 257b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik // Each method returns final index of op 2588afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addOpAndUpdateChunk(DisplayListOp* op); 2598afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // flushes any deferred operations, and appends the op 2608afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t flushAndAddOp(DisplayListOp* op); 2618afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 2628afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addStateOp(StateOp* op); 2638afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addDrawOp(DrawOp* op); 2648afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addRenderNodeOp(DrawRenderNodeOp* op); 2658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik template<class T> 268d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const T* refBuffer(const T* srcBuffer, int32_t count) { 269e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik if (!srcBuffer) return nullptr; 270d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik 2712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); 2722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 2732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return dstBuffer; 2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2762af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline char* refText(const char* text, size_t byteLength) { 2772af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 280d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPath* refPath(const SkPath* path) { 281e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik if (!path) return nullptr; 2822fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 283ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger // The points/verbs within the path are refcounted so this copy operation 284ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger // is inexpensive and maintains the generationID of the original path. 285ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger const SkPath* cachedPath = new SkPath(*path); 286ee248599d49a15fc207c5aeb0b90ec263cc1d600Derek Sollenberger mDisplayListData->pathResources.add(cachedPath); 28751d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik return cachedPath; 2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 290d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPaint* refPaint(const SkPaint* paint) { 291e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik if (!paint) return nullptr; 2920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 29309c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger // If there is a draw filter apply it here and store the modified paint 29409c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger // so that we don't need to modify the paint every time we access it. 295da3198a550bdd91ccdc8a09c3a6e00d3b61c0c20Chris Craik SkTLazy<SkPaint> filteredPaint; 29609c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger if (mDrawFilter.get()) { 2970b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger filteredPaint.set(*paint); 29851d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mDrawFilter->filter(filteredPaint.get(), SkDrawFilter::kPaint_Type); 2990b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger paint = filteredPaint.get(); 30009c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger } 30109c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger 30209c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger // compute the hash key for the paint and check the cache. 30309c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger const uint32_t key = paint->getHash(); 30409c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger const SkPaint* cachedPaint = mPaintMap.valueFor(key); 30509c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger // In the unlikely event that 2 unique paints have the same hash we do a 30609c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger // object equality check to ensure we don't erroneously dedup them. 307e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik if (cachedPaint == nullptr || *cachedPaint != *paint) { 30851d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik cachedPaint = new SkPaint(*paint); 30951d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<const SkPaint> copy(cachedPaint); 31051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mDisplayListData->paints.push_back(std::move(copy)); 31151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik 31296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 31309c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger mPaintMap.replaceValueFor(key, cachedPaint); 314d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 3150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 31609c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger return cachedPaint; 3170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 3180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 319cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik inline SkPaint* copyPaint(const SkPaint* paint) { 320e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craik if (!paint) return nullptr; 321cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 32251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik SkPaint* returnPaint = new SkPaint(*paint); 32351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<const SkPaint> copy(returnPaint); 32451d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mDisplayListData->paints.push_back(std::move(copy)); 32551d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik 32651d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik return returnPaint; 327cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 328cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 329d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkRegion* refRegion(const SkRegion* region) { 330735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (!region) { 331735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return region; 332735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 333735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 33451d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik const SkRegion* cachedRegion = mRegionMap.valueFor(region); 335735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // TODO: Add generation ID to SkRegion 33651d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik if (cachedRegion == nullptr) { 33751d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<const SkRegion> copy(new SkRegion(*region)); 33851d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik cachedRegion = copy.get(); 33951d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mDisplayListData->regions.push_back(std::move(copy)); 34051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik 341735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // replaceValueFor() performs an add if the entry doesn't exist 34251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik mRegionMap.replaceValueFor(region, cachedRegion); 343735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 344735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 34551d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik return cachedRegion; 346735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 347735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 3487c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck inline const SkBitmap* refBitmap(const SkBitmap& bitmap) { 349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 350d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 351d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 352d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 353e75ab4c26a4f661334845f7bc4132011694836a4John Reck const SkBitmap* localBitmap = new (alloc()) SkBitmap(bitmap); 354e75ab4c26a4f661334845f7bc4132011694836a4John Reck alloc().autoDestroy(localBitmap); 355e75ab4c26a4f661334845f7bc4132011694836a4John Reck mDisplayListData->bitmapResources.push_back(localBitmap); 356e75ab4c26a4f661334845f7bc4132011694836a4John Reck return localBitmap; 35749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 35849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 359d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { 36044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->patchResources.add(patch); 361a35778c799e8073a42b9e22191bde9d838327ab7John Reck mResourceCache.incrementRefcount(patch); 362e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return patch; 363e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 364e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 36509c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger DefaultKeyedVector<uint32_t, const SkPaint*> mPaintMap; 366d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap; 367d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap; 36824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 369a35778c799e8073a42b9e22191bde9d838327ab7John Reck ResourceCache& mResourceCache; 37044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck DisplayListData* mDisplayListData; 37158ecc204fbcacef34806290492384677a330d4d4Romain Guy 37233f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 37333f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 3748afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik bool mHasDeferredTranslate; 3758afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik DeferredBarrierType mDeferredBarrierType; 376cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik bool mHighContrastText; 37754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 378eea6ef9c767c734797912022113191dd255c4ae6Chris Craik int mRestoreSaveCount; 379eea6ef9c767c734797912022113191dd255c4ae6Chris Craik 38009c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger SkAutoTUnref<SkDrawFilter> mDrawFilter; 38109c2d4fe15fbac2faf8a97ba2cc59132ee12222aDerek Sollenberger 382e18264b079481a244b30e3f71012c53bbd861f92John Reck friend class RenderNode; 383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 384db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik}; // class DisplayListCanvas 3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 390