DisplayListRenderer.cpp revision 6c319ca1275c8db892c39b48fc54864c949f9171
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#define LOG_TAG "OpenGLRenderer" 184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 257975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy// Defines 267975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy/////////////////////////////////////////////////////////////////////////////// 277975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 287975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy#define PATH_HEAP_SIZE 64 297975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 307975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy/////////////////////////////////////////////////////////////////////////////// 317975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy// Helpers 327975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy/////////////////////////////////////////////////////////////////////////////// 337975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 347975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::PathHeap(): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) { 357975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy} 367975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 377975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::PathHeap(SkFlattenableReadBuffer& buffer): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) { 387975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy int count = buffer.readS32(); 397975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 407975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy mPaths.setCount(count); 417975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath** ptr = mPaths.begin(); 427975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath)); 437975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 447975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy for (int i = 0; i < count; i++) { 457975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy new (p) SkPath; 467975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy p->unflatten(buffer); 477975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy *ptr++ = p; 487975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy p++; 497975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy } 507975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy} 517975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 527975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::~PathHeap() { 537975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath** iter = mPaths.begin(); 547975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath** stop = mPaths.end(); 557975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy while (iter < stop) { 567975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy (*iter)->~SkPath(); 577975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy iter++; 587975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy } 597975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy} 607975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 617975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guyint PathHeap::append(const SkPath& path) { 627975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath)); 637975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy new (p) SkPath(path); 647975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy *mPaths.append() = p; 657975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy return mPaths.count(); 667975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy} 677975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 687975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guyvoid PathHeap::flatten(SkFlattenableWriteBuffer& buffer) const { 697975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy int count = mPaths.count(); 707975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 717975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy buffer.write32(count); 727975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath** iter = mPaths.begin(); 737975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy SkPath** stop = mPaths.end(); 747975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy while (iter < stop) { 757975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy (*iter)->flatten(buffer); 767975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy iter++; 777975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy } 787975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy} 797975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy 807975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy/////////////////////////////////////////////////////////////////////////////// 81b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 82b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 83b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 84b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) { 855977baa1fa24125c148a72699b53e62abaf08960Chet Haase initFromDisplayListRenderer(recorder); 865977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 875977baa1fa24125c148a72699b53e62abaf08960Chet Haase 885977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() { 895977baa1fa24125c148a72699b53e62abaf08960Chet Haase sk_free((void*) mReader.base()); 905977baa1fa24125c148a72699b53e62abaf08960Chet Haase 915977baa1fa24125c148a72699b53e62abaf08960Chet Haase Caches& caches = Caches::getInstance(); 925977baa1fa24125c148a72699b53e62abaf08960Chet Haase 935977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 945977baa1fa24125c148a72699b53e62abaf08960Chet Haase caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); 955977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 965977baa1fa24125c148a72699b53e62abaf08960Chet Haase mBitmapResources.clear(); 975977baa1fa24125c148a72699b53e62abaf08960Chet Haase 985977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mShaderResources.size(); i++) { 995977baa1fa24125c148a72699b53e62abaf08960Chet Haase caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i)); 1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase mShaderResources.clear(); 1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mPaints.size(); i++) { 1045977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mPaints.itemAt(i); 1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase mPaints.clear(); 1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1085977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mMatrices.size(); i++) { 1095977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mMatrices.itemAt(i); 1105977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase mMatrices.clear(); 1125977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase if (mPathHeap) { 1145977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (int i = 0; i < mPathHeap->count(); i++) { 1155977baa1fa24125c148a72699b53e62abaf08960Chet Haase caches.pathCache.removeDeferred(&(*mPathHeap)[i]); 1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase mPathHeap->safeUnref(); 1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1215977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) { 122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writer = recorder.writeStream(); 123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy init(); 124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (writer.size() == 0) { 126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return; 127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t size = writer.size(); 130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void* buffer = sk_malloc_throw(size); 131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy writer.flatten(buffer); 132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.setMemory(buffer, size); 133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mRCPlayback.reset(&recorder.mRCRecorder); 135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mRCPlayback.setupBuffer(mReader); 136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mTFPlayback.reset(&recorder.mTFRecorder); 138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mTFPlayback.setupBuffer(mReader); 139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources(); 1435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < bitmapResources.size(); i++) { 1445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = bitmapResources.itemAt(i); 1455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(resource); 1465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(resource); 147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 148d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources(); 1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < shaderResources.size(); i++) { 1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* resource = shaderResources.itemAt(i); 1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mShaderResources.add(resource); 1535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(resource); 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 156d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*> &paints = recorder.getPaints(); 157d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < paints.size(); i++) { 158d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paints.itemAt(i)); 159d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 160d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 161d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*> &matrices = recorder.getMatrices(); 162d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < matrices.size(); i++) { 163d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.add(matrices.itemAt(i)); 164d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 165d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap = recorder.mPathHeap; 1679e10841c27d973b930e1b49a099c69d866659505Romain Guy if (mPathHeap) { 1689e10841c27d973b930e1b49a099c69d866659505Romain Guy mPathHeap->safeRef(); 1699e10841c27d973b930e1b49a099c69d866659505Romain Guy } 170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap = NULL; 174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::replay(OpenGLRenderer& renderer) { 177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int saveCount = renderer.getSaveCount() - 1; 181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 1835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int op = mReader.readInt(); 1845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy switch (op) { 185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case AcquireContext: { 186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.acquireContext(); 187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ReleaseContext: { 190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.releaseContext(); 191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.save(getInt()); 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restoreToCount(saveCount + getInt()); 203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(), 207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getPaint(), getInt()); 208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 2105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy case SaveLayerAlpha: { 2115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(), 2125b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy getInt(), getInt()); 2135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 2145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy break; 215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.translate(getFloat(), getFloat()); 217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.rotate(getFloat()); 221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.scale(getFloat(), getFloat()); 225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.setMatrix(getMatrix()); 229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.concatMatrix(getMatrix()); 233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(), 237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy (SkRegion::Op) getInt()); 238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 2400fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy case DrawDisplayList: { 2410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy renderer.drawDisplayList(getDisplayList()); 2420fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2430fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy break; 2446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy case DrawLayer: { 2456c319ca1275c8db892c39b48fc54864c949f9171Romain Guy renderer.drawLayer(getInt(), getFloat(), getFloat(), getFloat(), getFloat(), 2466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy getFloat(), getFloat(), getPaint()); 2476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 2486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy break; 249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint()); 251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getMatrix(), getPaint()); 255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(), 259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 2654bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 2684bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 2744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2764bb942083a0d4db746adf95349108dd8ef842e32Romain Guy renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount, 2774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawColor(getInt(), (SkXfermode::Mode) getInt()); 282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawPath(getPath(), getPaint()); 290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int count = 0; 294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawLines(points, count, getPaint()); 296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawText: { 299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getText(&text); 300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawText(text.text(), text.length(), getInt(), 301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getFloat(), getFloat(), getPaint()); 302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 3095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase renderer.setupShader(getShader()); 310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 317ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase renderer.setupColorFilter(getColorFilter()); 318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 323b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt()); 326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer(): 3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) { 3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap = NULL; 3395977baa1fa24125c148a72699b53e62abaf08960Chet Haase mDisplayList = NULL; 3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (mPathHeap) { 3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap->unref(); 3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap = NULL; 3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mHeap.reset(); 3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mRCRecorder.reset(); 3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mTFRecorder.reset(); 3575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 3585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 3595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 3605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = mBitmapResources.itemAt(i); 3615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.decrementRefcount(resource); 3625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 3635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.clear(); 364d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 3655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mShaderResources.size(); i++) { 3665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* resource = mShaderResources.itemAt(i); 3675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.decrementRefcount(resource); 3685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 3695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mShaderResources.clear(); 370d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 371d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.clear(); 372d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaintMap.clear(); 373d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3805977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() { 3815977baa1fa24125c148a72699b53e62abaf08960Chet Haase if (mDisplayList == NULL) { 3825977baa1fa24125c148a72699b53e62abaf08960Chet Haase mDisplayList = new DisplayList(*this); 3835977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 3845977baa1fa24125c148a72699b53e62abaf08960Chet Haase mDisplayList->initFromDisplayListRenderer(*this); 3855977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 3865977baa1fa24125c148a72699b53e62abaf08960Chet Haase return mDisplayList; 3875977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 3885977baa1fa24125c148a72699b53e62abaf08960Chet Haase 389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 391b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3966b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) { 397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 401b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() { 404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::AcquireContext); 4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::acquireContext(); 4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() { 409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ReleaseContext); 4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::releaseContext(); 4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Restore); 4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::RestoreToCount); 4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(saveCount); 4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 4315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 4405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 4415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addOp(DisplayList::SaveLayerAlpha); 4425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addBounds(left, top, right, bottom); 4435b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(alpha); 4445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(flags); 4455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 4465b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 4475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Translate); 4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 473b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 4754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList) { 4870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addOp(DisplayList::DrawDisplayList); 4880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addDisplayList(displayList); 4890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 4900fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 4916c319ca1275c8db892c39b48fc54864c949f9171Romain Guyvoid DisplayListRenderer::drawLayer(int texture, float left, float top, float right, float bottom, 4926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy float u, float v, SkPaint* paint) { 4936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addOp(DisplayList::DrawLayer); 4946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addInt(texture); 4956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addBounds(left, top, right, bottom); 4966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addFloat(u); 4976c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addFloat(v); 4986c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addPaint(paint); 4996c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 5006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, 5025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 503b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmap); 5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5095c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, 5105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 511b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmapMatrix); 5124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 5195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 520b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmapRect); 5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 5284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 5295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint) { 530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawPatch); 5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 5344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 540b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 5465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 547b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawRect); 5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 553b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawPath); 5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5585c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 559b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float x, float y, SkPaint* paint) { 566b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawText); 5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addText(text, bytesCount); 5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(count); 5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(x, y); 5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 574b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 5785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addOp(DisplayList::SetupShader); 5795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addShader(shader); 5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 583b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 587ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addOp(DisplayList::SetupColorFilter); 588ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addColorFilter(filter); 5894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 592b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 5934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 596b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 5974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 6034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 604