DisplayListRenderer.h revision bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3
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 <SkChunkAlloc.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h> 234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h> 264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h> 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h> 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 297953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 307953745dd565167113f8cbfc461bc0521d32d870Romain Guy 3113631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <utils/String8.h> 3213631f3da855f200a151e7837ed9f6b079622b58Romain Guy 339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h" 357d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.h" 364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 446d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096 4533f6beb10f98e8ba96250e284876d607055d278dRomain Guy#define OP_MAY_BE_SKIPPED_MASK 0xff000000 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 55b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/** 61b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands. 624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList { 644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 65b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList(const DisplayListRenderer& recorder); 667953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API ~DisplayList(); 674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file 69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // when modifying this file 704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy enum Op { 7104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Non-drawing operations 722b1847ea60650a9f68372abe860415f18b55081dRomain Guy Save = 0, 734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Restore, 744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy RestoreToCount, 754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SaveLayer, 765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy SaveLayerAlpha, 774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Translate, 784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Rotate, 794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Scale, 80807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy Skew, 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetMatrix, 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ConcatMatrix, 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ClipRect, 8404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Drawing operations 850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DrawDisplayList, 866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy DrawLayer, 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmap, 884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapMatrix, 894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapRect, 905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy DrawBitmapMesh, 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPatch, 924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawColor, 934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawRect, 9401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawRoundRect, 9501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawCircle, 96c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy DrawOval, 978b2f5267f16c295f12faab810527cd6311997e34Romain Guy DrawArc, 984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPath, 994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawLines, 100ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DrawPoints, 1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawText, 102325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DrawTextOnPath, 103eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DrawPosText, 1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShader, 1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShader, 1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetColorFilter, 1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupColorFilter, 1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShadow, 109ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy SetupShadow, 1105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ResetPaintFilter, 1115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SetupPaintFilter, 112daf98e941e140e8739458126640183b9f296a2abChet Haase DrawGLFunction, 1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy }; 1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11533f6beb10f98e8ba96250e284876d607055d278dRomain Guy // See flags defined in DisplayList.java 11633f6beb10f98e8ba96250e284876d607055d278dRomain Guy enum ReplayFlag { 11733f6beb10f98e8ba96250e284876d607055d278dRomain Guy kReplayFlag_ClipChildren = 0x1 11833f6beb10f98e8ba96250e284876d607055d278dRomain Guy }; 11933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy static const char* OP_NAMES[]; 121ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 1227953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API size_t getSize(); 123bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList); 124bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy ANDROID_API static void outputLogBuffer(int fd); 125bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 126bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); 12765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 12833f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level = 0); 129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 130ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase void output(OpenGLRenderer& renderer, uint32_t level = 0); 131ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 13204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy void setRenderable(bool renderable) { 13304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = renderable; 13404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 13504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 13604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool isRenderable() const { 13704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy return mIsRenderable; 13804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 13904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 14013631f3da855f200a151e7837ed9f6b079622b58Romain Guy void setName(const char* name) { 14113631f3da855f200a151e7837ed9f6b079622b58Romain Guy if (name) { 14213631f3da855f200a151e7837ed9f6b079622b58Romain Guy mName.setTo(name); 14313631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 14413631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 14513631f3da855f200a151e7837ed9f6b079622b58Romain Guy 146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate: 147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void init(); 148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 149d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase void clearResources(); 150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy class TextContainer { 152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy public: 153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length() const { 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mByteLength; 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* text() const { 158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (const char*) mText; 159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t mByteLength; 162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* mText; 163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy }; 164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* getBitmap() { 1665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkBitmap*) getInt(); 1675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* getShader() { 1705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkiaShader*) getInt(); 171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 173ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase SkiaColorFilter* getColorFilter() { 174ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return (SkiaColorFilter*) getInt(); 175ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 176ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 17733f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getIndex() { 178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 18133f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline int32_t getInt() { 182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1857b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline uint32_t getUInt() { 1867b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy return mReader.readU32(); 1877b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 1887b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkMatrix* getMatrix() { 1905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkMatrix*) getInt(); 191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath* getPath() { 1942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return (SkPath*) getInt(); 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* getPaint(OpenGLRenderer& renderer) { 1985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy return renderer.filterPaint((SkPaint*) getInt()); 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DisplayList* getDisplayList() { 2020fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy return (DisplayList*) getInt(); 2030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline float getFloat() { 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readScalar(); 207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* getInts(uint32_t& count) { 210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (int32_t*) mReader.skip(count * sizeof(int32_t)); 212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* getUInts(int8_t& count) { 2154bb942083a0d4db746adf95349108dd8ef842e32Romain Guy count = getInt(); 2164bb942083a0d4db746adf95349108dd8ef842e32Romain Guy return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 2174bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 2184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 21933f6beb10f98e8ba96250e284876d607055d278dRomain Guy float* getFloats(int32_t& count) { 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (float*) mReader.skip(count * sizeof(float)); 222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void getText(TextContainer* text) { 225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length = text->mByteLength = getInt(); 226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy text->mText = (const char*) mReader.skip(length); 227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 230ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 232d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 2332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 234d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 23524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mutable SkFlattenableReadBuffer mReader; 23865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 23965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy size_t mSize; 24004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 24104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mIsRenderable; 24213631f3da855f200a151e7837ed9f6b079622b58Romain Guy 24313631f3da855f200a151e7837ed9f6b079622b58Romain Guy String8 mName; 244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}; 245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer 248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 2557953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayListRenderer(); 2567953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2587953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); 2595977baa1fa24125c148a72699b53e62abaf08960Chet Haase 2607953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setViewport(int width, int height); 2617953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque); 2627953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2647953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool callDrawGLFunction(Functor *functor, Rect& dirty); 2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2667953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 2677953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 268daf98e941e140e8739458126640183b9f296a2abChet Haase 2697953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 2707953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 2717953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2737953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 2745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags); 2757953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayerAlpha(float left, float top, float right, float bottom, 2765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags); 2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2787953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void translate(float dx, float dy); 2797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 2807953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 2817953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2837953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setMatrix(SkMatrix* matrix); 2847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void concatMatrix(SkMatrix* matrix); 2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2867953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2887953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height, 28933f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect& dirty, int32_t flags, uint32_t level = 0); 2907953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint); 2917953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 2927953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 2937953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 2955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 2967953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 2975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint); 2987953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 2994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 3005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 3017953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawColor(int color, SkXfermode::Mode mode); 3027953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 3037953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRoundRect(float left, float top, float right, float bottom, 30401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 3057953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawCircle(float x, float y, float radius, SkPaint* paint); 3067953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint); 3077953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawArc(float left, float top, float right, float bottom, 3088b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 3097953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPath(SkPath* path, SkPaint* paint); 3107953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLines(float* points, int count, SkPaint* paint); 3117953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPoints(float* points, int count, SkPaint* paint); 3127953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawText(const char* text, int bytesCount, int count, float x, float y, 3138f9a9f61ab793d9387a5942b307e74324704893bRomain Guy SkPaint* paint, float length = 1.0f); 314325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 315325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset, float vOffset, SkPaint* paint); 316eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, 317eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy SkPaint* paint); 3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3197953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShader(); 3207953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShader(SkiaShader* shader); 3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3227953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetColorFilter(); 3237953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupColorFilter(SkiaColorFilter* filter); 3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3257953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShadow(); 3267953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShadow(float radius, float dx, float dy, int color); 3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void resetPaintFilter(); 3295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void setupPaintFilter(int clearBits, int setBits); 3305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 3317953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API void reset(); 3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writeStream() const { 334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mWriter; 335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 3385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 340b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 341d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*>& getFilterResources() const { 342d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy return mFilterResources; 343d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 344d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 34524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 34624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 350d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 3515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 3525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 3532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 3542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 3552fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 3562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 357d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 358d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 36227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy void insertRestoreToCount() { 36327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy if (mRestoreSaveCount >= 0) { 36427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mWriter.writeInt(DisplayList::RestoreToCount); 36527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy addInt(mRestoreSaveCount); 36627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 36727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 36827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 36927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 37033f6beb10f98e8ba96250e284876d607055d278dRomain Guy void insertTranlate() { 37133f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mHasTranslate) { 37233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 37333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(DisplayList::Translate); 37433f6beb10f98e8ba96250e284876d607055d278dRomain Guy addPoint(mTranslateX, mTranslateY); 37533f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX = mTranslateY = 0.0f; 37633f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 37733f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = false; 37833f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 37933f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 38133f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addOp(const DisplayList::Op drawOp) { 38227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 38333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(drawOp); 38504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 38833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) { 38933f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 39033f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 39133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 39233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (reject) { 39333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp); 394ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy mWriter.writeInt(0xdeaddead); 395ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy uint32_t* location = reject ? 396ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy mWriter.peek32(mWriter.size() - sizeof(int32_t)) : NULL; 39733f6beb10f98e8ba96250e284876d607055d278dRomain Guy return location; 39833f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 39933f6beb10f98e8ba96250e284876d607055d278dRomain Guy mWriter.writeInt(drawOp); 40033f6beb10f98e8ba96250e284876d607055d278dRomain Guy return NULL; 40133f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 40233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 40333f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addSkip(uint32_t* location) { 40433f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (location) { 405ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy *location = (int32_t) (mWriter.peek32( 406ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy mWriter.size() - sizeof(int32_t)) - location); 40733f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 40833f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 40933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 41033f6beb10f98e8ba96250e284876d607055d278dRomain Guy inline void addInt(int32_t value) { 4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(value); 4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4147b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline void addSize(uint32_t w, uint32_t h) { 4157b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(w); 4167b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(h); 4177b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 4187b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addInts(const int32_t* values, uint32_t count) { 420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (uint32_t i = 0; i < count; i++) { 4224bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(values[i]); 4234bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 4244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 4254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 4264bb942083a0d4db746adf95349108dd8ef842e32Romain Guy void addUInts(const uint32_t* values, int8_t count) { 4274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(count); 4284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy for (int8_t i = 0; i < count; i++) { 4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(values[i]); 4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addFloat(float value) { 4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(value); 4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 43733f6beb10f98e8ba96250e284876d607055d278dRomain Guy void addFloats(const float* values, int32_t count) { 438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 43933f6beb10f98e8ba96250e284876d607055d278dRomain Guy for (int32_t i = 0; i < count; i++) { 4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(values[i]); 4414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPoint(float x, float y) { 4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(x); 4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(y); 4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addBounds(float left, float top, float right, float bottom) { 4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(left); 4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(top); 4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(right); 4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(bottom); 4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addText(const void* text, size_t byteLength) { 4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(byteLength); 4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writePad(text, byteLength); 4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4612fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void addPath(SkPath* path) { 4622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (!path) { 4632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) NULL); 4642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return; 4652fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 4662fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 4672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 4682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 469b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 4704bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy pathCopy->setSourcePath(path); 47196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 47296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 473b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 4762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) pathCopy); 4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addPaint(SkPaint* paint) { 48024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 4810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) NULL); 482d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return; 483d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 4840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 48522d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 486d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 487d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 48896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 48996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 490d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 491d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 4920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 4930fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) paintCopy); 4940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 4950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 4960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy inline void addDisplayList(DisplayList* displayList) { 4970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // TODO: To be safe, the display list should be ref-counted in the 4980fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // resources cache, but we rely on the caller (UI toolkit) to 4990fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // do the right thing for now 5000fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) displayList); 5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addMatrix(SkMatrix* matrix) { 504d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 505d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 506f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 507f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy addInt((int) copy); 508f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy mMatrices.add(copy); 5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addBitmap(SkBitmap* bitmap) { 512d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 513d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 514d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 515d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 5160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) bitmap); 5175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 518d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(bitmap); 5195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addShader(SkiaShader* shader) { 52224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!shader) { 52324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) NULL); 52424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return; 52524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 52624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 52724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 52824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 5291f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 53024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 53196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 53296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mShaderMap.replaceValueFor(shader, shaderCopy); 5331f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 53443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); 53524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 53624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 53724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) shaderCopy); 5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 540ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase inline void addColorFilter(SkiaColorFilter* colorFilter) { 5410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) colorFilter); 542ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 543d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(colorFilter); 544ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 545ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 5465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 547ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 549d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 5500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 55124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 5522fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 5532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 5542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 55524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 55624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 55724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 558d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 559d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkWriter32 mWriter; 5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 56227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 56333f6beb10f98e8ba96250e284876d607055d278dRomain Guy 56433f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 56533f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 56633f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 56733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 56804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 56927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 570b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 571b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 578