DisplayListRenderer.cpp revision 113e0824d6bddf4376240681f9cf6a2deded9498
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
24113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "Caches.h"
25c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h"
269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include "DisplayListOp.h"
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
29113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderNode.h"
3013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3458ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer():
35eea6ef9c767c734797912022113191dd255c4ae6Chris Craik        mCaches(Caches::getInstance()), mDisplayListData(0),
3654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false),
37eea6ef9c767c734797912022113191dd255c4ae6Chris Craik        mRestoreSaveCount(-1) {
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
4144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    LOG_ALWAYS_FATAL_IF(mDisplayListData,
4244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            "Destroyed a DisplayListRenderer during a record!");
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck///////////////////////////////////////////////////////////////////////////////
4644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck// Operations
4744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck///////////////////////////////////////////////////////////////////////////////
48d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
4944fd8d24f761f82d21e9b00932648a1b6bf91449John ReckDisplayListData* DisplayListRenderer::finishRecording() {
5058ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaderMap.clear();
5143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
52735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    mRegionMap.clear();
532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
5444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    DisplayListData* data = mDisplayListData;
5544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    mDisplayListData = 0;
5644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    return data;
575977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
585977baa1fa24125c148a72699b53e62abaf08960Chet Haase
59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
60f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    // TODO: DisplayListRenderer shouldn't have a projection matrix, as it should never be used
61f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    mViewProjMatrix.loadOrtho(0, width, height, 0, -1, 1);
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    initializeViewport(width, height);
64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
65b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
667c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guystatus_t DisplayListRenderer::prepareDirty(float left, float top,
677d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
6844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
6944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    LOG_ALWAYS_FATAL_IF(mDisplayListData,
7044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            "prepareDirty called a second time during a recording!");
7144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    mDisplayListData = new DisplayListData();
7244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    initializeSaveStack(0, 0, getWidth(), getHeight());
7445e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
7545e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy    mDirtyClip = opaque;
7627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
7745e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
7844b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
7927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
8027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
8127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
8227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
84b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
85b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
86daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
87daf98e941e140e8739458126640183b9f296a2abChet Haase}
88daf98e941e140e8739458126640183b9f296a2abChet Haase
892b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
926554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
93cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawFunctorOp(functor));
9544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    mDisplayListData->functorCount++;
966554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
97daf98e941e140e8739458126640183b9f296a2abChet Haase}
98daf98e941e140e8739458126640183b9f296a2abChet Haase
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SaveOp(flags));
10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    return StatefulBaseRenderer::save(flags);
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
10504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
10633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
10733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
10804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
10933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
11033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
1112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::restore();
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
11627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
1172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    insertTranslate();
11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::restoreToCount(saveCount);
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
122d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger        const SkPaint* paint, int flags) {
123d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger    paint = refPaint(paint);
124d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger    addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, paint, flags));
12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    return StatefulBaseRenderer::save(flags);
1265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
1275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
128b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craikvoid DisplayListRenderer::translate(float dx, float dy, float dz) {
129b458942bb6e6cf13c68341dda35ef5cee060f5aeChris Craik    // ignore dz, not used at defer time
13033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
13133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
13233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
13333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::translate(dx, dy, dz);
1354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) RotateOp(degrees));
13914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::rotate(degrees);
1404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ScaleOp(sx, sy));
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::scale(sx, sy);
1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
147807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SkewOp(sx, sy));
14914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::skew(sx, sy);
150807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
151807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
152d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid DisplayListRenderer::setMatrix(const SkMatrix* matrix) {
1532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
1542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetMatrixOp(matrix));
15514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::setMatrix(matrix);
1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
158d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikvoid DisplayListRenderer::concatMatrix(const SkMatrix* matrix) {
1592af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
1602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ConcatMatrixOp(matrix));
16114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    StatefulBaseRenderer::concatMatrix(matrix);
1624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
1654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op));
167d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipRect(left, top, right, bottom, op);
1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
170d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikbool DisplayListRenderer::clipPath(const SkPath* path, SkRegion::Op op) {
1712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
1722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipPathOp(path, op));
173d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipPath(path, op);
174735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
175735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
176d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikbool DisplayListRenderer::clipRegion(const SkRegion* region, SkRegion::Op op) {
1772af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    region = refRegion(region);
1782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ClipRegionOp(region, op));
179d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    return StatefulBaseRenderer::clipRegion(region, op);
180735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
181735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
182e18264b079481a244b30e3f71012c53bbd861f92John Reckstatus_t DisplayListRenderer::drawDisplayList(RenderNode* displayList,
183c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik        Rect& dirty, int32_t flags) {
184cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
185cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
186b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    // TODO: To be safe, the display list should be ref-counted in the
1882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    //       resources cache, but we rely on the caller (UI toolkit) to
1892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    //       do the right thing for now
1902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
191d6b65f67717025b1162f86f04e2caa5723566cacChris Craik    DrawDisplayListOp* op = new (alloc()) DrawDisplayListOp(displayList,
192d6b65f67717025b1162f86f04e2caa5723566cacChris Craik            flags, *currentTransform());
193f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    addDrawOp(op);
194f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik    mDisplayListData->children.push(op);
1951df26446b7eac7050767c38ca977fde03a41a033Chris Craik    if (displayList->isProjectionReceiver()) {
1961df26446b7eac7050767c38ca977fde03a41a033Chris Craik        mDisplayListData->projectionReceiveIndex = mDisplayListData->displayListOps.size() - 1;
1971df26446b7eac7050767c38ca977fde03a41a033Chris Craik    }
198f57776b2d195f0937906eb88b777bb55ccc36967Chris Craik
1996554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
2000fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
2010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
202a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craikstatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y) {
203ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy    layer = refLayer(layer);
204a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    addDrawOp(new (alloc()) DrawLayerOp(layer, x, y));
205486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
2076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
208d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, float left, float top,
209d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
21355b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy    addDrawOp(new (alloc()) DrawBitmapOp(bitmap, left, top, paint));
214486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
217d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, const SkMatrix* matrix,
218d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    matrix = refMatrix(matrix);
2212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapMatrixOp(bitmap, matrix, paint));
224486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
227d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
229d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float dstRight, float dstBottom, const SkPaint* paint) {
2302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
233527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    if (srcLeft == 0 && srcTop == 0 &&
234527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            srcRight == bitmap->width() && srcBottom == bitmap->height() &&
235527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            (srcBottom - srcTop == dstBottom - dstTop) &&
236527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            (srcRight - srcLeft == dstRight - dstLeft)) {
237527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        // transform simple rect to rect drawing case into position bitmap ops, since they merge
23855b6f95ee4ace96c97508bcd14483fb4e9dbeaa0Romain Guy        addDrawOp(new (alloc()) DrawBitmapOp(bitmap, dstLeft, dstTop, paint));
239527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return DrawGlInfo::kStatusDone;
240527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
241527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
2422af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapRectOp(bitmap,
2432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    srcLeft, srcTop, srcRight, srcBottom,
2442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    dstLeft, dstTop, dstRight, dstBottom, paint));
245486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
248d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmapData(const SkBitmap* bitmap, float left, float top,
249d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmapData(bitmap);
2512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapDataOp(bitmap, left, top, paint));
254486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
255e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
256e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
257d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
258d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const float* vertices, const int* colors, const SkPaint* paint) {
2592af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    int count = (meshWidth + 1) * (meshHeight + 1) * 2;
2602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
2612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    vertices = refBuffer<float>(vertices, count);
2622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    colors = refBuffer<int>(colors, count);
2642af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
2652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawBitmapMeshOp(bitmap, meshWidth, meshHeight,
2662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    vertices, colors, paint));
267486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
2695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
270d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
271d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float left, float top, float right, float bottom, const SkPaint* paint) {
2722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    bitmap = refBitmap(bitmap);
273e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    patch = refPatch(patch);
27416ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy    paint = refPaint(paint);
2752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
27603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy    addDrawOp(new (alloc()) DrawPatchOp(bitmap, patch, left, top, right, bottom, paint));
277486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
280486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
2812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawColorOp(color, mode));
282486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
285486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
286d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
2872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, paint));
289486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
2914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
292486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
293d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float rx, float ry, const SkPaint* paint) {
2942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
2952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, paint));
296486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
29701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
29801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
299d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, const SkPaint* paint) {
3002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, paint));
302486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
30301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
30401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
305486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
306d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paint) {
3072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, paint));
309486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
310c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
311c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
312486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
313d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint) {
3142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom,
3162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                    startAngle, sweepAngle, useCenter, paint));
317486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3188b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
3198b2f5267f16c295f12faab810527cd6311997e34Romain Guy
320d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPath(const SkPath* path, const SkPaint* paint) {
3212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
3222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawPathOp(path, paint));
325486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
328d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawLines(const float* points, int count, const SkPaint* paint) {
3292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    points = refBuffer<float>(points, count);
3302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawLinesOp(points, count, paint));
333486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
334ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
335ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
336d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawPoints(const float* points, int count, const SkPaint* paint) {
3372af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    points = refBuffer<float>(points, count);
3382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawPointsOp(points, count, paint));
341486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
344996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
345d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPath* path, float hOffset, float vOffset, const SkPaint* paint) {
346996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
3472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
3492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    path = refPath(path);
3502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawTextOnPathOp(text, bytesCount, count, path,
3532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            hOffset, vOffset, paint);
3540f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
355996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
356996e57c84368058be793897ebc355b917a59abc2Raph Levien}
357996e57c84368058be793897ebc355b917a59abc2Raph Levien
358996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
359d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const float* positions, const SkPaint* paint) {
360996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
3612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
3632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
3642af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
3662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    DrawOp* op = new (alloc()) DrawPosTextOp(text, bytesCount, count, positions, paint);
3670f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
368996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
369996e57c84368058be793897ebc355b917a59abc2Raph Levien}
370996e57c84368058be793897ebc355b917a59abc2Raph Levien
371c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
372d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        float x, float y, const float* positions, const SkPaint* paint,
37341541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik        float totalAdvance, const Rect& bounds, DrawOpMode drawOpMode) {
374527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
375486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
37633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
3772af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    text = refText(text, bytesCount);
3782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    positions = refBuffer<float>(positions, count * 2);
3792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
38141541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik    DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count,
38241541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik            x, y, positions, paint, totalAdvance, bounds);
3830f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    addDrawOp(op);
384486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
385672433d90fab7383cd28beac9d4485b566a90940Romain Guy}
386672433d90fab7383cd28beac9d4485b566a90940Romain Guy
387d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craikstatus_t DisplayListRenderer::drawRects(const float* rects, int count, const SkPaint* paint) {
388672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (count <= 0) return DrawGlInfo::kStatusDone;
389672433d90fab7383cd28beac9d4485b566a90940Romain Guy
3902af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    rects = refBuffer<float>(rects, count);
3912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    paint = refPaint(paint);
3922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint));
393672433d90fab7383cd28beac9d4485b566a90940Romain Guy    return DrawGlInfo::kStatusDone;
394eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
395eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
3972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShaderOp());
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
4012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    shader = refShader(shader);
4022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShaderOp(shader));
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
4062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetShadowOp());
4079b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    OpenGLRenderer::resetShadow();
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
4112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
4129b5a1a28c327e6113d68302b1f0eed1d1c6f6183Romain Guy    OpenGLRenderer::setupShadow(radius, dx, dy, color);
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
4162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) ResetPaintFilterOp());
4175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
4185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
4195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
4202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addStateOp(new (alloc()) SetupPaintFilterOp(clearBits, setBits));
4212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4232af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertRestoreToCount() {
4242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mRestoreSaveCount >= 0) {
4252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        DisplayListOp* op = new (alloc()) RestoreToCountOp(mRestoreSaveCount);
4262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mDisplayListData->displayListOps.add(op);
4272af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mRestoreSaveCount = -1;
4282af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
4292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::insertTranslate() {
4322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    if (mHasTranslate) {
4332af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
4342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            DisplayListOp* op = new (alloc()) TranslateOp(mTranslateX, mTranslateY);
4352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mDisplayListData->displayListOps.add(op);
4362af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik            mTranslateX = mTranslateY = 0.0f;
4372af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        }
4382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mHasTranslate = false;
4392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
4402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4412af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4422af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikvoid DisplayListRenderer::addStateOp(StateOp* op) {
4432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
4442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik}
4452af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
4460f6675332c04c74909425d1d328f02b32c0ff40eRomain Guyvoid DisplayListRenderer::addDrawOp(DrawOp* op) {
4472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    Rect localBounds;
448c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik    if (op->getLocalBounds(mDrawModifiers, localBounds)) {
449f0a590781b2c3e34132b2011d3956135add73ae0Chris Craik        bool rejected = quickRejectConservative(localBounds.left, localBounds.top,
4502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik                localBounds.right, localBounds.bottom);
4512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        op->setQuickRejected(rejected);
4522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    }
453c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik
45444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    mDisplayListData->hasDrawOps = true;
4552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    addOpInternal(op);
4565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
4575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
460