DisplayListRenderer.h revision c1cd9ba335b293f11e1082447ef08e474710a05f
12bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/* 22bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Copyright (C) 2010 The Android Open Source Project 32bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 42bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 52bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * you may not use this file except in compliance with the License. 62bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * You may obtain a copy of the License at 72bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 82bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 92bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Unless required by applicable law or agreed to in writing, software 112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * See the License for the specific language governing permissions and 142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * limitations under the License. 152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */ 162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkChunkAlloc.h> 212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkFlattenable.h> 222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkMatrix.h> 232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPaint.h> 242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPath.h> 252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkPictureFlat.h> 262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkRefCnt.h> 272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkTDArray.h> 282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <SkTSearch.h> 292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "OpenGLRenderer.h" 312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 322bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace android { 332bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace uirenderer { 342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Defines 372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define MIN_WRITER_SIZE 16384 402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define HEAP_BLOCK_SIZE 4096 41ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 42bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber// Debug 43ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber#if DEBUG_DISPLAY_LIST 442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__) 452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#else 462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber #define DISPLAY_LIST_LOGD(...) 472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#endif 482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Helpers 512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass PathHeap: public SkRefCnt { 542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic: 552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber PathHeap(); 562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber PathHeap(SkFlattenableReadBuffer& buffer); 572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ~PathHeap(); 582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int append(const SkPath& path); 602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int count() const { return mPaths.count(); } 622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkPath& operator[](int index) const { 642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return *mPaths[index]; 652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void flatten(SkFlattenableWriteBuffer& buffer) const; 682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate: 702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkChunkAlloc mHeap; 712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkTDArray<SkPath*> mPaths; 722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}; 732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber// Display list 762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/////////////////////////////////////////////////////////////////////////////// 772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayListRenderer; 792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/** 812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Replays recorded drawing commands. 822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */ 832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayList { 842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic: 852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DisplayList(const DisplayListRenderer& recorder); 862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ~DisplayList(); 872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file 892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // when modifying this file 902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber enum Op { 912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber AcquireContext = 0, 922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ReleaseContext, 932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Save, 942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Restore, 952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber RestoreToCount, 962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SaveLayer, 972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SaveLayerAlpha, 98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber Translate, 992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Rotate, 1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Scale, 1012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Skew, 1022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SetMatrix, 1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ConcatMatrix, 1042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ClipRect, 1052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DrawDisplayList, 1062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DrawLayer, 1072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DrawBitmap, 108bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawBitmapMatrix, 109bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawBitmapRect, 110bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawBitmapMesh, 111bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawPatch, 112bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawColor, 113bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawRect, 114bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawRoundRect, 115bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawCircle, 116bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawOval, 117bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawPath, 118bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawLines, 119bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber DrawText, 120bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber ResetShader, 121bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber SetupShader, 122bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber ResetColorFilter, 123bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber SetupColorFilter, 124bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber ResetShadow, 125bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber SetupShadow, 126bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber }; 127bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 128bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber static const char* OP_NAMES[]; 129bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 130bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber void initFromDisplayListRenderer(const DisplayListRenderer& recorder); 131bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 132bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber void replay(OpenGLRenderer& renderer, uint32_t level = 0); 133bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 134bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huberprivate: 135bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber void init(); 136bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 1372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber class TextContainer { 1382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber public: 139bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber size_t length() const { 140bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return mByteLength; 141bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 142bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 143bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber const char* text() const { 144bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber return (const char*) mText; 145bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber } 146bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 1472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber size_t mByteLength; 1482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const char* mText; 1492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber }; 1502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkBitmap* getBitmap() { 1522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (SkBitmap*) getInt(); 1532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkiaShader* getShader() { 1562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (SkiaShader*) getInt(); 1572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkiaColorFilter* getColorFilter() { 1602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (SkiaColorFilter*) getInt(); 1612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline int getIndex() { 1642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mReader.readInt(); 1652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline int getInt() { 1682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mReader.readInt(); 1692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkMatrix* getMatrix() { 1722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (SkMatrix*) getInt(); 1732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkPath* getPath() { 1762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return &(*mPathHeap)[getInt() - 1]; 1772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkPaint* getPaint() { 1802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (SkPaint*) getInt(); 1812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DisplayList* getDisplayList() { 1842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (DisplayList*) getInt(); 1852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline float getFloat() { 188ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber return mReader.readScalar(); 189ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber } 190ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 191ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber int32_t* getInts(uint32_t& count) { 192ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber count = getInt(); 193ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber return (int32_t*) mReader.skip(count * sizeof(int32_t)); 194ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber } 195ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 196ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber uint32_t* getUInts(int8_t& count) { 1972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber count = getInt(); 198ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 1992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 2002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber float* getFloats(int& count) { 2022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber count = getInt(); 2032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return (float*) mReader.skip(count * sizeof(float)); 2042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 2052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void getText(TextContainer* text) { 2072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber size_t length = text->mByteLength = getInt(); 2082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber text->mText = (const char*) mReader.skip(length); 2092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 2102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber PathHeap* mPathHeap; 2122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Vector<SkBitmap*> mBitmapResources; 2142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Vector<SkiaColorFilter*> mFilterResources; 2152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Vector<SkPaint*> mPaints; 217ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber Vector<SkMatrix*> mMatrices; 218ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber Vector<SkiaShader*> mShaders; 219ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 220ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber mutable SkFlattenableReadBuffer mReader; 221ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 222ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber SkRefCntPlayback mRCPlayback; 223ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber SkTypefacePlayback mTFPlayback; 224ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber}; 225ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 226ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber/////////////////////////////////////////////////////////////////////////////// 227ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber// Renderer 228ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber/////////////////////////////////////////////////////////////////////////////// 229ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 230ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber/** 2312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Records drawing commands in a display list for latter playback. 2322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */ 2332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberclass DisplayListRenderer: public OpenGLRenderer { 2342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberpublic: 2352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DisplayListRenderer(); 2362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ~DisplayListRenderer(); 2372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DisplayList* getDisplayList(); 2392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void setViewport(int width, int height); 2412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void prepare(bool opaque); 2422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void finish(); 2432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void acquireContext(); 2452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void releaseContext(); 2462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int save(int flags); 2482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void restore(); 2492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void restoreToCount(int saveCount); 250bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 2512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int saveLayer(float left, float top, float right, float bottom, 2522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkPaint* p, int flags); 2532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int saveLayerAlpha(float left, float top, float right, float bottom, 2542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int alpha, int flags); 2552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void translate(float dx, float dy); 2572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void rotate(float degrees); 2582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void scale(float sx, float sy); 2592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void skew(float sx, float sy); 2602d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 2612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber void setMatrix(SkMatrix* matrix); 2622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void concatMatrix(SkMatrix* matrix); 2632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 2652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 266df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block void drawDisplayList(DisplayList* displayList, uint32_t level = 0); 2672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawLayer(Layer* layer, float x, float y, SkPaint* paint); 2682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 2692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 2701906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 2711906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber float srcRight, float srcBottom, float dstLeft, float dstTop, 2721906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber float dstRight, float dstBottom, SkPaint* paint); 2732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 2742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber float* vertices, int* colors, SkPaint* paint); 2752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 2762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 2771906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber float left, float top, float right, float bottom, SkPaint* paint); 2781906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawColor(int color, SkXfermode::Mode mode); 279c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 280c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber void drawRoundRect(float left, float top, float right, float bottom, 281c9d1696d214d2175327067ccc1991bcb36976404Andreas Huber float rx, float ry, SkPaint* paint); 2821906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawCircle(float x, float y, float radius, SkPaint* paint); 2831906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawOval(float left, float top, float right, float bottom, SkPaint* paint); 2842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void drawPath(SkPath* path, SkPaint* paint); 2851906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawLines(float* points, int count, SkPaint* paint); 2861906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint); 2872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2881906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber void resetShader(); 2892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void setupShader(SkiaShader* shader); 2902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void resetColorFilter(); 2922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void setupColorFilter(SkiaColorFilter* filter); 2932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void resetShadow(); 2952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void setupShadow(float radius, float dx, float dy, int color); 2962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void reset(); 2982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 2992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const SkWriter32& writeStream() const { 3002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mWriter; 3012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const Vector<SkBitmap*>& getBitmapResources() const { 3042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mBitmapResources; 3052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const Vector<SkiaShader*>& getShaders() const { 3082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mShaders; 3092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const Vector<SkPaint*>& getPaints() const { 3122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mPaints; 3132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const Vector<SkMatrix*>& getMatrices() const { 3162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mMatrices; 3172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const Vector<SkiaColorFilter*>& getFilterResources() const { 3202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return mFilterResources; 3212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate: 3242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void insertRestoreToCount() { 3252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mRestoreSaveCount >= 0) { 3262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(DisplayList::RestoreToCount); 3272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt(mRestoreSaveCount); 3282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mRestoreSaveCount = -1; 3292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addOp(DisplayList::Op drawOp) { 3332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber insertRestoreToCount(); 3342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(drawOp); 3352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addInt(int value) { 3382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(value); 3392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void addInts(const int32_t* values, uint32_t count) { 3422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(count); 3432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber for (uint32_t i = 0; i < count; i++) { 3442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(values[i]); 3452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3461906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber } 3472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void addUInts(const uint32_t* values, int8_t count) { 3492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(count); 3502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber for (int8_t i = 0; i < count; i++) { 3512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(values[i]); 3522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addFloat(float value) { 3562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(value); 3572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void addFloats(const float* values, int count) { 3602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(count); 3612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber for (int i = 0; i < count; i++) { 3622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(values[i]); 3632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addPoint(float x, float y) { 3672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(x); 3682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(y); 3692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addBounds(float left, float top, float right, float bottom) { 3722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(left); 3732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(top); 3741906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber mWriter.writeScalar(right); 3752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeScalar(bottom); 3762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addText(const void* text, size_t byteLength) { 3792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writeInt(byteLength); 3802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mWriter.writePad(text, byteLength); 3812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addPath(const SkPath* path) { 3842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mPathHeap == NULL) { 3852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mPathHeap = new PathHeap(); 3862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt(mPathHeap->append(*path)); 3882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addPaint(SkPaint* paint) { 3912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (!paint) { 3922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt((int) NULL); 3932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber return; 3942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 3952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 3962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SkPaint* paintCopy = mPaintMap.valueFor(paint); 3972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 3982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber paintCopy = new SkPaint(*paint); 3992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mPaintMap.add(paint, paintCopy); 4002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mPaints.add(paintCopy); 4012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 4022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 4032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt((int) paintCopy); 4042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 4052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 4062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addDisplayList(DisplayList* displayList) { 4072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // TODO: To be safe, the display list should be ref-counted in the 4082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // resources cache, but we rely on the caller (UI toolkit) to 4092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // do the right thing for now 4102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt((int) displayList); 4112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 4122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 4132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addMatrix(SkMatrix* matrix) { 4142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // Copying the matrix is cheap and prevents against the user changing the original 4152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // matrix before the operation that uses it 4162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber addInt((int) new SkMatrix(*matrix)); 4172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 4182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 4192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber inline void addBitmap(SkBitmap* bitmap) { 4202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // Note that this assumes the bitmap is immutable. There are cases this won't handle 4212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // correctly, such as creating the bitmap from scratch, drawing with it, changing its 422 // contents, and drawing again. The only fix would be to always copy it the first time, 423 // which doesn't seem worth the extra cycles for this unlikely case. 424 addInt((int) bitmap); 425 mBitmapResources.add(bitmap); 426 Caches& caches = Caches::getInstance(); 427 caches.resourceCache.incrementRefcount(bitmap); 428 } 429 430 inline void addShader(SkiaShader* shader) { 431 if (!shader) { 432 addInt((int) NULL); 433 return; 434 } 435 436 SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 437 // TODO: We also need to handle generation ID changes in compose shaders 438 if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 439 shaderCopy = shader->copy(); 440 mShaderMap.add(shader, shaderCopy); 441 mShaders.add(shaderCopy); 442 Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); 443 } 444 445 addInt((int) shaderCopy); 446 } 447 448 inline void addColorFilter(SkiaColorFilter* colorFilter) { 449 addInt((int) colorFilter); 450 mFilterResources.add(colorFilter); 451 Caches& caches = Caches::getInstance(); 452 caches.resourceCache.incrementRefcount(colorFilter); 453 } 454 455 SkChunkAlloc mHeap; 456 457 Vector<SkBitmap*> mBitmapResources; 458 Vector<SkiaColorFilter*> mFilterResources; 459 460 Vector<SkPaint*> mPaints; 461 DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 462 463 Vector<SkiaShader*> mShaders; 464 DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 465 466 Vector<SkMatrix*> mMatrices; 467 468 PathHeap* mPathHeap; 469 SkWriter32 mWriter; 470 471 SkRefCntRecorder mRCRecorder; 472 SkRefCntRecorder mTFRecorder; 473 474 DisplayList *mDisplayList; 475 476 int mRestoreSaveCount; 477 478 friend class DisplayList; 479 480}; // class DisplayListRenderer 481 482}; // namespace uirenderer 483}; // namespace android 484 485#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 486