DisplayListRenderer.cpp revision 2fc941e4650d618ff6e122f28b616d9032ffa134
1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*
2e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Copyright (C) 2010 The Android Open Source Project
3e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *
4e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
5e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * you may not use this file except in compliance with the License.
6e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * You may obtain a copy of the License at
7e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *
8e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
9e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly *
10e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * Unless required by applicable law or agreed to in writing, software
11e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
12e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * See the License for the specific language governing permissions and
14e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly * limitations under the License.
15e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly */
16e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
17e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define LOG_TAG "OpenGLRenderer"
18e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
19e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "DisplayListRenderer.h"
20e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
21e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellynamespace android {
22e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellynamespace uirenderer {
23e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
24e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
25e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Display list
26e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
27e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
28e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyconst char* DisplayList::OP_NAMES[] = {
29e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Save",
30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Restore",
31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "RestoreToCount",
32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SaveLayer",
33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SaveLayerAlpha",
34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Translate",
35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Rotate",
36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Scale",
37e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "Skew",
38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SetMatrix",
39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "ConcatMatrix",
40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "ClipRect",
41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawDisplayList",
42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawLayer",
43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawBitmap",
44e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawBitmapMatrix",
45e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawBitmapRect",
46e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawBitmapMesh",
47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawPatch",
48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawColor",
49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawRect",
50e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawRoundRect",
51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawCircle",
52e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawOval",
53e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawArc",
54e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawPath",
55e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawLines",
56e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawText",
57e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "ResetShader",
58e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SetupShader",
59e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "ResetColorFilter",
60e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SetupColorFilter",
61e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "ResetShadow",
62e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "SetupShadow",
63e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    "DrawGLFunction"
64e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly};
65e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
66e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
67e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    initFromDisplayListRenderer(recorder);
68e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
69e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
70e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDisplayList::~DisplayList() {
71e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sk_free((void*) mReader.base());
72e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
73e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Caches& caches = Caches::getInstance();
74e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
75e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mBitmapResources.size(); i++) {
76e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
77e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
78e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mBitmapResources.clear();
79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
80e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mShaders.size(); i++) {
81e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
82e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
83e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mShaders.clear();
84e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
85e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mPaints.size(); i++) {
86e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        delete mPaints.itemAt(i);
87e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
88e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPaints.clear();
89e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
90e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mPaths.size(); i++) {
91e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        delete mPaths.itemAt(i);
92e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
93e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPaths.clear();
94e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mMatrices.size(); i++) {
96e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        delete mMatrices.itemAt(i);
97e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
98e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mMatrices.clear();
99e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const SkWriter32& writer = recorder.writeStream();
103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    init();
104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (writer.size() == 0) {
106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return;
107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    size_t size = writer.size();
110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    void* buffer = sk_malloc_throw(size);
111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    writer.flatten(buffer);
112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mReader.setMemory(buffer, size);
113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Caches& caches = Caches::getInstance();
115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < bitmapResources.size(); i++) {
118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkBitmap* resource = bitmapResources.itemAt(i);
119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mBitmapResources.add(resource);
120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        caches.resourceCache.incrementRefcount(resource);
121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const Vector<SkiaShader*> &shaders = recorder.getShaders();
124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < shaders.size(); i++) {
125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkiaShader* shader = shaders.itemAt(i);
126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mShaders.add(shader);
127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        caches.resourceCache.incrementRefcount(shader);
128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const Vector<SkPaint*> &paints = recorder.getPaints();
131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < paints.size(); i++) {
132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mPaints.add(paints.itemAt(i));
133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const Vector<SkPath*> &paths = recorder.getPaths();
136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < paths.size(); i++) {
137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mPaths.add(paths.itemAt(i));
138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < matrices.size(); i++) {
142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mMatrices.add(matrices.itemAt(i));
143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayList::init() {
147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool needsInvalidate = false;
151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    TextContainer text;
152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mReader.rewind();
153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#if DEBUG_DISPLAY_LIST
155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    uint32_t count = (level + 1) * 2;
156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char indent[count + 1];
157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (uint32_t i = 0; i < count; i++) {
158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        indent[i] = ' ';
159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    indent[count] = '\0';
161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int saveCount = renderer.getSaveCount() - 1;
165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    while (!mReader.eof()) {
166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        int op = mReader.readInt();
167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        switch (op) {
169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawGLFunction: {
170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                Functor *functor = (Functor *) getInt();
171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                needsInvalidate |= renderer.callDrawGLFunction(functor);
173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Save: {
176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int rendererNum = getInt();
177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.save(rendererNum);
179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Restore: {
182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.restore();
184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case RestoreToCount: {
187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int restoreCount = saveCount + getInt();
188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.restoreToCount(restoreCount);
190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SaveLayer: {
193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int flags = getInt();
199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SaveLayerAlpha: {
205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int alpha = getInt();
210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int flags = getInt();
211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Translate: {
217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.translate(f1, f2);
221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Rotate: {
224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float rotation = getFloat();
225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.rotate(rotation);
227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Scale: {
230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float sx = getFloat();
231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float sy = getFloat();
232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.scale(sx, sy);
234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case Skew: {
237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float sx = getFloat();
238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float sy = getFloat();
239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.skew(sx, sy);
241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SetMatrix: {
244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkMatrix* matrix = getMatrix();
245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.setMatrix(matrix);
247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case ConcatMatrix: {
250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkMatrix* matrix = getMatrix();
251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.concatMatrix(matrix);
253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case ClipRect: {
256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int regionOp = getInt();
261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    f1, f2, f3, f4, regionOp);
263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawDisplayList: {
267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DisplayList* displayList = getDisplayList();
268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %d", (char*) indent, OP_NAMES[op],
269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    displayList, level + 1);
270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                needsInvalidate |= renderer.drawDisplayList(displayList, level + 1);
271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawLayer: {
274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                Layer* layer = (Layer*) getInt();
275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float x = getFloat();
276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float y = getFloat();
277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    layer, x, y, paint);
280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawLayer(layer, x, y, paint);
281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawBitmap: {
284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkBitmap* bitmap = getBitmap();
285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float x = getFloat();
286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float y = getFloat();
287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    bitmap, x, y, paint);
290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawBitmap(bitmap, x, y, paint);
291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawBitmapMatrix: {
294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkBitmap* bitmap = getBitmap();
295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkMatrix* matrix = getMatrix();
296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    bitmap, matrix, paint);
299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawBitmap(bitmap, matrix, paint);
300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawBitmapRect: {
303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkBitmap* bitmap = getBitmap();
304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f5 = getFloat();
309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f6 = getFloat();
310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f7 = getFloat();
311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f8 = getFloat();
312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawBitmapMesh: {
319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int verticesCount = 0;
320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t colorsCount = 0;
321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkBitmap* bitmap = getBitmap();
323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t meshWidth = getInt();
324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t meshHeight = getInt();
325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float* vertices = getFloats(verticesCount);
326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                bool hasColors = getInt();
327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int* colors = hasColors ? getInts(colorsCount) : NULL;
328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawPatch: {
334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int32_t* xDivs = NULL;
335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int32_t* yDivs = NULL;
336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t* colors = NULL;
337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t xDivsCount = 0;
338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                uint32_t yDivsCount = 0;
339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int8_t numColors = 0;
340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkBitmap* bitmap = getBitmap();
342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                xDivs = getInts(xDivsCount);
344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                yDivs = getInts(yDivsCount);
345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                colors = getUInts(numColors);
346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawColor: {
353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int color = getInt();
354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int xferMode = getInt();
355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawRect: {
360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    f1, f2, f3, f4, paint);
367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawRect(f1, f2, f3, f4, paint);
368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawRoundRect: {
371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f5 = getFloat();
376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f6 = getFloat();
377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawCircle: {
384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawCircle(f1, f2, f3, paint);
391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawOval: {
394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawOval(f1, f2, f3, f4, paint);
402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawArc: {
405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f1 = getFloat();
406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f2 = getFloat();
407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f3 = getFloat();
408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f4 = getFloat();
409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f5 = getFloat();
410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float f6 = getFloat();
411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int i1 = getInt();
412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawPath: {
419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPath* path = getPath();
420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawPath(path, paint);
423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawLines: {
426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int count = 0;
427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float* points = getFloats(count);
428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawLines(points, count, getPaint());
430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case DrawText: {
433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                getText(&text);
434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int count = getInt();
435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float x = getFloat();
436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float y = getFloat();
437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkPaint* paint = getPaint();
438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    text.text(), text.length(), count, x, y, paint);
440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.drawText(text.text(), text.length(), count, x, y, paint);
441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case ResetShader: {
444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.resetShader();
446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SetupShader: {
449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkiaShader* shader = getShader();
450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.setupShader(shader);
452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case ResetColorFilter: {
455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.resetColorFilter();
457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SetupColorFilter: {
460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                SkiaColorFilter *colorFilter = getColorFilter();
461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.setupColorFilter(colorFilter);
463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case ResetShadow: {
466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.resetShadow();
468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            case SetupShadow: {
471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float radius = getFloat();
472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float dx = getFloat();
473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                float dy = getFloat();
474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                int color = getInt();
475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    radius, dx, dy, color);
477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                renderer.setupShadow(radius, dx, dy, color);
478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            }
479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            break;
480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            default:
481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    (char*) indent, OP_NAMES[op]);
483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                break;
484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return needsInvalidate;
489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Base structure
493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
495e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE) {
496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mDisplayList = NULL;
497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
499e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDisplayListRenderer::~DisplayListRenderer() {
500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    reset();
501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::reset() {
504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mWriter.reset();
505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    Caches& caches = Caches::getInstance();
507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mBitmapResources.size(); i++) {
508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkBitmap* resource = mBitmapResources.itemAt(i);
509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        caches.resourceCache.decrementRefcount(resource);
510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mBitmapResources.clear();
512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    for (size_t i = 0; i < mShaders.size(); i++) {
514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mShaders.clear();
517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mShaderMap.clear();
518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPaints.clear();
520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPaintMap.clear();
521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPaths.clear();
522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mPathMap.clear();
523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mMatrices.clear();
524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// Operations
528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly///////////////////////////////////////////////////////////////////////////////
529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
530e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyDisplayList* DisplayListRenderer::getDisplayList() {
531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (mDisplayList == NULL) {
532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mDisplayList = new DisplayList(*this);
533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    } else {
534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        mDisplayList->initFromDisplayListRenderer(*this);
535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return mDisplayList;
537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::setViewport(int width, int height) {
540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mWidth = width;
543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mHeight = height;
544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::prepareDirty(float left, float top,
547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float right, float bottom, bool opaque) {
548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mSnapshot = new Snapshot(mFirstSnapshot,
549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mSaveCount = 1;
551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mRestoreSaveCount = -1;
553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::finish() {
556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    insertRestoreToCount();
557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::finish();
558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::interrupt() {
561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::resume() {
564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool DisplayListRenderer::callDrawGLFunction(Functor *functor) {
567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawGLFunction);
568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt((int) functor);
569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return false; // No invalidate needed at record-time
570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint DisplayListRenderer::save(int flags) {
573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Save);
574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(flags);
575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OpenGLRenderer::save(flags);
576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::restore() {
579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Restore);
580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::restore();
581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::restoreToCount(int saveCount) {
584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    mRestoreSaveCount = saveCount;
585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::restoreToCount(saveCount);
586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkPaint* p, int flags) {
590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SaveLayer);
591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(p);
593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(flags);
594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OpenGLRenderer::save(flags);
595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        int alpha, int flags) {
599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SaveLayerAlpha);
600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(alpha);
602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(flags);
603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OpenGLRenderer::save(flags);
604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::translate(float dx, float dy) {
607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Translate);
608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(dx, dy);
609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::translate(dx, dy);
610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::rotate(float degrees) {
613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Rotate);
614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addFloat(degrees);
615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::rotate(degrees);
616e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
617e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
618e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::scale(float sx, float sy) {
619e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Scale);
620e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(sx, sy);
621e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::scale(sx, sy);
622e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
623e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
624e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::skew(float sx, float sy) {
625e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::Skew);
626e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(sx, sy);
627e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::skew(sx, sy);
628e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
629e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
630e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
631e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SetMatrix);
632e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addMatrix(matrix);
633e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::setMatrix(matrix);
634e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
635e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
636e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
637e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::ConcatMatrix);
638e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addMatrix(matrix);
639e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OpenGLRenderer::concatMatrix(matrix);
640e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
641e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
642e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
643e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkRegion::Op op) {
644e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::ClipRect);
645e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
646e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(op);
647e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
648e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
649e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
650e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellybool DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
651e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawDisplayList);
652e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addDisplayList(displayList);
653e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    return false;
654e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
655e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
656e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
657e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawLayer);
658e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt((int) layer);
659e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(x, y);
660e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
661e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
662e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
663e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
664e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkPaint* paint) {
665e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawBitmap);
666e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBitmap(bitmap);
667e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(left, top);
668e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
669e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
670e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
671e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
672e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkPaint* paint) {
673e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawBitmapMatrix);
674e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBitmap(bitmap);
675e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addMatrix(matrix);
676e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
677e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
678e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
679e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
680e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float srcRight, float srcBottom, float dstLeft, float dstTop,
681e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float dstRight, float dstBottom, SkPaint* paint) {
682e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawBitmapRect);
683e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBitmap(bitmap);
684e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(srcLeft, srcTop, srcRight, srcBottom);
685e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(dstLeft, dstTop, dstRight, dstBottom);
686e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
687e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
688e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
689e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
690e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float* vertices, int* colors, SkPaint* paint) {
691e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawBitmapMesh);
692e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBitmap(bitmap);
693e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(meshWidth);
694e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(meshHeight);
695e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
696e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    if (colors) {
697e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        addInt(1);
698e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
699e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    } else {
700e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        addInt(0);
701e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
702e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
703e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
704e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
705e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
706e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
707e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float left, float top, float right, float bottom, SkPaint* paint) {
708e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawPatch);
709e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBitmap(bitmap);
710e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInts(xDivs, width);
711e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInts(yDivs, height);
712e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addUInts(colors, numColors);
713e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
714e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
715e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
716e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
717e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
718e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawColor);
719e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(color);
720e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(mode);
721e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
722e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
723e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
724e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkPaint* paint) {
725e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawRect);
726e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
727e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
728e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
729e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
730e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
731e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            float rx, float ry, SkPaint* paint) {
732e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawRoundRect);
733e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
734e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(rx, ry);
735e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
736e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
737e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
738e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
739e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawCircle);
740e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(x, y);
741e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addFloat(radius);
742e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
743e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
744e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
745e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
746e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        SkPaint* paint) {
747e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawOval);
748e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
749e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
750e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
751e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
752e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
753e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
754e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawArc);
755e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addBounds(left, top, right, bottom);
756e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(startAngle, sweepAngle);
757e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(useCenter ? 1 : 0);
758e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
759e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
760e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
761e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
762e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawPath);
763e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPath(path);
764e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
765e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
766e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
767e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
768e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawLines);
769e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addFloats(points, count);
770e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
771e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
772e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
773e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
774e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        float x, float y, SkPaint* paint) {
775e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::DrawText);
776e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addText(text, bytesCount);
777e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(count);
778e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(x, y);
779e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPaint(paint);
780e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
781e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
782e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::resetShader() {
783e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::ResetShader);
784e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
785e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
786e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
787e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SetupShader);
788e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addShader(shader);
789e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
790e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
791e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::resetColorFilter() {
792e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::ResetColorFilter);
793e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
794e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
795e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
796e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SetupColorFilter);
797e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addColorFilter(filter);
798e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
799e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
800e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::resetShadow() {
801e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::ResetShadow);
802e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
803e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
804e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
805e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addOp(DisplayList::SetupShadow);
806e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addFloat(radius);
807e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addPoint(dx, dy);
808e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    addInt(color);
809e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
810e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
811e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}; // namespace uirenderer
812e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}; // namespace android
813e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly