DisplayListRenderer.h revision 796475006f5d670e8383a2050f11719522437a43
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" 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 43b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 46c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList; 47b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp; 492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp; 502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp; 512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 52b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 53d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer. 54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 553b20251a355c88193c439f928a84ae69483fb488John Reckclass ANDROID_API DisplayListRenderer: public StatefulBaseRenderer { 56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 573b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListRenderer(); 587953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 603b20251a355c88193c439f928a84ae69483fb488John Reck DisplayListData* finishRecording(); 615977baa1fa24125c148a72699b53e62abaf08960Chet Haase 6214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Frame state operations 6414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 657c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque); 667953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 677953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 687953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 69daf98e941e140e8739458126640183b9f296a2abChet Haase 7014e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas state operations 7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Save (layer) 747953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 757953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 767953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 777953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 78d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger const SkPaint* paint, int flags); 794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8014e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Matrix 813b20251a355c88193c439f928a84ae69483fb488John Reck virtual void translate(float dx, float dy, float dz = 0.0f); 827953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 837953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 86139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void setMatrix(const SkMatrix& matrix); 87139088228faa7f3c446af7387e017933998a5570Derek Sollenberger virtual void concatMatrix(const SkMatrix& matrix); 884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 8914e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Clip 907953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 91d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipPath(const SkPath* path, SkRegion::Op op); 92d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual bool clipRegion(const SkRegion* region, SkRegion::Op op); 934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Misc - should be implemented with SkPaint inspection 9514e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void resetPaintFilter(); 9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual void setupPaintFilter(int clearBits, int setBits); 9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 983b20251a355c88193c439f928a84ae69483fb488John Reck bool isCurrentTransformSimple() { 993b20251a355c88193c439f928a84ae69483fb488John Reck return currentTransform()->isSimple(); 1003b20251a355c88193c439f928a84ae69483fb488John Reck } 1013b20251a355c88193c439f928a84ae69483fb488John Reck 10214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations 10414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t drawColor(int color, SkXfermode::Mode mode); 10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Bitmap-based 108796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint); 109d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop, 1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 111d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint); 112796475006f5d670e8383a2050f11719522437a43Chris Craik virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint); 113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight, 114d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint); 115d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch, 116d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float left, float top, float right, float bottom, const SkPaint* paint); 11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Shapes 119d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRect(float left, float top, float right, float bottom, 120d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint); 121d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawRects(const float* rects, int count, const SkPaint* paint); 122486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRoundRect(float left, float top, float right, float bottom, 123d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float rx, float ry, const SkPaint* paint); 124d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint); 12552244fff29042926e21fa897ef5ab11148e35299John Reck virtual status_t drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 12652244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint); 127d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawOval(float left, float top, float right, float bottom, 128d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paint); 129486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawArc(float left, float top, float right, float bottom, 130d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint); 131d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPath(const SkPath* path, const SkPaint* paint); 132d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawLines(const float* points, int count, const SkPaint* paint); 133d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawPoints(const float* points, int count, const SkPaint* paint); 13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 13514e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Text 13614e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 137d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds, 13814e513058ed4168c94e015638d16f5f87fd8063aChris Craik DrawOpMode drawOpMode = kDrawOpMode_Immediate); 139d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path, 140d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float hOffset, float vOffset, const SkPaint* paint); 141486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPosText(const char* text, int bytesCount, int count, 142d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* positions, const SkPaint* paint); 1434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 14514e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations - special 14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ---------------------------------------------------------------------------- 14714e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t drawLayer(Layer* layer, float x, float y); 148a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, int32_t replayFlags); 1494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15014e513058ed4168c94e015638d16f5f87fd8063aChris Craik // TODO: rename for consistency 15114e513058ed4168c94e015638d16f5f87fd8063aChris Craik virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty); 1525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 153cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik void setHighContrastText(bool highContrastText) { 154cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik mHighContrastText = highContrastText; 155cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 1572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertRestoreToCount(); 1582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertTranslate(); 1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik LinearAllocator& alloc() { return mDisplayListData->allocator; } 1612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addStateOp(StateOp* op); 1620f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy void addDrawOp(DrawOp* op); 1632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addOpInternal(DisplayListOp* op) { 16433f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 1652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 1662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData->displayListOps.add(op); 1674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1692af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik template<class T> 170d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const T* refBuffer(const T* srcBuffer, int32_t count) { 171d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik if (!srcBuffer) return NULL; 172d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik 1732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); 1742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 1752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return dstBuffer; 1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 1774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline char* refText(const char* text, size_t byteLength) { 1792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 1804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 1814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 182d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPath* refPath(const SkPath* path) { 1832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!path) return NULL; 1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 185d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPath* pathCopy = mPathMap.valueFor(path); 1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 187d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik SkPath* newPathCopy = new SkPath(*path); 188d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik newPathCopy->setSourcePath(path); 189d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik 190d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik pathCopy = newPathCopy; 19196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 19296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 19344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->paths.add(pathCopy); 1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 19544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck if (mDisplayListData->sourcePaths.indexOf(path) < 0) { 19658ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(path); 19744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->sourcePaths.add(path); 198d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return pathCopy; 2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 202d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkPaint* refPaint(const SkPaint* paint) { 203cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik if (!paint) return NULL; 2040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 205d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkPaint* paintCopy = mPaintMap.valueFor(paint); 206d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 207d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 20896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 20996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 21044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->paints.add(paintCopy); 211d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 213e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paintCopy; 2140fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 216cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik inline SkPaint* copyPaint(const SkPaint* paint) { 217cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik if (!paint) return NULL; 218cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik SkPaint* paintCopy = new SkPaint(*paint); 219cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik mDisplayListData->paints.add(paintCopy); 220cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 221cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik return paintCopy; 222cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik } 223cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik 224d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkRegion* refRegion(const SkRegion* region) { 225735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (!region) { 226735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return region; 227735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 228735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 229d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const SkRegion* regionCopy = mRegionMap.valueFor(region); 230735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // TODO: Add generation ID to SkRegion 231735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (regionCopy == NULL) { 232735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy regionCopy = new SkRegion(*region); 233735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // replaceValueFor() performs an add if the entry doesn't exist 234735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegionMap.replaceValueFor(region, regionCopy); 23544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->regions.add(regionCopy); 236735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 237735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 238735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return regionCopy; 239735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 240735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 241ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy inline Layer* refLayer(Layer* layer) { 24244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->layers.add(layer); 243ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy mCaches.resourceCache.incrementRefcount(layer); 244ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy return layer; 245ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy } 246ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy 247d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkBitmap* refBitmap(const SkBitmap* bitmap) { 248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 250d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 251d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 25244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->bitmapResources.add(bitmap); 25358ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 2542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 2555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 257d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) { 25844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->ownedBitmapResources.add(bitmap); 25958ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 2602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 26149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 26249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 263d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { 26444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->patchResources.add(patch); 265e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy mCaches.resourceCache.incrementRefcount(patch); 266e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return patch; 267e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 268e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 269d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkPaint*, const SkPaint*> mPaintMap; 270d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap; 271d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap; 27224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 27358ecc204fbcacef34806290492384677a330d4d4Romain Guy Caches& mCaches; 27444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck DisplayListData* mDisplayListData; 27558ecc204fbcacef34806290492384677a330d4d4Romain Guy 27633f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 27733f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 27833f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 279cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik bool mHighContrastText; 28054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 281eea6ef9c767c734797912022113191dd255c4ae6Chris Craik int mRestoreSaveCount; 282eea6ef9c767c734797912022113191dd255c4ae6Chris Craik 283e18264b079481a244b30e3f71012c53bbd861f92John Reck friend class RenderNode; 284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 291