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 204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 237953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 247953745dd565167113f8cbfc461bc0521d32d870Romain Guy 259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 26113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderNode.h" 27a35778c799e8073a42b9e22191bde9d838327ab7John Reck#include "ResourceCache.h" 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 44b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 47c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList; 4812f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reckclass DeferredLayerUpdater; 49b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp; 512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp; 522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp; 532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 55d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer. 56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 573b20251a355c88193c439f928a84ae69483fb488John Reckclass ANDROID_API DisplayListRenderer: public StatefulBaseRenderer { 58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 593b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer(); 607953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 61b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 628afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void insertReorderBarrier(bool enableReorder); 638afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 643b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListData* finishRecording(); 655977baa1fa24125c148a72699b53e62abaf08960Chet Haase 6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Frame state operations 6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 697c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque); 707953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 717953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 727953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 73daf98e941e140e8739458126640183b9f296a2abChet Haase 7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas state operations 7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Save (layer) 787953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 807953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 817953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 82d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger const SkPaint* paint, int flags); 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Matrix 853b20251a355c88193c439f928a84ae69483fb488John Reck virtual void translate(float dx, float dy, float dz = 0.0f); 867953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 877953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 887953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 90139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void setMatrix(const SkMatrix& matrix); 91139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void concatMatrix(const SkMatrix& matrix); 924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 9314e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Clip 947953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 95d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipPath(const SkPath* path, SkRegion::Op op); 96d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipRegion(const SkRegion* region, SkRegion::Op op); 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Misc - should be implemented with SkPaint inspection 9914e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void resetPaintFilter(); 10014e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void setupPaintFilter(int clearBits, int setBits); 10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 1023b20251a355c88193c439f928a84ae69483fb488John Reck bool isCurrentTransformSimple() { 1033b20251a355c88193c439f928a84ae69483fb488John Reck return currentTransform()->isSimple(); 1043b20251a355c88193c439f928a84ae69483fb488John Reck } 1053b20251a355c88193c439f928a84ae69483fb488John Reck 10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations 10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t drawColor(int color, SkXfermode::Mode mode); 11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Bitmap-based 112796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop, 1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 115d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint); 116796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint); 117d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, 118d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint); 119d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch, 120d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float left, float top, float right, float bottom, const SkPaint* paint); 12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Shapes 123d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRect(float left, float top, float right, float bottom, 124d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint); 125d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRects(const float* rects, int count, const SkPaint* paint); 126486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRoundRect(float left, float top, float right, float bottom, 127d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float rx, float ry, const SkPaint* paint); 128072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi virtual status_t drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 129072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 130072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 131072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paint); 132d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint); 13352244fff29042926e21fa897ef5ab11148e35299John Reck virtual status_t drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 13452244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint); 135d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawOval(float left, float top, float right, float bottom, 136d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint); 137486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawArc(float left, float top, float right, float bottom, 138d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint); 139d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPath(const SkPath* path, const SkPaint* paint); 140d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawLines(const float* points, int count, const SkPaint* paint); 141d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPoints(const float* points, int count, const SkPaint* paint); 14214e513058ed4168c94e015638d16f5f87fd8063aChris Craik 14314e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Text 14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 145d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, 14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik DrawOpMode drawOpMode = kDrawOpMode_Immediate); 147d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, 148d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float hOffset, float vOffset, const SkPaint* paint); 149486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPosText(const char* text, int bytesCount, int count, 150d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint); 1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 15314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations - special 15414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 15512f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck virtual status_t drawLayer(DeferredLayerUpdater* layerHandle, float x, float y); 156a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, int32_t replayFlags); 1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15814e513058ed4168c94e015638d16f5f87fd8063aChris Craik // TODO: rename for consistency 15914e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty); 1605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 161cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik void setHighContrastText(bool highContrastText) { 162cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik mHighContrastText = highContrastText; 163cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 1644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 1658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik enum DeferredBarrierType { 1668afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_None, 1678afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_InOrder, 1688afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik kBarrier_OutOfOrder, 1698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik }; 1708afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 1718afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushRestoreToCount(); 1728afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushTranslate(); 1738afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik void flushReorderBarrier(); 1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik LinearAllocator& alloc() { return mDisplayListData->allocator; } 176b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik 177b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik // Each method returns final index of op 1788afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addOpAndUpdateChunk(DisplayListOp* op); 1798afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // flushes any deferred operations, and appends the op 1808afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t flushAndAddOp(DisplayListOp* op); 1818afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 1828afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addStateOp(StateOp* op); 1838afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addDrawOp(DrawOp* op); 1848afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik size_t addRenderNodeOp(DrawRenderNodeOp* op); 1858afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 1864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik template<class T> 188d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const T* refBuffer(const T* srcBuffer, int32_t count) { 189d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik if (!srcBuffer) return NULL; 190d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik 1912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); 1922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 1932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return dstBuffer; 1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline char* refText(const char* text, size_t byteLength) { 1972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 200d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPath* refPath(const SkPath* path) { 2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!path) return NULL; 2022fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 203d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPath* pathCopy = mPathMap.valueFor(path); 2042fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 205d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik SkPath* newPathCopy = new SkPath(*path); 206d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik newPathCopy->setSourcePath(path); 207d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik 208d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik pathCopy = newPathCopy; 20996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 21096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 21144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->paths.add(pathCopy); 2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 21344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck if (mDisplayListData->sourcePaths.indexOf(path) < 0) { 214a35778c799e8073a42b9e22191bde9d838327ab7John Reck mResourceCache.incrementRefcount(path); 21544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->sourcePaths.add(path); 216d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 2172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return pathCopy; 2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 220d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPaint* refPaint(const SkPaint* paint) { 221cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik if (!paint) return NULL; 2220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 22369e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik const SkPaint* paintCopy = mPaintMap.valueFor(paint); 22469e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik if (paintCopy == NULL 22569e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik || paintCopy->getGenerationID() != paint->getGenerationID() 22669e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik // We can't compare shader pointers because that will always 22769e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik // change as we do partial copying via wrapping. However, if the 22869e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik // shader changes the paint generationID will have changed and 22969e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik // so we don't hit this comparison anyway 23069e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik || !(paint->getShader() && paintCopy->getShader() 23169e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik && paint->getShader()->getGenerationID() == paintCopy->getShader()->getGenerationID())) { 23269e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik paintCopy = copyPaint(paint); 23369e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik // replaceValueFor() performs an add if the entry doesn't exist 23469e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik mPaintMap.replaceValueFor(paint, paintCopy); 235d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 237e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paintCopy; 2380fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2390fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 240cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik inline SkPaint* copyPaint(const SkPaint* paint) { 241cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik if (!paint) return NULL; 242cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik SkPaint* paintCopy = new SkPaint(*paint); 243c1469f39b571f5660346fc837ac30b19d7651a43John Reck if (paint->getShader()) { 244c1469f39b571f5660346fc837ac30b19d7651a43John Reck SkShader* shaderCopy = SkShader::CreateLocalMatrixShader( 245c1469f39b571f5660346fc837ac30b19d7651a43John Reck paint->getShader(), paint->getShader()->getLocalMatrix()); 246c1469f39b571f5660346fc837ac30b19d7651a43John Reck paintCopy->setShader(shaderCopy); 247c1469f39b571f5660346fc837ac30b19d7651a43John Reck paintCopy->setGenerationID(paint->getGenerationID()); 248c1469f39b571f5660346fc837ac30b19d7651a43John Reck shaderCopy->setGenerationID(paint->getShader()->getGenerationID()); 249c1469f39b571f5660346fc837ac30b19d7651a43John Reck shaderCopy->unref(); 250c1469f39b571f5660346fc837ac30b19d7651a43John Reck } 251cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik mDisplayListData->paints.add(paintCopy); 252cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik return paintCopy; 253cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 254cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 255d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkRegion* refRegion(const SkRegion* region) { 256735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (!region) { 257735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return region; 258735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 259735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 260d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkRegion* regionCopy = mRegionMap.valueFor(region); 261735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // TODO: Add generation ID to SkRegion 262735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (regionCopy == NULL) { 263735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy regionCopy = new SkRegion(*region); 264735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // replaceValueFor() performs an add if the entry doesn't exist 265735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegionMap.replaceValueFor(region, regionCopy); 26644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->regions.add(regionCopy); 267735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 268735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 269735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return regionCopy; 270735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 271735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 272d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkBitmap* refBitmap(const SkBitmap* bitmap) { 273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 275d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 276d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 27744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->bitmapResources.add(bitmap); 278a35778c799e8073a42b9e22191bde9d838327ab7John Reck mResourceCache.incrementRefcount(bitmap); 2792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 2805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 282d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) { 28344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->ownedBitmapResources.add(bitmap); 284a35778c799e8073a42b9e22191bde9d838327ab7John Reck mResourceCache.incrementRefcount(bitmap); 2852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 28649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 28749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 288d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { 28944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->patchResources.add(patch); 290a35778c799e8073a42b9e22191bde9d838327ab7John Reck mResourceCache.incrementRefcount(patch); 291e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return patch; 292e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 293e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 294d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkPaint*, const SkPaint*> mPaintMap; 295d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap; 296d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap; 29724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 298a35778c799e8073a42b9e22191bde9d838327ab7John Reck ResourceCache& mResourceCache; 29944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck DisplayListData* mDisplayListData; 30058ecc204fbcacef34806290492384677a330d4d4Romain Guy 30133f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 30233f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 3038afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik bool mHasDeferredTranslate; 3048afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik DeferredBarrierType mDeferredBarrierType; 305cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik bool mHighContrastText; 30654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 307eea6ef9c767c734797912022113191dd255c4ae6Chris Craik int mRestoreSaveCount; 308eea6ef9c767c734797912022113191dd255c4ae6Chris Craik 309e18264b079481a244b30e3f71012c53bbd861f92John Reck friend class RenderNode; 310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 317