DisplayListRenderer.h revision ad93c2bb63dfc813b2eefa1043aa63afbddce655
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 174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#ifndef ANDROID_UI_DISPLAY_LIST_RENDERER_H 184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define ANDROID_UI_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 <SkPictureFlat.h> 264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h> 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h> 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h> 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h" 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define HEAP_BLOCK_SIZE 4096 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Helpers 444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass PathHeap: public SkRefCnt { 474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 487975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy PathHeap(); 497975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy PathHeap(SkFlattenableReadBuffer& buffer); 507975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy ~PathHeap(); 514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 527975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy int append(const SkPath& path); 534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int count() const { return mPaths.count(); } 554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath& operator[](int index) const { 574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return *mPaths[index]; 584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 607975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy void flatten(SkFlattenableWriteBuffer& buffer) const; 614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkChunkAlloc mHeap; 644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkTDArray<SkPath*> mPaths; 654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; 664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 68b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 71b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 72b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/** 74b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands. 754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 76b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList { 774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 78b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList(const DisplayListRenderer& recorder); 79b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy ~DisplayList(); 804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy enum Op { 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy AcquireContext, 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ReleaseContext, 844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Save, 854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Restore, 864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy RestoreToCount, 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SaveLayer, 884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Translate, 894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Rotate, 904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Scale, 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetMatrix, 924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ConcatMatrix, 934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ClipRect, 944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmap, 954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapMatrix, 964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapRect, 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPatch, 984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawColor, 994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawRect, 1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPath, 1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawLines, 1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawText, 1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShader, 1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShader, 1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetColorFilter, 1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupColorFilter, 1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShadow, 1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShadow 1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy }; 1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void replay(OpenGLRenderer& renderer); 112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate: 114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void init(); 115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy class TextContainer { 117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy public: 118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length() const { 119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mByteLength; 120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* text() const { 123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (const char*) mText; 124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t mByteLength; 127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* mText; 128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy }; 129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* getBitmap() { 1315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkBitmap*) getInt(); 1325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* getShader() { 1355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkiaShader*) getInt(); 136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 138ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase SkiaColorFilter* getColorFilter() { 139ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return (SkiaColorFilter*) getInt(); 140ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 141ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline int getIndex() { 143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline int getInt() { 147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkMatrix* getMatrix() { 1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkMatrix*) getInt(); 152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath* getPath() { 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return &(*mPathHeap)[getInt() - 1]; 156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPaint* getPaint() { 1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkPaint*) getInt(); 160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline float getFloat() { 163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readScalar(); 164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* getInts(uint32_t& count) { 167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (int32_t*) mReader.skip(count * sizeof(int32_t)); 169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* getUInts(int8_t& count) { 1724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy count = getInt(); 1734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 1744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 1754bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* getFloats(int& count) { 177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (float*) mReader.skip(count * sizeof(float)); 179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void getText(TextContainer* text) { 182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length = text->mByteLength = getInt(); 183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy text->mText = (const char*) mReader.skip(length); 184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy PathHeap* mPathHeap; 187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 1895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkiaShader*> mShaderResources; 190ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mutable SkFlattenableReadBuffer mReader; 196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkRefCntPlayback mRCPlayback; 198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkTypefacePlayback mTFPlayback; 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}; 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer 203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayListRenderer(); 211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy ~DisplayListRenderer(); 212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void setViewport(int width, int height); 2146b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy void prepare(bool opaque); 215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void acquireContext(); 2174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void releaseContext(); 2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int save(int flags); 2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void restore(); 2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void restoreToCount(int saveCount); 2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int saveLayer(float left, float top, float right, float bottom, 2245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags); 2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void translate(float dx, float dy); 2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void rotate(float degrees); 2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void scale(float sx, float sy); 2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void setMatrix(SkMatrix* matrix); 2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void concatMatrix(SkMatrix* matrix); 2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 2365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 2395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 2414bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 2425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void drawColor(int color, SkXfermode::Mode mode); 2445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void drawPath(SkPath* path, SkPaint* paint); 2465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void drawLines(float* points, int count, SkPaint* paint); 2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint); 2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void resetShader(); 2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void setupShader(SkiaShader* shader); 2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void resetColorFilter(); 2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void setupColorFilter(SkiaColorFilter* filter); 2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void resetShadow(); 2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void setupShadow(float radius, float dx, float dy, int color); 2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void reset(); 2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList* getDisplayList() const { 261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return new DisplayList(*this); 262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writeStream() const { 265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mWriter; 266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 2695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkiaShader*>& getShaderResources() const { 273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mShaderResources; 274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 276d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 277d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 2785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 280d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 281d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 284ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase const Vector<SkiaColorFilter*>& getFilterResources() const { 285ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return mFilterResources; 286ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 287ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline void addOp(DisplayList::Op drawOp) { 2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(drawOp); 2914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addInt(int value) { 2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(value); 2954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addInts(const int32_t* values, uint32_t count) { 298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (uint32_t i = 0; i < count; i++) { 3004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(values[i]); 3014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 3024bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 3034bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 3044bb942083a0d4db746adf95349108dd8ef842e32Romain Guy void addUInts(const uint32_t* values, int8_t count) { 3054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(count); 3064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy for (int8_t i = 0; i < count; i++) { 3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(values[i]); 3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addFloat(float value) { 3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(value); 3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addFloats(const float* values, int count) { 316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (int i = 0; i < count; i++) { 3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(values[i]); 3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPoint(float x, float y) { 3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(x); 3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(y); 3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addBounds(float left, float top, float right, float bottom) { 3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(left); 3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(top); 3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(right); 3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(bottom); 3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addText(const void* text, size_t byteLength) { 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(byteLength); 3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writePad(text, byteLength); 3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPath(const SkPath* path) { 3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (mPathHeap == NULL) { 3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap = new PathHeap(); 3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mPathHeap->append(*path)); 3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addPaint(SkPaint* paint) { 347d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paint == NULL) { 348d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase addInt((int)NULL); 349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return; 350d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 351d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase SkPaint *paintCopy = mPaintMap.valueFor(paint); 352d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 353d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 354d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaintMap.add(paint, paintCopy); 355d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 356d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 357d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase addInt((int)paintCopy); 3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addMatrix(SkMatrix* matrix) { 361d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 362d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 363d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase addInt((int) new SkMatrix(*matrix)); 3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addBitmap(SkBitmap* bitmap) { 367d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 368d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 369d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 370d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 3715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addInt((int)bitmap); 3725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 3735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 3745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(bitmap); 3755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addShader(SkiaShader* shader) { 3785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addInt((int)shader); 3795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mShaderResources.add(shader); 3805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 3815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(shader); 3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 384ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase inline void addColorFilter(SkiaColorFilter* colorFilter) { 385ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addInt((int)colorFilter); 386ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 387ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Caches& caches = Caches::getInstance(); 388ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase caches.resourceCache.incrementRefcount(colorFilter); 389ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 390ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkChunkAlloc mHeap; 3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 3945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkiaShader*> mShaderResources; 395ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 397d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 398d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase DefaultKeyedVector<SkPaint *, SkPaint *> mPaintMap; 399d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 400d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy PathHeap* mPathHeap; 4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkWriter32 mWriter; 4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRefCntRecorder mRCRecorder; 4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRefCntRecorder mTFRecorder; 4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#endif // ANDROID_UI_DISPLAY_LIST_RENDERER_H 415