DisplayListRenderer.cpp revision 0f6675332c04c74909425d1d328f02b32c0ff40e
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 19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h> 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h> 226554943a1dd6854c0f4976900956e556767b49e1Romain Guy 230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "DisplayList.h" 24c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h" 259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include "DisplayListOp.h" 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h" 2913631f3da855f200a151e7837ed9f6b079622b58Romain Guy 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3358ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer(): 342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mCaches(Caches::getInstance()), mDisplayListData(new DisplayListData), 3554c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), 3654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mHasDrawOps(false), mFunctorCount(0) { 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData = new DisplayListData(); 4558ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.lock(); 4658ecc204fbcacef34806290492384677a330d4d4Romain Guy 475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 4858ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i)); 495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 50d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 5149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) { 5258ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i)); 5349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 5449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 55d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 5658ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i)); 57d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 58d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 5943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 6058ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i)); 6143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy } 6243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy 63d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase for (size_t i = 0; i < mSourcePaths.size(); i++) { 6458ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); 65d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 6658ecc204fbcacef34806290492384677a330d4d4Romain Guy 67603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < mLayers.size(); i++) { 68603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); 69603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 70603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 7158ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.unlock(); 7258ecc204fbcacef34806290492384677a330d4d4Romain Guy 7358ecc204fbcacef34806290492384677a330d4d4Romain Guy mBitmapResources.clear(); 7458ecc204fbcacef34806290492384677a330d4d4Romain Guy mOwnedBitmapResources.clear(); 7558ecc204fbcacef34806290492384677a330d4d4Romain Guy mFilterResources.clear(); 76d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.clear(); 77d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 7858ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaders.clear(); 7958ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaderMap.clear(); 8058ecc204fbcacef34806290492384677a330d4d4Romain Guy 8143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaints.clear(); 8243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaintMap.clear(); 83d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 84735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegions.clear(); 85735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegionMap.clear(); 86735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.clear(); 89d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 90d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 9104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 92603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.clear(); 93603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 9404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = false; 9554c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount = 0; 964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 102162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) { 103162a0217563f4665da6eb183dfce0fef740f641fJeff Brown if (!displayList) { 104162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList = new DisplayList(*this); 1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 106162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList->initFromDisplayListRenderer(*this, true); 1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 10804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy displayList->setRenderable(mHasDrawOps); 109162a0217563f4665da6eb183dfce0fef740f641fJeff Brown return displayList; 1105977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase 11249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() { 11349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy return true; 11449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy} 11549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1237c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guystatus_t DisplayListRenderer::prepareDirty(float left, float top, 1247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy float right, float bottom, bool opaque) { 125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 12845e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 13045e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy mDirtyClip = opaque; 13145e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 13227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 13345e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 13444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 13527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 13627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 13727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() { 13827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 1392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 142daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() { 143daf98e941e140e8739458126640183b9f296a2abChet Haase} 144daf98e941e140e8739458126640183b9f296a2abChet Haase 1452b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() { 1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1486554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { 149cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // Ignore dirty during recording, it matters only when we replay 1502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawFunctorOp(functor)); 15154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount++; 1526554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 153daf98e941e140e8739458126640183b9f296a2abChet Haase} 154daf98e941e140e8739458126640183b9f296a2abChet Haase 1554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 1562af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SaveOp(flags)); 1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 1584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 16104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 16233f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 16333f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 16404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 16533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 16633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 1672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 17227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 1732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 1792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, p, flags)); 180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 1814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 1845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 1852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SaveLayerAlphaOp(left, top, right, bottom, alpha, flags)); 1865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 1875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 1885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 1894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 19033f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = true; 19133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 19233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 19333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 1982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) RotateOp(degrees)); 1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 2032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ScaleOp(sx, sy)); 2044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 2054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 207807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) { 2082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SkewOp(sx, sy)); 209807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy OpenGLRenderer::skew(sx, sy); 210807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 211807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 2132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik matrix = refMatrix(matrix); 2142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetMatrixOp(matrix)); 2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 2192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik matrix = refMatrix(matrix); 2202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ConcatMatrixOp(matrix)); 2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 2262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op)); 2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 230735738c4ddf3229caa5f6e634bf591953ac29944Romain Guybool DisplayListRenderer::clipPath(SkPath* path, SkRegion::Op op) { 2312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 2322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipPathOp(path, op)); 233735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return OpenGLRenderer::clipPath(path, op); 234735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 235735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 236735738c4ddf3229caa5f6e634bf591953ac29944Romain Guybool DisplayListRenderer::clipRegion(SkRegion* region, SkRegion::Op op) { 2372af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik region = refRegion(region); 2382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRegionOp(region, op)); 239735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return OpenGLRenderer::clipRegion(region, op); 240735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 241735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 2426554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, 243c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik Rect& dirty, int32_t flags) { 244cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // dirty is an out parameter and should not be recorded, 245cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // it matters only when replaying the display list 246b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase 2472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik // TODO: To be safe, the display list should be ref-counted in the 2482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik // resources cache, but we rely on the caller (UI toolkit) to 2492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik // do the right thing for now 2502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawDisplayListOp(displayList, flags)); 2526554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; 2530fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 2540fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 255486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { 2562af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mLayers.add(layer); 2572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mCaches.resourceCache.incrementRefcount(layer); 2582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2592af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawLayerOp(layer, x, y, paint)); 261486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 2626c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 2636c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 264486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { 2652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmap(bitmap); 2662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2682af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawBitmapOp(bitmap, left, top, paint)); 269486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 272486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) { 2732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmap(bitmap); 2742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik matrix = refMatrix(matrix); 2752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2762af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2772af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawBitmapMatrixOp(bitmap, matrix, paint)); 278486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 281486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 2835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 2842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmap(bitmap); 2852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawBitmapRectOp(bitmap, 2882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik srcLeft, srcTop, srcRight, srcBottom, 2892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 290486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 2914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 293486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, 294486590963e2207d68eebd6944fec70d50d41116aChet Haase SkPaint* paint) { 2952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmapData(bitmap); 2962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 2982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawBitmapDataOp(bitmap, left, top, paint)); 299486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 300e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy} 301e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 302486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 3035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint) { 3042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik int count = (meshWidth + 1) * (meshHeight + 1) * 2; 3052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmap(bitmap); 3062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik vertices = refBuffer<float>(vertices, count); 3072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik colors = refBuffer<int>(colors, count); 3092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawBitmapMeshOp(bitmap, meshWidth, meshHeight, 3112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik vertices, colors, paint)); 312486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 3145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 315486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, 316486590963e2207d68eebd6944fec70d50d41116aChet Haase const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height, 317486590963e2207d68eebd6944fec70d50d41116aChet Haase int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) { 318be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha; 319be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode; 320be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode); 321be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 3222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik bitmap = refBitmap(bitmap); 3232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik xDivs = refBuffer<int>(xDivs, width); 3242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik yDivs = refBuffer<int>(yDivs, height); 3252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik colors = refBuffer<uint32_t>(colors, numColors); 3262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawPatchOp(bitmap, xDivs, yDivs, colors, width, height, numColors, 3282af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik left, top, right, bottom, alpha, mode)); 329486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 332486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 3332af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawColorOp(color, mode)); 334486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 337486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 3385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 3392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, paint)); 341486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 344486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, 345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float rx, float ry, SkPaint* paint) { 3462af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, paint)); 348486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 34901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 35001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 351486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { 3522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, paint)); 354486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 35501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 35601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 357486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom, 358c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy SkPaint* paint) { 3592af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, paint)); 361486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 362c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 363c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 364486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom, 3658b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { 3662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom, 3682af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik startAngle, sweepAngle, useCenter, paint)); 369486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3708b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 3718b2f5267f16c295f12faab810527cd6311997e34Romain Guy 372486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 3732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 3742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3762af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawPathOp(path, paint)); 377486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 380486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 3812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 3822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawLinesOp(points, count, paint)); 385486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 386ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 387ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 388486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { 3892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 3902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawPointsOp(points, count, paint)); 393486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 396996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, 397996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPath* path, float hOffset, float vOffset, SkPaint* paint) { 398996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 3992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik text = refText(text, bytesCount); 4012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 4022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik DrawOp* op = new (alloc()) DrawTextOnPathOp(text, bytesCount, count, path, 4052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik hOffset, vOffset, paint); 4060f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 407996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 408996e57c84368058be793897ebc355b917a59abc2Raph Levien} 409996e57c84368058be793897ebc355b917a59abc2Raph Levien 410996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, 411996e57c84368058be793897ebc355b917a59abc2Raph Levien const float* positions, SkPaint* paint) { 412996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 4132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik text = refText(text, bytesCount); 4152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik DrawOp* op = new (alloc()) DrawPosTextOp(text, bytesCount, count, positions, paint); 4190f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 420996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 421996e57c84368058be793897ebc355b917a59abc2Raph Levien} 422996e57c84368058be793897ebc355b917a59abc2Raph Levien 423c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 424996e57c84368058be793897ebc355b917a59abc2Raph Levien float x, float y, const float* positions, SkPaint* paint, float length) { 425486590963e2207d68eebd6944fec70d50d41116aChet Haase if (!text || count <= 0) return DrawGlInfo::kStatusDone; 42633f6beb10f98e8ba96250e284876d607055d278dRomain Guy 42733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (length < 0.0f) length = paint->measureText(text, bytesCount); 42833f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik text = refText(text, bytesCount); 4302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 43233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4332af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, x, y, positions, paint, length); 4340f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 435486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 436672433d90fab7383cd28beac9d4485b566a90940Romain Guy} 437672433d90fab7383cd28beac9d4485b566a90940Romain Guy 438672433d90fab7383cd28beac9d4485b566a90940Romain Guystatus_t DisplayListRenderer::drawRects(const float* rects, int count, SkPaint* paint) { 439672433d90fab7383cd28beac9d4485b566a90940Romain Guy if (count <= 0) return DrawGlInfo::kStatusDone; 440672433d90fab7383cd28beac9d4485b566a90940Romain Guy 4412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik rects = refBuffer<float>(rects, count); 4422af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint)); 444672433d90fab7383cd28beac9d4485b566a90940Romain Guy return DrawGlInfo::kStatusDone; 445eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 446eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 4482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ResetShaderOp()); 4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 4522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik shader = refShader(shader); 4532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetupShaderOp(shader)); 4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 4572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ResetColorFilterOp()); 4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 4612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik filter = refColorFilter(filter); 4622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetupColorFilterOp(filter)); 4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 4662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ResetShadowOp()); 4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 4702af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color)); 4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() { 4742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ResetPaintFilterOp()); 4755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 4765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 4775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) { 4782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetupPaintFilterOp(clearBits, setBits)); 4792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4802af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertRestoreToCount() { 4822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mRestoreSaveCount >= 0) { 4832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik DisplayListOp* op = new (alloc()) RestoreToCountOp(mRestoreSaveCount); 4842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData->displayListOps.add(op); 4852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mRestoreSaveCount = -1; 4862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 4872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertTranslate() { 4902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mHasTranslate) { 4912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 4922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik DisplayListOp* op = new (alloc()) TranslateOp(mTranslateX, mTranslateY); 4932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData->displayListOps.add(op); 4942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mTranslateX = mTranslateY = 0.0f; 4952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 4962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mHasTranslate = false; 4972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 4982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 5002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::addStateOp(StateOp* op) { 5012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addOpInternal(op); 5022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 5040f6675332c04c74909425d1d328f02b32c0ff40eRomain Guyvoid DisplayListRenderer::addDrawOp(DrawOp* op) { 5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik Rect localBounds; 5062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (op->getLocalBounds(localBounds)) { 5070f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top, 5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik localBounds.right, localBounds.bottom); 5092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik op->setQuickRejected(rejected); 5102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mHasDrawOps = true; 5122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addOpInternal(op); 5135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 517