DisplayListRenderer.cpp revision 4bb942083a0d4db746adf95349108dd8ef842e32
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) { 85b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writer = recorder.writeStream(); 86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy init(); 87b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 88b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (writer.size() == 0) { 89b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return; 90b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 91b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 92b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t size = writer.size(); 93b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void* buffer = sk_malloc_throw(size); 94b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy writer.flatten(buffer); 95b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.setMemory(buffer, size); 96b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 97b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mRCPlayback.reset(&recorder.mRCRecorder); 98b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mRCPlayback.setupBuffer(mReader); 99b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 100b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mTFPlayback.reset(&recorder.mTFRecorder); 101b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mTFPlayback.setupBuffer(mReader); 102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkTDArray<const SkFlatBitmap*>& bitmaps = recorder.getBitmaps(); 104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mBitmapCount = bitmaps.count(); 105b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (mBitmapCount > 0) { 106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mBitmaps = new SkBitmap[mBitmapCount]; 107b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy for (const SkFlatBitmap** flatBitmapPtr = bitmaps.begin(); 108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy flatBitmapPtr != bitmaps.end(); flatBitmapPtr++) { 109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkFlatBitmap* flatBitmap = *flatBitmapPtr; 110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int index = flatBitmap->index() - 1; 111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy flatBitmap->unflatten(&mBitmaps[index], &mRCPlayback); 112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkTDArray<const SkFlatMatrix*>& matrices = recorder.getMatrices(); 116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mMatrixCount = matrices.count(); 117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (mMatrixCount > 0) { 118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mMatrices = new SkMatrix[mMatrixCount]; 119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy for (const SkFlatMatrix** matrixPtr = matrices.begin(); 120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy matrixPtr != matrices.end(); matrixPtr++) { 121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkFlatMatrix* flatMatrix = *matrixPtr; 122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy flatMatrix->unflatten(&mMatrices[flatMatrix->index() - 1]); 123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkTDArray<const SkFlatPaint*>& paints = recorder.getPaints(); 127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPaintCount = paints.count(); 128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (mPaintCount > 0) { 129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPaints = new SkPaint[mPaintCount]; 130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy for (const SkFlatPaint** flatPaintPtr = paints.begin(); 131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy flatPaintPtr != paints.end(); flatPaintPtr++) { 132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkFlatPaint* flatPaint = *flatPaintPtr; 133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int index = flatPaint->index() - 1; 134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy flatPaint->unflatten(&mPaints[index], &mRCPlayback, &mTFPlayback); 135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap = recorder.mPathHeap; 139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap->safeRef(); 140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::~DisplayList() { 143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy sk_free((void*) mReader.base()); 144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy Caches& caches = Caches::getInstance(); 146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy for (int i = 0; i < mBitmapCount; i++) { 147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy caches.textureCache.remove(&mBitmaps[i]); 148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy delete[] mBitmaps; 151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy delete[] mMatrices; 152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy delete[] mPaints; 153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap->safeUnref(); 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mBitmaps = NULL; 159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mMatrices = NULL; 160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPaints = NULL; 161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mPathHeap = NULL; 162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mBitmapCount = mMatrixCount = mPaintCount = 0; 163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::replay(OpenGLRenderer& renderer) { 166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int saveCount = renderer.getSaveCount() - 1; 170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy switch (mReader.readInt()) { 173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case AcquireContext: { 174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.acquireContext(); 175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ReleaseContext: { 178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.releaseContext(); 179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.save(getInt()); 183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restoreToCount(saveCount + getInt()); 191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(), 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getPaint(), getInt()); 196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.translate(getFloat(), getFloat()); 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.rotate(getFloat()); 204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.scale(getFloat(), getFloat()); 208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.setMatrix(getMatrix()); 212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.concatMatrix(getMatrix()); 216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(), 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy (SkRegion::Op) getInt()); 221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint()); 225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getMatrix(), getPaint()); 229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(), 233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 2394bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 2424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 2484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount, 2514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawColor(getInt(), (SkXfermode::Mode) getInt()); 256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint()); 260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawPath(getPath(), getPaint()); 264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int count = 0; 268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawLines(points, count, getPaint()); 270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawText: { 273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getText(&text); 274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.drawText(text.text(), text.length(), getInt(), 275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getFloat(), getFloat(), getPaint()); 276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy // TODO: Implement 284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy // TODO: Implement 292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt()); 300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer(): 3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) { 3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mBitmapIndex = mMatrixIndex = mPaintIndex = 1; 3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap = NULL; 3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (mPathHeap) { 3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap->unref(); 3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPathHeap = NULL; 3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mBitmaps.reset(); 3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mMatrices.reset(); 3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mPaints.reset(); 3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mHeap.reset(); 3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mRCRecorder.reset(); 3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mTFRecorder.reset(); 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3486b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) { 349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 354b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() { 356b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::AcquireContext); 3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::acquireContext(); 3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() { 361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ReleaseContext); 3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::releaseContext(); 3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Restore); 3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::RestoreToCount); 3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(saveCount); 3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy const SkPaint* p, int flags) { 384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Translate); 3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 423b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, 4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy const SkPaint* paint) { 431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmap); 4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix, 4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy const SkPaint* paint) { 439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmapMatrix); 4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 4414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float dstRight, float dstBottom, const SkPaint* paint) { 448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawBitmapRect); 4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 4564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 4574bb942083a0d4db746adf95349108dd8ef842e32Romain Guy float left, float top, float right, float bottom, const SkPaint* paint) { 458b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawPatch); 4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 4624bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy const SkPaint* paint) { 475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawRect); 4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawPath); 4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawLines(float* points, int count, const SkPaint* paint) { 487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float x, float y, SkPaint* paint) { 494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawText); 4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addText(text, bytesCount); 4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(count); 4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(x, y); 4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 502b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::resetShader(); 5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy // TODO: Implement 5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setupShader(shader); 5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::resetColorFilter(); 5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy // TODO: Implement 5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setupColorFilter(filter); 5194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::resetShadow(); 5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 5304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setupShadow(radius, dx, dy, color); 5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Recording management 5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatPaint*>& paints, const SkPaint* paint) { 5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (paint == NULL) { 5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return 0; 5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkFlatPaint* flat = SkFlatPaint::Flatten(&mHeap, *paint, mPaintIndex, 5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy &mRCRecorder, &mTFRecorder); 5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(), 5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); 5474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (index >= 0) { 5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy (void) mHeap.unalloc(flat); 5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return paints[index]->index(); 5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy index = ~index; 5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *paints.insert(index) = flat; 5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return mPaintIndex++; 5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatMatrix*>& matrices, const SkMatrix* matrix) { 5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (matrix == NULL) { 5594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return 0; 5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkFlatMatrix* flat = SkFlatMatrix::Flatten(&mHeap, *matrix, mMatrixIndex); 5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(), 5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); 5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (index >= 0) { 5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy (void) mHeap.unalloc(flat); 5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return matrices[index]->index(); 5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy index = ~index; 5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *matrices.insert(index) = flat; 5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return mMatrixIndex++; 5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatBitmap*>& bitmaps, const SkBitmap& bitmap) { 5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkFlatBitmap* flat = SkFlatBitmap::Flatten(&mHeap, bitmap, mBitmapIndex, &mRCRecorder); 5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(), 5774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare); 5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy if (index >= 0) { 5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy (void) mHeap.unalloc(flat); 5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return bitmaps[index]->index(); 5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy index = ~index; 5834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *bitmaps.insert(index) = flat; 5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return mBitmapIndex++; 5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 589