DisplayListRenderer.cpp revision d44fbe55a9f434cb5bb0e34c143ba1445141990d
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>
20c46d07a29e94807e768f8b162ce9f77a88ba6f46Romain Guy#include <SkCanvas.h>
219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
236554943a1dd6854c0f4976900956e556767b49e1Romain Guy
240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "DisplayList.h"
25c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h"
269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include "DisplayListOp.h"
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
3013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3458ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer():
352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mCaches(Caches::getInstance()), mDisplayListData(new DisplayListData),
3654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false),
3754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mHasDrawOps(false), mFunctorCount(0) {
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
452af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    mDisplayListData = new DisplayListData();
4658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.lock();
4758ecc204fbcacef34806290492384677a330d4d4Romain Guy
485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
4958ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
51d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
5249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
5358ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i));
5449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
5549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
56d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
5758ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
58d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
59d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
60e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    for (size_t i = 0; i < mPatchResources.size(); i++) {
61e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mPatchResources.itemAt(i));
62e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
63e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
6443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
6558ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
6643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
6743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
68d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
6958ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
70d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
7158ecc204fbcacef34806290492384677a330d4d4Romain Guy
72603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < mLayers.size(); i++) {
73603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
74603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
75603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
7658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.unlock();
7758ecc204fbcacef34806290492384677a330d4d4Romain Guy
7858ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
7958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
8058ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
81e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    mPatchResources.clear();
82d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
83d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
8458ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
8558ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaderMap.clear();
8658ecc204fbcacef34806290492384677a330d4d4Romain Guy
8743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
8843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
89d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
90735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    mRegions.clear();
91735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    mRegionMap.clear();
92735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
95d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
96d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
9704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
98603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    mLayers.clear();
99603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
10004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
10154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount = 0;
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
108162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
109162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
110162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
112162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
114f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    // TODO: should just avoid setting the DisplayList's DisplayListData
11504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
116162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
120f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    // TODO: DisplayListRenderer shouldn't have a projection matrix, as it should never be used
121f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    mViewProjMatrix.loadOrtho(0, width, height, 0, -1, 1);
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
12314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    initializeViewport(width, height);
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1267c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guystatus_t DisplayListRenderer::prepareDirty(float left, float top,
1277d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
12814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    initializeSaveStack(0, 0, getWidth(), getHeight());
12945e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
13045e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy    mDirtyClip = opaque;
13127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
13245e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
13344b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
13427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
13527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
13627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
13727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
1382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
141daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
142daf98e941e140e8739458126640183b9f296a2abChet Haase}
143daf98e941e140e8739458126640183b9f296a2abChet Haase
1442b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1476554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
148cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawFunctorOp(functor));
15054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount++;
1516554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
152daf98e941e140e8739458126640183b9f296a2abChet Haase}
153daf98e941e140e8739458126640183b9f296a2abChet Haase
1544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SaveOp(flags));
15614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    return StatefulBaseRenderer::save(flags);
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
16004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
16133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
16233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
16304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
16433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
16533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
1662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
16714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::restore();
1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
17127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
1722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
17314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::restoreToCount(saveCount);
1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
176f533e947035795a485344f4c270e16507f974901Chris Craikvoid DisplayListRenderer::onSnapshotRestored(const Snapshot& removed, const Snapshot& restored) {
177f533e947035795a485344f4c270e16507f974901Chris Craik    bool restoreProjection = removed.flags & Snapshot::kFlagProjectionTarget;
178f533e947035795a485344f4c270e16507f974901Chris Craik    if (restoreProjection) {
179f533e947035795a485344f4c270e16507f974901Chris Craik        mDisplayListData->projectionIndex = mDisplayListData->displayListOps.size() - 1;
180f533e947035795a485344f4c270e16507f974901Chris Craik        mDisplayListData->projectionTransform.load(*currentTransform());
181f533e947035795a485344f4c270e16507f974901Chris Craik    }
182f533e947035795a485344f4c270e16507f974901Chris Craik}
183f533e947035795a485344f4c270e16507f974901Chris Craik
1844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
185d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger        const SkPaint* paint, int flags) {
186d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger    paint = refPaint(paint);
187d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger    addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, paint, flags));
18814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    return StatefulBaseRenderer::save(flags);
1895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
1905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
191b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikvoid DisplayListRenderer::translate(float dx, float dy, float dz) {
192b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik    // ignore dz, not used at defer time
19333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
19433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
19533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
19633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
19714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::translate(dx, dy, dz);
1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) RotateOp(degrees));
20214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::rotate(degrees);
2034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
2062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ScaleOp(sx, sy));
20714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::scale(sx, sy);
2084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
210807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
2112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SkewOp(sx, sy));
21214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::skew(sx, sy);
213807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
214807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
215d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid DisplayListRenderer::setMatrix(const SkMatrix* matrix) {
2162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
2172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetMatrixOp(matrix));
21814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::setMatrix(matrix);
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
221d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid DisplayListRenderer::concatMatrix(const SkMatrix* matrix) {
2222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
2232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ConcatMatrixOp(matrix));
22414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::concatMatrix(matrix);
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
2292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op));
230d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipRect(left, top, right, bottom, op);
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
233d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikbool DisplayListRenderer::clipPath(const SkPath* path, SkRegion::Op op) {
2342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
2352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipPathOp(path, op));
236d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipPath(path, op);
237735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
238735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
239d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikbool DisplayListRenderer::clipRegion(const SkRegion* region, SkRegion::Op op) {
2402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    region = refRegion(region);
2412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipRegionOp(region, op));
242d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipRegion(region, op);
243735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
244735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
2456554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
246c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        Rect& dirty, int32_t flags) {
247cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
248cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
249b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
2502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    // TODO: To be safe, the display list should be ref-counted in the
2512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    //       resources cache, but we rely on the caller (UI toolkit) to
2522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    //       do the right thing for now
2532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
254d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    DrawDisplayListOp* op = new (alloc()) DrawDisplayListOp(displayList,
255d6b65f67717025b1162f86f04e2caa5723566cacChris Craik            flags, *currentTransform());
256f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    addDrawOp(op);
257f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    mDisplayListData->children.push(op);
258f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik
2596554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
2600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
2610fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
262a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craikstatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y) {
263ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy    layer = refLayer(layer);
264a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    addDrawOp(new (alloc()) DrawLayerOp(layer, x, y));
265486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
2676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
268d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, float left, float top,
269d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2702af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
27355b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy    addDrawOp(new (alloc()) DrawBitmapOp(bitmap, left, top, paint));
274486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
277d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, const SkMatrix* matrix,
278d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2802af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
2812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapMatrixOp(bitmap, matrix, paint));
284486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
287d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
289d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float dstRight, float dstBottom, const SkPaint* paint) {
2902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
293527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    if (srcLeft == 0 && srcTop == 0 &&
294527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            srcRight == bitmap->width() && srcBottom == bitmap->height() &&
295527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            (srcBottom - srcTop == dstBottom - dstTop) &&
296527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            (srcRight - srcLeft == dstRight - dstLeft)) {
297527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        // transform simple rect to rect drawing case into position bitmap ops, since they merge
29855b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy        addDrawOp(new (alloc()) DrawBitmapOp(bitmap, dstLeft, dstTop, paint));
299527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return DrawGlInfo::kStatusDone;
300527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
301527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
3022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapRectOp(bitmap,
3032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    srcLeft, srcTop, srcRight, srcBottom,
3042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    dstLeft, dstTop, dstRight, dstBottom, paint));
305486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
308d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmapData(const SkBitmap* bitmap, float left, float top,
309d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
3102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmapData(bitmap);
3112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapDataOp(bitmap, left, top, paint));
314486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
315e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
316e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
317d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
318d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const float* vertices, const int* colors, const SkPaint* paint) {
3192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    int count = (meshWidth + 1) * (meshHeight + 1) * 2;
3202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
3212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    vertices = refBuffer<float>(vertices, count);
3222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    colors = refBuffer<int>(colors, count);
3242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapMeshOp(bitmap, meshWidth, meshHeight,
3262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    vertices, colors, paint));
327486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
3295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
330d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
331d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float left, float top, float right, float bottom, const SkPaint* paint) {
3322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
333e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    patch = refPatch(patch);
33416ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy    paint = refPaint(paint);
3352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
33603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy    addDrawOp(new (alloc()) DrawPatchOp(bitmap, patch, left, top, right, bottom, paint));
337486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
340486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
3412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawColorOp(color, mode));
342486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
345486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
346d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
3472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, paint));
349486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
352486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
353d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float rx, float ry, const SkPaint* paint) {
3542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, paint));
356486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
35701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
35801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
359d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, const SkPaint* paint) {
3602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, paint));
362486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
36301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
36401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
365486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
366d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
3672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3682af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, paint));
369486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
370c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
371c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
372486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
373d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) {
3742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom,
3762af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    startAngle, sweepAngle, useCenter, paint));
377486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3788b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
3798b2f5267f16c295f12faab810527cd6311997e34Romain Guy
380d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPath(const SkPath* path, const SkPaint* paint) {
3812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
3822af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawPathOp(path, paint));
385486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
388d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawLines(const float* points, int count, const SkPaint* paint) {
3892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    points = refBuffer<float>(points, count);
3902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawLinesOp(points, count, paint));
393486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
394ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
395ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
396d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPoints(const float* points, int count, const SkPaint* paint) {
3972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    points = refBuffer<float>(points, count);
3982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawPointsOp(points, count, paint));
401486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
404996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
405d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPath* path, float hOffset, float vOffset, const SkPaint* paint) {
406996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
4072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
4092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
4102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
4112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawTextOnPathOp(text, bytesCount, count, path,
4132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            hOffset, vOffset, paint);
4140f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
415996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
416996e57c84368058be793897ebc355b917a59abc2Raph Levien}
417996e57c84368058be793897ebc355b917a59abc2Raph Levien
418996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
419d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const float* positions, const SkPaint* paint) {
420996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
4212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
4232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
4242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
4252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawPosTextOp(text, bytesCount, count, positions, paint);
4270f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
428996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
429996e57c84368058be793897ebc355b917a59abc2Raph Levien}
430996e57c84368058be793897ebc355b917a59abc2Raph Levien
431c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
432d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float x, float y, const float* positions, const SkPaint* paint,
43341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        float totalAdvance, const Rect& bounds, DrawOpMode drawOpMode) {
434527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
435486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
43633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
4372af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
4382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
4392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
44033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
44141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count,
44241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            x, y, positions, paint, totalAdvance, bounds);
4430f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
444486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
445672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
446672433d90fab7383cd28beac9d4485b566a90940Romain Guy
447d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawRects(const float* rects, int count, const SkPaint* paint) {
448672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (count <= 0) return DrawGlInfo::kStatusDone;
449672433d90fab7383cd28beac9d4485b566a90940Romain Guy
4502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    rects = refBuffer<float>(rects, count);
4512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
4522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint));
453672433d90fab7383cd28beac9d4485b566a90940Romain Guy    return DrawGlInfo::kStatusDone;
454eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
455eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
4572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShaderOp());
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
4612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    shader = refShader(shader);
4622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShaderOp(shader));
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
4662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetColorFilterOp());
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
4702af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    filter = refColorFilter(filter);
4712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupColorFilterOp(filter));
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
4752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShadowOp());
4769b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    OpenGLRenderer::resetShadow();
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
4802af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
4819b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    OpenGLRenderer::setupShadow(radius, dx, dy, color);
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
4852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetPaintFilterOp());
4865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
4875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
4885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
4892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupPaintFilterOp(clearBits, setBits));
4902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertRestoreToCount() {
4932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mRestoreSaveCount >= 0) {
4942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        DisplayListOp* op = new (alloc()) RestoreToCountOp(mRestoreSaveCount);
4952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mDisplayListData->displayListOps.add(op);
4962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mRestoreSaveCount = -1;
4972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
4982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertTranslate() {
5012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mHasTranslate) {
5022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
5032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            DisplayListOp* op = new (alloc()) TranslateOp(mTranslateX, mTranslateY);
5042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mDisplayListData->displayListOps.add(op);
5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mTranslateX = mTranslateY = 0.0f;
5062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        }
5072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mHasTranslate = false;
5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
5092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
5102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::addStateOp(StateOp* op) {
5122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
5132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
5142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
5150f6675332c04c74909425d1d328f02b32c0ff40eRomain Guyvoid DisplayListRenderer::addDrawOp(DrawOp* op) {
5162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    Rect localBounds;
517c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik    if (op->getLocalBounds(mDrawModifiers, localBounds)) {
518f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik        bool rejected = quickRejectConservative(localBounds.left, localBounds.top,
5192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                localBounds.right, localBounds.bottom);
5202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        op->setQuickRejected(rejected);
5212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
522c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik
5232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    mHasDrawOps = true;
5242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
5255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
5265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
529