DisplayListRenderer.cpp revision c3566d06421c8acc0aafb18f7e307e5725ce87e1
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);
4062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (addDrawOp(op)) {
4072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        // precache if draw operation is visible
4082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
4092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        fontRenderer.precache(paint, text, count, *mSnapshot->transform);
4102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
411996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
412996e57c84368058be793897ebc355b917a59abc2Raph Levien}
413996e57c84368058be793897ebc355b917a59abc2Raph Levien
414996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
415996e57c84368058be793897ebc355b917a59abc2Raph Levien        const float* positions, SkPaint* paint) {
416996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
4172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
4192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
4202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
4212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawPosTextOp(text, bytesCount, count, positions, paint);
4232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (addDrawOp(op)) {
4242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        // precache if draw operation is visible
4252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
4262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        fontRenderer.precache(paint, text, count, *mSnapshot->transform);
4272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
428996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
429996e57c84368058be793897ebc355b917a59abc2Raph Levien}
430996e57c84368058be793897ebc355b917a59abc2Raph Levien
431c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
432996e57c84368058be793897ebc355b917a59abc2Raph Levien        float x, float y, const float* positions, SkPaint* paint, float length) {
433486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
43433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
43533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
43633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
4372af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
4382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
4392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
44033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
4412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, x, y, positions, paint, length);
4422af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (addDrawOp(op)) {
4432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        // precache if draw operation is visible
4442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
4452af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        fontRenderer.precache(paint, text, count, *mSnapshot->transform);
446e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
447486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
448672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
449672433d90fab7383cd28beac9d4485b566a90940Romain Guy
450672433d90fab7383cd28beac9d4485b566a90940Romain Guystatus_t DisplayListRenderer::drawRects(const float* rects, int count, SkPaint* paint) {
451672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (count <= 0) return DrawGlInfo::kStatusDone;
452672433d90fab7383cd28beac9d4485b566a90940Romain Guy
4532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    rects = refBuffer<float>(rects, count);
4542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
4552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint));
456672433d90fab7383cd28beac9d4485b566a90940Romain Guy    return DrawGlInfo::kStatusDone;
457eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
458eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
4602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShaderOp());
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
4642af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    shader = refShader(shader);
4652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShaderOp(shader));
4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
4692af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetColorFilterOp());
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
4732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    filter = refColorFilter(filter);
4742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupColorFilterOp(filter));
4754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
4782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShadowOp());
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
4822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
4862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetPaintFilterOp());
4875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
4885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
4895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
4902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupPaintFilterOp(clearBits, setBits));
4912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertRestoreToCount() {
4942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mRestoreSaveCount >= 0) {
4952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        DisplayListOp* op = new (alloc()) RestoreToCountOp(mRestoreSaveCount);
4962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mDisplayListData->displayListOps.add(op);
4972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mRestoreSaveCount = -1;
4982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
4992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
5002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertTranslate() {
5022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mHasTranslate) {
5032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
5042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            DisplayListOp* op = new (alloc()) TranslateOp(mTranslateX, mTranslateY);
5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mDisplayListData->displayListOps.add(op);
5062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mTranslateX = mTranslateY = 0.0f;
5072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        }
5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mHasTranslate = false;
5092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
5102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
5112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::addStateOp(StateOp* op) {
5132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
5142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
5152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikbool DisplayListRenderer::addDrawOp(DrawOp* op) {
5172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bool rejected = false;
5182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    Rect localBounds;
5192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (op->getLocalBounds(localBounds)) {
5202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
5212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                localBounds.right, localBounds.bottom);
5222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        op->setQuickRejected(rejected);
5232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
5242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    mHasDrawOps = true;
5252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
5262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    return !rejected;
5275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
5285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
531