blob: 93acafc739d5433e1937db683cf1f3bef32b1a26 [file] [log] [blame]
Romain Guy4aa90572010-09-26 18:40:37 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "OpenGLRenderer"
18
Romain Guyd5a85fb2012-03-13 11:18:20 -070019#include <SkCamera.h>
Chet Haase9c1e23b2011-03-24 10:51:31 -070020
Romain Guy65549432012-03-26 16:45:05 -070021#include <private/hwui/DrawGlInfo.h>
22
Chet Haase9c1e23b2011-03-24 10:51:31 -070023#include "DisplayListLogBuffer.h"
Romain Guy4aa90572010-09-26 18:40:37 -070024#include "DisplayListRenderer.h"
Chet Haase9c1e23b2011-03-24 10:51:31 -070025#include "Caches.h"
Romain Guy13631f32012-01-30 17:41:55 -080026
Romain Guy4aa90572010-09-26 18:40:37 -070027namespace android {
28namespace uirenderer {
29
30///////////////////////////////////////////////////////////////////////////////
Romain Guyb051e892010-09-28 19:09:36 -070031// Display list
32///////////////////////////////////////////////////////////////////////////////
33
Romain Guyffac7fc2011-01-13 17:21:49 -080034const char* DisplayList::OP_NAMES[] = {
Romain Guyffac7fc2011-01-13 17:21:49 -080035 "Save",
36 "Restore",
37 "RestoreToCount",
38 "SaveLayer",
39 "SaveLayerAlpha",
40 "Translate",
41 "Rotate",
42 "Scale",
Romain Guy4cf6e2f2011-01-23 11:35:13 -080043 "Skew",
Romain Guyffac7fc2011-01-13 17:21:49 -080044 "SetMatrix",
45 "ConcatMatrix",
46 "ClipRect",
47 "DrawDisplayList",
48 "DrawLayer",
49 "DrawBitmap",
50 "DrawBitmapMatrix",
51 "DrawBitmapRect",
Romain Guy5a7b4662011-01-20 19:09:30 -080052 "DrawBitmapMesh",
Romain Guyffac7fc2011-01-13 17:21:49 -080053 "DrawPatch",
54 "DrawColor",
55 "DrawRect",
Romain Guy01d58e42011-01-19 21:54:02 -080056 "DrawRoundRect",
57 "DrawCircle",
Romain Guyc1cd9ba32011-01-23 14:18:41 -080058 "DrawOval",
Romain Guy8b2f5262011-01-23 16:15:02 -080059 "DrawArc",
Romain Guyffac7fc2011-01-13 17:21:49 -080060 "DrawPath",
61 "DrawLines",
Romain Guyed6fcb02011-03-21 13:11:28 -070062 "DrawPoints",
Romain Guyffac7fc2011-01-13 17:21:49 -080063 "DrawText",
Romain Guy325740f2012-02-24 16:48:34 -080064 "DrawTextOnPath",
Romain Guyeb9a5362012-01-17 17:39:26 -080065 "DrawPosText",
Romain Guyffac7fc2011-01-13 17:21:49 -080066 "ResetShader",
67 "SetupShader",
68 "ResetColorFilter",
69 "SetupColorFilter",
70 "ResetShadow",
Chet Haasedaf98e92011-01-10 14:10:36 -080071 "SetupShadow",
Romain Guy5ff9df62012-01-23 17:09:05 -080072 "ResetPaintFilter",
73 "SetupPaintFilter",
Chet Haasedaf98e92011-01-10 14:10:36 -080074 "DrawGLFunction"
Romain Guyffac7fc2011-01-13 17:21:49 -080075};
76
Chet Haase9c1e23b2011-03-24 10:51:31 -070077void DisplayList::outputLogBuffer(int fd) {
78 DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
79 if (logBuffer.isEmpty()) {
80 return;
81 }
Romain Guy65b345f2011-07-27 18:51:50 -070082
Chet Haase9c1e23b2011-03-24 10:51:31 -070083 FILE *file = fdopen(fd, "a");
Romain Guy65b345f2011-07-27 18:51:50 -070084
Chet Haase9c1e23b2011-03-24 10:51:31 -070085 fprintf(file, "\nRecent DisplayList operations\n");
86 logBuffer.outputCommands(file, OP_NAMES);
Romain Guy65b345f2011-07-27 18:51:50 -070087
88 String8 cachesLog;
89 Caches::getInstance().dumpMemoryUsage(cachesLog);
90 fprintf(file, "\nCaches:\n%s", cachesLog.string());
91 fprintf(file, "\n");
92
Chet Haase9c1e23b2011-03-24 10:51:31 -070093 fflush(file);
94}
95
Chet Haase491189f2012-03-13 11:42:34 -070096DisplayList::DisplayList(const DisplayListRenderer& recorder) :
97 mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL) {
98
Chet Haase5977baa2011-01-05 18:01:22 -080099 initFromDisplayListRenderer(recorder);
100}
101
102DisplayList::~DisplayList() {
Chet Haased63cbd12011-02-03 16:32:46 -0800103 clearResources();
104}
105
Chet Haasea1cff502012-02-21 13:43:44 -0800106void DisplayList::initProperties() {
107 mLeft = 0;
108 mTop = 0;
109 mTop = 0;
110 mBottom = 0;
111 mApplicationScale = -1;
112 mClipChildren = true;
113 mAlpha = 1;
114 mMultipliedAlpha = 255;
115 mTranslationX = 0;
116 mTranslationY = 0;
117 mRotation = 0;
118 mRotationX = 0;
119 mRotationY= 0;
120 mScaleX = 1;
121 mScaleY = 1;
122 mPivotX = 0;
123 mPivotY = 0;
124 mMatrixDirty = false;
125 mMatrixFlags = 0;
126 mPrevWidth = -1;
127 mPrevHeight = -1;
128 mWidth = 0;
129 mHeight = 0;
130 mPivotExplicitlySet = false;
Chet Haasea1cff502012-02-21 13:43:44 -0800131 mCaching = false;
132}
133
Romain Guybb0acdf2012-03-05 13:44:35 -0800134void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
135 if (displayList) {
136 DISPLAY_LIST_LOGD("Deferring display list destruction");
137 Caches::getInstance().deleteDisplayListDeferred(displayList);
138 }
139}
140
Chet Haased63cbd12011-02-03 16:32:46 -0800141void DisplayList::clearResources() {
Chet Haase5977baa2011-01-05 18:01:22 -0800142 sk_free((void*) mReader.base());
143
Chet Haase866ed812012-03-13 11:13:13 -0700144 if (USE_DISPLAY_LIST_PROPERTIES) {
145 if (mTransformMatrix) {
146 delete mTransformMatrix;
147 mTransformMatrix = NULL;
148 }
149 if (mTransformCamera) {
150 delete mTransformCamera;
151 mTransformCamera = NULL;
152 }
153 if (mTransformMatrix3D) {
154 delete mTransformMatrix3D;
155 mTransformMatrix3D = NULL;
156 }
Chet Haasea1cff502012-02-21 13:43:44 -0800157 }
158
Chet Haase5977baa2011-01-05 18:01:22 -0800159 Caches& caches = Caches::getInstance();
160
161 for (size_t i = 0; i < mBitmapResources.size(); i++) {
162 caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
163 }
164 mBitmapResources.clear();
165
Romain Guyd586ad92011-06-22 16:14:36 -0700166 for (size_t i = 0; i < mFilterResources.size(); i++) {
167 caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
168 }
169 mFilterResources.clear();
170
Romain Guy24c00212011-01-14 15:31:00 -0800171 for (size_t i = 0; i < mShaders.size(); i++) {
Romain Guy43ccf462011-01-14 18:51:01 -0800172 caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
Romain Guyd586ad92011-06-22 16:14:36 -0700173 caches.resourceCache.destructor(mShaders.itemAt(i));
Chet Haase5977baa2011-01-05 18:01:22 -0800174 }
Romain Guy24c00212011-01-14 15:31:00 -0800175 mShaders.clear();
Chet Haase5977baa2011-01-05 18:01:22 -0800176
177 for (size_t i = 0; i < mPaints.size(); i++) {
178 delete mPaints.itemAt(i);
179 }
180 mPaints.clear();
181
Romain Guy2fc941e2011-02-03 15:06:05 -0800182 for (size_t i = 0; i < mPaths.size(); i++) {
Romain Guy1af23a32011-03-24 16:03:55 -0700183 SkPath* path = mPaths.itemAt(i);
184 caches.pathCache.remove(path);
185 delete path;
Romain Guy2fc941e2011-02-03 15:06:05 -0800186 }
187 mPaths.clear();
188
Chet Haase5977baa2011-01-05 18:01:22 -0800189 for (size_t i = 0; i < mMatrices.size(); i++) {
190 delete mMatrices.itemAt(i);
191 }
192 mMatrices.clear();
Chet Haase5977baa2011-01-05 18:01:22 -0800193}
194
Chet Haased63cbd12011-02-03 16:32:46 -0800195void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
Romain Guyb051e892010-09-28 19:09:36 -0700196 const SkWriter32& writer = recorder.writeStream();
197 init();
198
199 if (writer.size() == 0) {
200 return;
201 }
202
Chet Haased63cbd12011-02-03 16:32:46 -0800203 if (reusing) {
204 // re-using display list - clear out previous allocations
205 clearResources();
206 }
Chet Haasea1cff502012-02-21 13:43:44 -0800207 initProperties();
Chet Haased63cbd12011-02-03 16:32:46 -0800208
Romain Guy65b345f2011-07-27 18:51:50 -0700209 mSize = writer.size();
210 void* buffer = sk_malloc_throw(mSize);
Romain Guyb051e892010-09-28 19:09:36 -0700211 writer.flatten(buffer);
Romain Guy65b345f2011-07-27 18:51:50 -0700212 mReader.setMemory(buffer, mSize);
Romain Guyb051e892010-09-28 19:09:36 -0700213
Chet Haase5c13d892010-10-08 08:37:55 -0700214 Caches& caches = Caches::getInstance();
Romain Guyb051e892010-09-28 19:09:36 -0700215
Chet Haase5c13d892010-10-08 08:37:55 -0700216 const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
217 for (size_t i = 0; i < bitmapResources.size(); i++) {
218 SkBitmap* resource = bitmapResources.itemAt(i);
219 mBitmapResources.add(resource);
220 caches.resourceCache.incrementRefcount(resource);
Romain Guyb051e892010-09-28 19:09:36 -0700221 }
Chet Haased98aa2d2010-10-25 15:47:32 -0700222
Romain Guyd586ad92011-06-22 16:14:36 -0700223 const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
224 for (size_t i = 0; i < filterResources.size(); i++) {
225 SkiaColorFilter* resource = filterResources.itemAt(i);
226 mFilterResources.add(resource);
227 caches.resourceCache.incrementRefcount(resource);
228 }
229
Romain Guy24c00212011-01-14 15:31:00 -0800230 const Vector<SkiaShader*> &shaders = recorder.getShaders();
231 for (size_t i = 0; i < shaders.size(); i++) {
Romain Guyd586ad92011-06-22 16:14:36 -0700232 SkiaShader* resource = shaders.itemAt(i);
233 mShaders.add(resource);
234 caches.resourceCache.incrementRefcount(resource);
Romain Guyb051e892010-09-28 19:09:36 -0700235 }
236
Chet Haased98aa2d2010-10-25 15:47:32 -0700237 const Vector<SkPaint*> &paints = recorder.getPaints();
238 for (size_t i = 0; i < paints.size(); i++) {
239 mPaints.add(paints.itemAt(i));
240 }
241
Romain Guy2fc941e2011-02-03 15:06:05 -0800242 const Vector<SkPath*> &paths = recorder.getPaths();
243 for (size_t i = 0; i < paths.size(); i++) {
244 mPaths.add(paths.itemAt(i));
245 }
246
Chet Haased98aa2d2010-10-25 15:47:32 -0700247 const Vector<SkMatrix*> &matrices = recorder.getMatrices();
248 for (size_t i = 0; i < matrices.size(); i++) {
249 mMatrices.add(matrices.itemAt(i));
250 }
Romain Guyb051e892010-09-28 19:09:36 -0700251}
252
Romain Guyb051e892010-09-28 19:09:36 -0700253void DisplayList::init() {
Romain Guy65b345f2011-07-27 18:51:50 -0700254 mSize = 0;
Romain Guy04c9d8c2011-08-25 14:01:48 -0700255 mIsRenderable = true;
Romain Guy65b345f2011-07-27 18:51:50 -0700256}
257
258size_t DisplayList::getSize() {
259 return mSize;
Romain Guyb051e892010-09-28 19:09:36 -0700260}
261
Chet Haaseed30fd82011-04-22 16:18:45 -0700262/**
263 * This function is a simplified version of replay(), where we simply retrieve and log the
264 * display list. This function should remain in sync with the replay() function.
265 */
266void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
267 TextContainer text;
268
269 uint32_t count = (level + 1) * 2;
270 char indent[count + 1];
271 for (uint32_t i = 0; i < count; i++) {
272 indent[i] = ' ';
273 }
274 indent[count] = '\0';
Romain Guy13631f32012-01-30 17:41:55 -0800275 ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
Chet Haaseed30fd82011-04-22 16:18:45 -0700276
277 int saveCount = renderer.getSaveCount() - 1;
278
Chet Haasea1cff502012-02-21 13:43:44 -0800279 outputViewProperties(renderer, (char*) indent);
Chet Haaseed30fd82011-04-22 16:18:45 -0700280 mReader.rewind();
281
282 while (!mReader.eof()) {
283 int op = mReader.readInt();
Romain Guy33f6beb2012-02-16 19:24:51 -0800284 if (op & OP_MAY_BE_SKIPPED_MASK) {
285 int skip = mReader.readInt();
286 ALOGD("%sSkip %d", (char*) indent, skip);
287 op &= ~OP_MAY_BE_SKIPPED_MASK;
Chet Haasea1cff502012-02-21 13:43:44 -0800288 }
Chet Haaseed30fd82011-04-22 16:18:45 -0700289
290 switch (op) {
291 case DrawGLFunction: {
292 Functor *functor = (Functor *) getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000293 ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
Chet Haaseed30fd82011-04-22 16:18:45 -0700294 }
295 break;
296 case Save: {
297 int rendererNum = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000298 ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
Chet Haaseed30fd82011-04-22 16:18:45 -0700299 }
300 break;
301 case Restore: {
Steve Block5baa3a62011-12-20 16:23:08 +0000302 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700303 }
304 break;
305 case RestoreToCount: {
306 int restoreCount = saveCount + getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000307 ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
Chet Haaseed30fd82011-04-22 16:18:45 -0700308 }
309 break;
310 case SaveLayer: {
311 float f1 = getFloat();
312 float f2 = getFloat();
313 float f3 = getFloat();
314 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800315 SkPaint* paint = getPaint(renderer);
Chet Haaseed30fd82011-04-22 16:18:45 -0700316 int flags = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000317 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
Chet Haasea1cff502012-02-21 13:43:44 -0800318 OP_NAMES[op], f1, f2, f3, f4, paint, flags);
Chet Haaseed30fd82011-04-22 16:18:45 -0700319 }
320 break;
321 case SaveLayerAlpha: {
322 float f1 = getFloat();
323 float f2 = getFloat();
324 float f3 = getFloat();
325 float f4 = getFloat();
326 int alpha = getInt();
327 int flags = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000328 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
Chet Haasea1cff502012-02-21 13:43:44 -0800329 OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
Chet Haaseed30fd82011-04-22 16:18:45 -0700330 }
331 break;
332 case Translate: {
333 float f1 = getFloat();
334 float f2 = getFloat();
Steve Block5baa3a62011-12-20 16:23:08 +0000335 ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
Chet Haaseed30fd82011-04-22 16:18:45 -0700336 }
337 break;
338 case Rotate: {
339 float rotation = getFloat();
Steve Block5baa3a62011-12-20 16:23:08 +0000340 ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
Chet Haaseed30fd82011-04-22 16:18:45 -0700341 }
342 break;
343 case Scale: {
344 float sx = getFloat();
345 float sy = getFloat();
Steve Block5baa3a62011-12-20 16:23:08 +0000346 ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
Chet Haaseed30fd82011-04-22 16:18:45 -0700347 }
348 break;
349 case Skew: {
350 float sx = getFloat();
351 float sy = getFloat();
Steve Block5baa3a62011-12-20 16:23:08 +0000352 ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
Chet Haaseed30fd82011-04-22 16:18:45 -0700353 }
354 break;
355 case SetMatrix: {
356 SkMatrix* matrix = getMatrix();
Steve Block5baa3a62011-12-20 16:23:08 +0000357 ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
Chet Haaseed30fd82011-04-22 16:18:45 -0700358 }
359 break;
360 case ConcatMatrix: {
361 SkMatrix* matrix = getMatrix();
Chet Haasea1cff502012-02-21 13:43:44 -0800362 ALOGD("%s%s new concat %p: [%f, %f, %f] [%f, %f, %f] [%f, %f, %f]",
363 (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
364 matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
365 matrix->get(6), matrix->get(7), matrix->get(8));
Chet Haaseed30fd82011-04-22 16:18:45 -0700366 }
367 break;
368 case ClipRect: {
369 float f1 = getFloat();
370 float f2 = getFloat();
371 float f3 = getFloat();
372 float f4 = getFloat();
373 int regionOp = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000374 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800375 f1, f2, f3, f4, regionOp);
Chet Haaseed30fd82011-04-22 16:18:45 -0700376 }
377 break;
378 case DrawDisplayList: {
379 DisplayList* displayList = getDisplayList();
380 uint32_t width = getUInt();
381 uint32_t height = getUInt();
Romain Guy33f6beb2012-02-16 19:24:51 -0800382 int32_t flags = getInt();
383 ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800384 displayList, width, height, flags, level + 1);
Chet Haaseed30fd82011-04-22 16:18:45 -0700385 renderer.outputDisplayList(displayList, level + 1);
386 }
387 break;
388 case DrawLayer: {
389 Layer* layer = (Layer*) getInt();
390 float x = getFloat();
391 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800392 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000393 ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800394 layer, x, y, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700395 }
396 break;
397 case DrawBitmap: {
398 SkBitmap* bitmap = getBitmap();
399 float x = getFloat();
400 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800401 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000402 ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800403 bitmap, x, y, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700404 }
405 break;
406 case DrawBitmapMatrix: {
407 SkBitmap* bitmap = getBitmap();
408 SkMatrix* matrix = getMatrix();
Romain Guy5ff9df62012-01-23 17:09:05 -0800409 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000410 ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800411 bitmap, matrix, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700412 }
413 break;
414 case DrawBitmapRect: {
415 SkBitmap* bitmap = getBitmap();
416 float f1 = getFloat();
417 float f2 = getFloat();
418 float f3 = getFloat();
419 float f4 = getFloat();
420 float f5 = getFloat();
421 float f6 = getFloat();
422 float f7 = getFloat();
423 float f8 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800424 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000425 ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -0800426 (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700427 }
428 break;
429 case DrawBitmapMesh: {
430 int verticesCount = 0;
431 uint32_t colorsCount = 0;
432 SkBitmap* bitmap = getBitmap();
433 uint32_t meshWidth = getInt();
434 uint32_t meshHeight = getInt();
435 float* vertices = getFloats(verticesCount);
436 bool hasColors = getInt();
437 int* colors = hasColors ? getInts(colorsCount) : NULL;
Romain Guy5ff9df62012-01-23 17:09:05 -0800438 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000439 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700440 }
441 break;
442 case DrawPatch: {
443 int32_t* xDivs = NULL;
444 int32_t* yDivs = NULL;
445 uint32_t* colors = NULL;
446 uint32_t xDivsCount = 0;
447 uint32_t yDivsCount = 0;
448 int8_t numColors = 0;
449 SkBitmap* bitmap = getBitmap();
450 xDivs = getInts(xDivsCount);
451 yDivs = getInts(yDivsCount);
452 colors = getUInts(numColors);
Romain Guya62f1722011-10-19 17:06:19 -0700453 float left = getFloat();
454 float top = getFloat();
455 float right = getFloat();
456 float bottom = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800457 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000458 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
Romain Guya62f1722011-10-19 17:06:19 -0700459 left, top, right, bottom);
Chet Haaseed30fd82011-04-22 16:18:45 -0700460 }
461 break;
462 case DrawColor: {
463 int color = getInt();
464 int xferMode = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000465 ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
Chet Haaseed30fd82011-04-22 16:18:45 -0700466 }
467 break;
468 case DrawRect: {
469 float f1 = getFloat();
470 float f2 = getFloat();
471 float f3 = getFloat();
472 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800473 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000474 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800475 f1, f2, f3, f4, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700476 }
477 break;
478 case DrawRoundRect: {
479 float f1 = getFloat();
480 float f2 = getFloat();
481 float f3 = getFloat();
482 float f4 = getFloat();
483 float f5 = getFloat();
484 float f6 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800485 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000486 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -0800487 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700488 }
489 break;
490 case DrawCircle: {
491 float f1 = getFloat();
492 float f2 = getFloat();
493 float f3 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800494 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000495 ALOGD("%s%s %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -0800496 (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700497 }
498 break;
499 case DrawOval: {
500 float f1 = getFloat();
501 float f2 = getFloat();
502 float f3 = getFloat();
503 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800504 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000505 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -0800506 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700507 }
508 break;
509 case DrawArc: {
510 float f1 = getFloat();
511 float f2 = getFloat();
512 float f3 = getFloat();
513 float f4 = getFloat();
514 float f5 = getFloat();
515 float f6 = getFloat();
516 int i1 = getInt();
Romain Guy5ff9df62012-01-23 17:09:05 -0800517 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000518 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
Chet Haasea1cff502012-02-21 13:43:44 -0800519 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700520 }
521 break;
522 case DrawPath: {
523 SkPath* path = getPath();
Romain Guy5ff9df62012-01-23 17:09:05 -0800524 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000525 ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
Chet Haaseed30fd82011-04-22 16:18:45 -0700526 }
527 break;
528 case DrawLines: {
529 int count = 0;
530 float* points = getFloats(count);
Romain Guy5ff9df62012-01-23 17:09:05 -0800531 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000532 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700533 }
534 break;
535 case DrawPoints: {
536 int count = 0;
537 float* points = getFloats(count);
Romain Guy5ff9df62012-01-23 17:09:05 -0800538 SkPaint* paint = getPaint(renderer);
Steve Block5baa3a62011-12-20 16:23:08 +0000539 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700540 }
541 break;
542 case DrawText: {
543 getText(&text);
Romain Guy325740f2012-02-24 16:48:34 -0800544 int32_t count = getInt();
Chet Haaseed30fd82011-04-22 16:18:45 -0700545 float x = getFloat();
546 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800547 SkPaint* paint = getPaint(renderer);
Romain Guycac5fd32011-12-01 20:08:50 -0800548 float length = getFloat();
Steve Block5baa3a62011-12-20 16:23:08 +0000549 ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800550 text.text(), text.length(), count, x, y, paint, length);
Chet Haaseed30fd82011-04-22 16:18:45 -0700551 }
552 break;
Romain Guy325740f2012-02-24 16:48:34 -0800553 case DrawTextOnPath: {
554 getText(&text);
555 int32_t count = getInt();
556 SkPath* path = getPath();
557 float hOffset = getFloat();
558 float vOffset = getFloat();
559 SkPaint* paint = getPaint(renderer);
560 ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
561 text.text(), text.length(), count, paint);
562 }
563 break;
Romain Guyeb9a5362012-01-17 17:39:26 -0800564 case DrawPosText: {
565 getText(&text);
566 int count = getInt();
567 int positionsCount = 0;
568 float* positions = getFloats(positionsCount);
Romain Guy5ff9df62012-01-23 17:09:05 -0800569 SkPaint* paint = getPaint(renderer);
Romain Guyeb9a5362012-01-17 17:39:26 -0800570 ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800571 text.text(), text.length(), count, paint);
Romain Guyeb9a5362012-01-17 17:39:26 -0800572 }
Chet Haaseed30fd82011-04-22 16:18:45 -0700573 case ResetShader: {
Steve Block5baa3a62011-12-20 16:23:08 +0000574 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700575 }
576 break;
577 case SetupShader: {
578 SkiaShader* shader = getShader();
Steve Block5baa3a62011-12-20 16:23:08 +0000579 ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
Chet Haaseed30fd82011-04-22 16:18:45 -0700580 }
581 break;
582 case ResetColorFilter: {
Steve Block5baa3a62011-12-20 16:23:08 +0000583 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700584 }
585 break;
586 case SetupColorFilter: {
587 SkiaColorFilter *colorFilter = getColorFilter();
Steve Block5baa3a62011-12-20 16:23:08 +0000588 ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
Chet Haaseed30fd82011-04-22 16:18:45 -0700589 }
590 break;
591 case ResetShadow: {
Steve Block5baa3a62011-12-20 16:23:08 +0000592 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700593 }
594 break;
595 case SetupShadow: {
596 float radius = getFloat();
597 float dx = getFloat();
598 float dy = getFloat();
599 int color = getInt();
Steve Block5baa3a62011-12-20 16:23:08 +0000600 ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800601 radius, dx, dy, color);
Chet Haaseed30fd82011-04-22 16:18:45 -0700602 }
603 break;
Romain Guy5ff9df62012-01-23 17:09:05 -0800604 case ResetPaintFilter: {
605 ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
606 }
607 break;
608 case SetupPaintFilter: {
609 int clearBits = getInt();
610 int setBits = getInt();
611 ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
612 }
613 break;
Chet Haaseed30fd82011-04-22 16:18:45 -0700614 default:
Steve Block5baa3a62011-12-20 16:23:08 +0000615 ALOGD("Display List error: op not handled: %s%s",
Chet Haasea1cff502012-02-21 13:43:44 -0800616 (char*) indent, OP_NAMES[op]);
Chet Haaseed30fd82011-04-22 16:18:45 -0700617 break;
618 }
619 }
Chet Haasea1cff502012-02-21 13:43:44 -0800620 ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
Chet Haaseed30fd82011-04-22 16:18:45 -0700621}
622
Chet Haasea1cff502012-02-21 13:43:44 -0800623void DisplayList::updateMatrix() {
624 if (mMatrixDirty) {
625 if (!mTransformMatrix) {
626 mTransformMatrix = new SkMatrix();
627 }
628 if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
629 mTransformMatrix->reset();
630 } else {
631 if (!mPivotExplicitlySet) {
632 if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
633 mPrevWidth = mWidth;
634 mPrevHeight = mHeight;
635 mPivotX = mPrevWidth / 2;
636 mPivotY = mPrevHeight / 2;
637 }
638 }
639 if ((mMatrixFlags & ROTATION_3D) == 0) {
640 mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
641 mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
642 mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
643 } else {
644 if (!mTransformCamera) {
645 mTransformCamera = new Sk3DView();
646 mTransformMatrix3D = new SkMatrix();
647 }
648 mTransformMatrix->reset();
649 mTransformCamera->save();
650 mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
651 mTransformCamera->rotateX(mRotationX);
652 mTransformCamera->rotateY(mRotationY);
653 mTransformCamera->rotateZ(-mRotation);
654 mTransformCamera->getMatrix(mTransformMatrix3D);
655 mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
656 mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
657 mPivotY + mTranslationY);
658 mTransformMatrix->postConcat(*mTransformMatrix3D);
659 mTransformCamera->restore();
660 }
661 }
662 mMatrixDirty = false;
663 }
664}
665
666void DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
667 if (USE_DISPLAY_LIST_PROPERTIES) {
668 updateMatrix();
669 if (mApplicationScale >= 0) {
670 ALOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
671 mApplicationScale, mApplicationScale);
672 }
673 if (mLeft != 0 || mTop != 0) {
674 ALOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
675 }
Chet Haasea1cff502012-02-21 13:43:44 -0800676 if (mMatrixFlags != 0) {
677 if (mMatrixFlags == TRANSLATION) {
678 ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
679 } else {
680 ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
681 indent, "ConcatMatrix", mTransformMatrix,
682 mTransformMatrix->get(0), mTransformMatrix->get(1),
683 mTransformMatrix->get(2), mTransformMatrix->get(3),
684 mTransformMatrix->get(4), mTransformMatrix->get(5),
685 mTransformMatrix->get(6), mTransformMatrix->get(7),
686 mTransformMatrix->get(8));
687 }
688 }
Chet Haase9d1992d2012-03-13 11:03:25 -0700689 if (mAlpha < 1) {
690 // TODO: should be able to store the size of a DL at record time and not
691 // have to pass it into this call. In fact, this information might be in the
692 // location/size info that we store with the new native transform data.
693 int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
694 if (mClipChildren) {
695 flags |= SkCanvas::kClipToLayer_SaveFlag;
696 }
697 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
698 (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
699 mMultipliedAlpha, flags);
700 }
Chet Haasea1cff502012-02-21 13:43:44 -0800701 if (mClipChildren) {
702 ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
703 (float) mRight - mLeft, (float) mBottom - mTop);
704 }
705 }
706}
707
708void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
709 uint32_t level) {
710 if (USE_DISPLAY_LIST_PROPERTIES) {
711#if DEBUG_DISPLAY_LIST
712 uint32_t count = (level + 1) * 2;
713 char indent[count + 1];
714 for (uint32_t i = 0; i < count; i++) {
715 indent[i] = ' ';
716 }
717 indent[count] = '\0';
718#endif
719 updateMatrix();
720 if (mLeft != 0 || mTop != 0) {
721 DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
722 renderer.translate(mLeft, mTop);
723 }
724 if (mApplicationScale >= 0) {
725 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
726 mApplicationScale, mApplicationScale);
727 renderer.scale(mApplicationScale, mApplicationScale);
728 }
Chet Haasea1cff502012-02-21 13:43:44 -0800729 if (mMatrixFlags != 0) {
730 if (mMatrixFlags == TRANSLATION) {
731 DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
732 renderer.translate(mTranslationX, mTranslationY);
733 } else {
734 DISPLAY_LIST_LOGD(
735 "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
736 indent, "ConcatMatrix", mTransformMatrix,
737 mTransformMatrix->get(0), mTransformMatrix->get(1),
738 mTransformMatrix->get(2), mTransformMatrix->get(3),
739 mTransformMatrix->get(4), mTransformMatrix->get(5),
740 mTransformMatrix->get(6), mTransformMatrix->get(7),
741 mTransformMatrix->get(8));
742 renderer.concatMatrix(mTransformMatrix);
743 }
744 }
Chet Haase9d1992d2012-03-13 11:03:25 -0700745 if (mAlpha < 1 && !mCaching) {
746 // TODO: should be able to store the size of a DL at record time and not
747 // have to pass it into this call. In fact, this information might be in the
748 // location/size info that we store with the new native transform data.
749 int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
750 if (mClipChildren) {
751 flags |= SkCanvas::kClipToLayer_SaveFlag;
752 }
753 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
754 (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
755 mMultipliedAlpha, flags);
756 renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
757 mMultipliedAlpha, flags);
758 }
Chet Haasea1cff502012-02-21 13:43:44 -0800759 if (mClipChildren) {
760 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
761 (float) mRight - mLeft, (float) mBottom - mTop);
762 renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
763 SkRegion::kIntersect_Op);
764 }
765 }
766}
767
768void DisplayList::transformRect(float left, float top, float right, float bottom, Rect& result) {
769 result.left = left + mLeft;
770 result.top = top + mTop;
771 result.right = right + mLeft;
772 result.bottom = bottom + mTop;
773 if (mMatrixFlags != 0) {
774 if (mMatrixFlags == TRANSLATION) {
775 result.left += mTranslationX;
776 result.top += mTranslationY;
777 result.right += mTranslationX;
778 result.bottom += mTranslationY;
779 } else {
780 updateMatrix();
781 SkRect r;
782 r.fLeft = result.left;
783 r.fTop = result.top;
784 r.fRight = result.right;
785 r.fBottom = result.bottom;
786 mTransformMatrix->mapRect(&r);
787 result.left = r.fLeft;
788 result.top = r.fTop;
789 result.right = r.fRight;
790 result.bottom = r.fBottom;
791 }
792 }
793}
794
795
Chet Haaseed30fd82011-04-22 16:18:45 -0700796/**
797 * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
798 * in the output() function, since that function processes the same list of opcodes for the
799 * purposes of logging display list info for a given view.
800 */
Romain Guy65549432012-03-26 16:45:05 -0700801status_t DisplayList::replay(OpenGLRenderer& renderer, uint32_t width,
Chet Haasea1cff502012-02-21 13:43:44 -0800802 uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
Romain Guy65549432012-03-26 16:45:05 -0700803 status_t drawGlStatus = 0;
Romain Guyb051e892010-09-28 19:09:36 -0700804 TextContainer text;
805 mReader.rewind();
806
Romain Guyffac7fc2011-01-13 17:21:49 -0800807#if DEBUG_DISPLAY_LIST
808 uint32_t count = (level + 1) * 2;
809 char indent[count + 1];
810 for (uint32_t i = 0; i < count; i++) {
811 indent[i] = ' ';
812 }
813 indent[count] = '\0';
Romain Guy13631f32012-01-30 17:41:55 -0800814 DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
Romain Guyffac7fc2011-01-13 17:21:49 -0800815#endif
Romain Guyb051e892010-09-28 19:09:36 -0700816
Romain Guy13631f32012-01-30 17:41:55 -0800817 renderer.startMark(mName.string());
Chet Haasea1cff502012-02-21 13:43:44 -0800818 int restoreTo = 0;
819 if (USE_DISPLAY_LIST_PROPERTIES) {
820 DISPLAY_LIST_LOGD("%s%s %d", indent, "Save",
821 SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
822 restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
823 }
824 setViewProperties(renderer, width, height, level);
Romain Guy13631f32012-01-30 17:41:55 -0800825
Chet Haase9c1e23b2011-03-24 10:51:31 -0700826 DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
Romain Guyffac7fc2011-01-13 17:21:49 -0800827 int saveCount = renderer.getSaveCount() - 1;
Romain Guyb051e892010-09-28 19:09:36 -0700828 while (!mReader.eof()) {
Romain Guy5b3b3522010-10-27 18:57:51 -0700829 int op = mReader.readInt();
Romain Guy33f6beb2012-02-16 19:24:51 -0800830 if (op & OP_MAY_BE_SKIPPED_MASK) {
Romain Guy390f8822012-03-13 18:00:10 -0700831 int32_t skip = mReader.readInt();
Romain Guy33f6beb2012-02-16 19:24:51 -0800832 if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
833 mReader.skip(skip);
834 DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
835 OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
836 continue;
837 } else {
838 op &= ~OP_MAY_BE_SKIPPED_MASK;
Romain Guy33f6beb2012-02-16 19:24:51 -0800839 }
840 }
Chet Haase9c1e23b2011-03-24 10:51:31 -0700841 logBuffer.writeCommand(level, op);
Romain Guyffac7fc2011-01-13 17:21:49 -0800842
Romain Guy5b3b3522010-10-27 18:57:51 -0700843 switch (op) {
Chet Haasedaf98e92011-01-10 14:10:36 -0800844 case DrawGLFunction: {
845 Functor *functor = (Functor *) getInt();
846 DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
Romain Guy13631f32012-01-30 17:41:55 -0800847 renderer.startMark("GL functor");
Romain Guy65549432012-03-26 16:45:05 -0700848 drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
Romain Guy13631f32012-01-30 17:41:55 -0800849 renderer.endMark();
Chet Haasedaf98e92011-01-10 14:10:36 -0800850 }
851 break;
Romain Guyb051e892010-09-28 19:09:36 -0700852 case Save: {
Romain Guy33f6beb2012-02-16 19:24:51 -0800853 int32_t rendererNum = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -0800854 DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
855 renderer.save(rendererNum);
Romain Guyb051e892010-09-28 19:09:36 -0700856 }
857 break;
858 case Restore: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800859 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guyb051e892010-09-28 19:09:36 -0700860 renderer.restore();
861 }
862 break;
863 case RestoreToCount: {
Romain Guy33f6beb2012-02-16 19:24:51 -0800864 int32_t restoreCount = saveCount + getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -0800865 DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
866 renderer.restoreToCount(restoreCount);
Romain Guyb051e892010-09-28 19:09:36 -0700867 }
868 break;
869 case SaveLayer: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800870 float f1 = getFloat();
871 float f2 = getFloat();
872 float f3 = getFloat();
873 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800874 SkPaint* paint = getPaint(renderer);
Romain Guy33f6beb2012-02-16 19:24:51 -0800875 int32_t flags = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -0800876 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
Chet Haasea1cff502012-02-21 13:43:44 -0800877 OP_NAMES[op], f1, f2, f3, f4, paint, flags);
Chet Haasedaf98e92011-01-10 14:10:36 -0800878 renderer.saveLayer(f1, f2, f3, f4, paint, flags);
Romain Guyb051e892010-09-28 19:09:36 -0700879 }
880 break;
Romain Guy5b3b3522010-10-27 18:57:51 -0700881 case SaveLayerAlpha: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800882 float f1 = getFloat();
883 float f2 = getFloat();
884 float f3 = getFloat();
885 float f4 = getFloat();
Romain Guy33f6beb2012-02-16 19:24:51 -0800886 int32_t alpha = getInt();
887 int32_t flags = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -0800888 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
Chet Haasea1cff502012-02-21 13:43:44 -0800889 OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
Chet Haasedaf98e92011-01-10 14:10:36 -0800890 renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
Romain Guy5b3b3522010-10-27 18:57:51 -0700891 }
892 break;
Romain Guyb051e892010-09-28 19:09:36 -0700893 case Translate: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800894 float f1 = getFloat();
895 float f2 = getFloat();
896 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
897 renderer.translate(f1, f2);
Romain Guyb051e892010-09-28 19:09:36 -0700898 }
899 break;
900 case Rotate: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800901 float rotation = getFloat();
902 DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
903 renderer.rotate(rotation);
Romain Guyb051e892010-09-28 19:09:36 -0700904 }
905 break;
906 case Scale: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800907 float sx = getFloat();
908 float sy = getFloat();
909 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
910 renderer.scale(sx, sy);
Romain Guyb051e892010-09-28 19:09:36 -0700911 }
912 break;
Romain Guy807daf72011-01-18 11:19:19 -0800913 case Skew: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800914 float sx = getFloat();
915 float sy = getFloat();
916 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
917 renderer.skew(sx, sy);
Romain Guy807daf72011-01-18 11:19:19 -0800918 }
919 break;
Romain Guyb051e892010-09-28 19:09:36 -0700920 case SetMatrix: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800921 SkMatrix* matrix = getMatrix();
922 DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
923 renderer.setMatrix(matrix);
Romain Guyb051e892010-09-28 19:09:36 -0700924 }
925 break;
926 case ConcatMatrix: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800927 SkMatrix* matrix = getMatrix();
Chet Haasea1cff502012-02-21 13:43:44 -0800928 DISPLAY_LIST_LOGD(
929 "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
930 (char*) indent, OP_NAMES[op], matrix,
931 matrix->get(0), matrix->get(1), matrix->get(2),
932 matrix->get(3), matrix->get(4), matrix->get(5),
933 matrix->get(6), matrix->get(7), matrix->get(8));
Chet Haasedaf98e92011-01-10 14:10:36 -0800934 renderer.concatMatrix(matrix);
Romain Guyb051e892010-09-28 19:09:36 -0700935 }
936 break;
937 case ClipRect: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800938 float f1 = getFloat();
939 float f2 = getFloat();
940 float f3 = getFloat();
941 float f4 = getFloat();
Romain Guy33f6beb2012-02-16 19:24:51 -0800942 int32_t regionOp = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -0800943 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800944 f1, f2, f3, f4, regionOp);
Chet Haasedaf98e92011-01-10 14:10:36 -0800945 renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
Romain Guyb051e892010-09-28 19:09:36 -0700946 }
947 break;
Romain Guy0fe478e2010-11-08 12:08:41 -0800948 case DrawDisplayList: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800949 DisplayList* displayList = getDisplayList();
Romain Guy7b5b6ab2011-03-14 18:05:08 -0700950 uint32_t width = getUInt();
951 uint32_t height = getUInt();
Romain Guy33f6beb2012-02-16 19:24:51 -0800952 int32_t flags = getInt();
953 DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800954 displayList, width, height, flags, level + 1);
Romain Guy65549432012-03-26 16:45:05 -0700955 drawGlStatus |= renderer.drawDisplayList(displayList, width,
Chet Haasea1cff502012-02-21 13:43:44 -0800956 height, dirty, flags, level + 1);
Romain Guy0fe478e2010-11-08 12:08:41 -0800957 }
958 break;
Romain Guy6c319ca2011-01-11 14:29:25 -0800959 case DrawLayer: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800960 Layer* layer = (Layer*) getInt();
961 float x = getFloat();
962 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800963 SkPaint* paint = getPaint(renderer);
Chet Haasea1cff502012-02-21 13:43:44 -0800964 if (mCaching && mMultipliedAlpha < 255) {
965 paint->setAlpha(mMultipliedAlpha);
966 }
Chet Haasedaf98e92011-01-10 14:10:36 -0800967 DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800968 layer, x, y, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -0800969 renderer.drawLayer(layer, x, y, paint);
Romain Guy6c319ca2011-01-11 14:29:25 -0800970 }
971 break;
Romain Guyb051e892010-09-28 19:09:36 -0700972 case DrawBitmap: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800973 SkBitmap* bitmap = getBitmap();
974 float x = getFloat();
975 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -0800976 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -0800977 DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800978 bitmap, x, y, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -0800979 renderer.drawBitmap(bitmap, x, y, paint);
Romain Guyb051e892010-09-28 19:09:36 -0700980 }
981 break;
982 case DrawBitmapMatrix: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800983 SkBitmap* bitmap = getBitmap();
984 SkMatrix* matrix = getMatrix();
Romain Guy5ff9df62012-01-23 17:09:05 -0800985 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -0800986 DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -0800987 bitmap, matrix, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -0800988 renderer.drawBitmap(bitmap, matrix, paint);
Romain Guyb051e892010-09-28 19:09:36 -0700989 }
990 break;
991 case DrawBitmapRect: {
Chet Haasedaf98e92011-01-10 14:10:36 -0800992 SkBitmap* bitmap = getBitmap();
993 float f1 = getFloat();
994 float f2 = getFloat();
995 float f3 = getFloat();
996 float f4 = getFloat();
997 float f5 = getFloat();
998 float f6 = getFloat();
999 float f7 = getFloat();
1000 float f8 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001001 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001002 DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -08001003 (char*) indent, OP_NAMES[op], bitmap,
1004 f1, f2, f3, f4, f5, f6, f7, f8,paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001005 renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
Romain Guyb051e892010-09-28 19:09:36 -07001006 }
1007 break;
Romain Guy5a7b4662011-01-20 19:09:30 -08001008 case DrawBitmapMesh: {
Romain Guy33f6beb2012-02-16 19:24:51 -08001009 int32_t verticesCount = 0;
Romain Guy5a7b4662011-01-20 19:09:30 -08001010 uint32_t colorsCount = 0;
1011
1012 SkBitmap* bitmap = getBitmap();
1013 uint32_t meshWidth = getInt();
1014 uint32_t meshHeight = getInt();
1015 float* vertices = getFloats(verticesCount);
1016 bool hasColors = getInt();
Romain Guy33f6beb2012-02-16 19:24:51 -08001017 int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
Romain Guy5ff9df62012-01-23 17:09:05 -08001018 SkPaint* paint = getPaint(renderer);
Romain Guy5a7b4662011-01-20 19:09:30 -08001019
Chet Haasedaf98e92011-01-10 14:10:36 -08001020 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guy9ff3cb52011-06-28 14:02:11 -07001021 renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
Romain Guy5a7b4662011-01-20 19:09:30 -08001022 }
Romain Guya566b7c2011-01-23 16:36:11 -08001023 break;
Romain Guyb051e892010-09-28 19:09:36 -07001024 case DrawPatch: {
1025 int32_t* xDivs = NULL;
1026 int32_t* yDivs = NULL;
Romain Guy4bb94202010-10-12 15:59:26 -07001027 uint32_t* colors = NULL;
Romain Guyb051e892010-09-28 19:09:36 -07001028 uint32_t xDivsCount = 0;
1029 uint32_t yDivsCount = 0;
Romain Guy4bb94202010-10-12 15:59:26 -07001030 int8_t numColors = 0;
Romain Guyb051e892010-09-28 19:09:36 -07001031
1032 SkBitmap* bitmap = getBitmap();
1033
1034 xDivs = getInts(xDivsCount);
1035 yDivs = getInts(yDivsCount);
Romain Guy4bb94202010-10-12 15:59:26 -07001036 colors = getUInts(numColors);
Romain Guyb051e892010-09-28 19:09:36 -07001037
Romain Guy9ff3cb52011-06-28 14:02:11 -07001038 float left = getFloat();
1039 float top = getFloat();
1040 float right = getFloat();
1041 float bottom = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001042 SkPaint* paint = getPaint(renderer);
Romain Guy9ff3cb52011-06-28 14:02:11 -07001043
Chet Haasedaf98e92011-01-10 14:10:36 -08001044 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guy4bb94202010-10-12 15:59:26 -07001045 renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
Romain Guy9ff3cb52011-06-28 14:02:11 -07001046 numColors, left, top, right, bottom, paint);
Romain Guyb051e892010-09-28 19:09:36 -07001047 }
1048 break;
1049 case DrawColor: {
Romain Guy33f6beb2012-02-16 19:24:51 -08001050 int32_t color = getInt();
1051 int32_t xferMode = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -08001052 DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1053 renderer.drawColor(color, (SkXfermode::Mode) xferMode);
Romain Guyb051e892010-09-28 19:09:36 -07001054 }
1055 break;
1056 case DrawRect: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001057 float f1 = getFloat();
1058 float f2 = getFloat();
1059 float f3 = getFloat();
1060 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001061 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001062 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -08001063 f1, f2, f3, f4, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001064 renderer.drawRect(f1, f2, f3, f4, paint);
Romain Guyb051e892010-09-28 19:09:36 -07001065 }
1066 break;
Romain Guy01d58e42011-01-19 21:54:02 -08001067 case DrawRoundRect: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001068 float f1 = getFloat();
1069 float f2 = getFloat();
1070 float f3 = getFloat();
1071 float f4 = getFloat();
1072 float f5 = getFloat();
1073 float f6 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001074 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001075 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -08001076 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001077 renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
Romain Guy01d58e42011-01-19 21:54:02 -08001078 }
1079 break;
1080 case DrawCircle: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001081 float f1 = getFloat();
1082 float f2 = getFloat();
1083 float f3 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001084 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001085 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -08001086 (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001087 renderer.drawCircle(f1, f2, f3, paint);
Romain Guy01d58e42011-01-19 21:54:02 -08001088 }
1089 break;
Romain Guyc1cd9ba32011-01-23 14:18:41 -08001090 case DrawOval: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001091 float f1 = getFloat();
1092 float f2 = getFloat();
1093 float f3 = getFloat();
1094 float f4 = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001095 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001096 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
Chet Haasea1cff502012-02-21 13:43:44 -08001097 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001098 renderer.drawOval(f1, f2, f3, f4, paint);
Romain Guyc1cd9ba32011-01-23 14:18:41 -08001099 }
1100 break;
Romain Guy8b2f5262011-01-23 16:15:02 -08001101 case DrawArc: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001102 float f1 = getFloat();
1103 float f2 = getFloat();
1104 float f3 = getFloat();
1105 float f4 = getFloat();
1106 float f5 = getFloat();
1107 float f6 = getFloat();
Romain Guy33f6beb2012-02-16 19:24:51 -08001108 int32_t i1 = getInt();
Romain Guy5ff9df62012-01-23 17:09:05 -08001109 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001110 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
Chet Haasea1cff502012-02-21 13:43:44 -08001111 (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
Chet Haasedaf98e92011-01-10 14:10:36 -08001112 renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
Romain Guy8b2f5262011-01-23 16:15:02 -08001113 }
1114 break;
Romain Guyb051e892010-09-28 19:09:36 -07001115 case DrawPath: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001116 SkPath* path = getPath();
Romain Guy5ff9df62012-01-23 17:09:05 -08001117 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001118 DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1119 renderer.drawPath(path, paint);
Romain Guyb051e892010-09-28 19:09:36 -07001120 }
1121 break;
1122 case DrawLines: {
Romain Guy33f6beb2012-02-16 19:24:51 -08001123 int32_t count = 0;
Romain Guyb051e892010-09-28 19:09:36 -07001124 float* points = getFloats(count);
Romain Guy5ff9df62012-01-23 17:09:05 -08001125 SkPaint* paint = getPaint(renderer);
Chet Haasedaf98e92011-01-10 14:10:36 -08001126 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guy9ff3cb52011-06-28 14:02:11 -07001127 renderer.drawLines(points, count, paint);
Romain Guyb051e892010-09-28 19:09:36 -07001128 }
1129 break;
Romain Guyed6fcb02011-03-21 13:11:28 -07001130 case DrawPoints: {
Romain Guy33f6beb2012-02-16 19:24:51 -08001131 int32_t count = 0;
Romain Guyed6fcb02011-03-21 13:11:28 -07001132 float* points = getFloats(count);
Romain Guy5ff9df62012-01-23 17:09:05 -08001133 SkPaint* paint = getPaint(renderer);
Romain Guyed6fcb02011-03-21 13:11:28 -07001134 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guy9ff3cb52011-06-28 14:02:11 -07001135 renderer.drawPoints(points, count, paint);
Romain Guyed6fcb02011-03-21 13:11:28 -07001136 }
1137 break;
Romain Guyb051e892010-09-28 19:09:36 -07001138 case DrawText: {
1139 getText(&text);
Romain Guy33f6beb2012-02-16 19:24:51 -08001140 int32_t count = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -08001141 float x = getFloat();
1142 float y = getFloat();
Romain Guy5ff9df62012-01-23 17:09:05 -08001143 SkPaint* paint = getPaint(renderer);
Romain Guycac5fd32011-12-01 20:08:50 -08001144 float length = getFloat();
1145 DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1146 OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1147 renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
Romain Guyb051e892010-09-28 19:09:36 -07001148 }
1149 break;
Romain Guy325740f2012-02-24 16:48:34 -08001150 case DrawTextOnPath: {
1151 getText(&text);
1152 int32_t count = getInt();
1153 SkPath* path = getPath();
1154 float hOffset = getFloat();
1155 float vOffset = getFloat();
1156 SkPaint* paint = getPaint(renderer);
1157 DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1158 text.text(), text.length(), count, paint);
1159 renderer.drawTextOnPath(text.text(), text.length(), count, path,
1160 hOffset, vOffset, paint);
1161 }
1162 break;
Romain Guyeb9a5362012-01-17 17:39:26 -08001163 case DrawPosText: {
1164 getText(&text);
Romain Guy33f6beb2012-02-16 19:24:51 -08001165 int32_t count = getInt();
1166 int32_t positionsCount = 0;
Romain Guyeb9a5362012-01-17 17:39:26 -08001167 float* positions = getFloats(positionsCount);
Romain Guy5ff9df62012-01-23 17:09:05 -08001168 SkPaint* paint = getPaint(renderer);
Romain Guyeb9a5362012-01-17 17:39:26 -08001169 DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1170 OP_NAMES[op], text.text(), text.length(), count, paint);
1171 renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1172 }
1173 break;
Romain Guyb051e892010-09-28 19:09:36 -07001174 case ResetShader: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001175 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guyb051e892010-09-28 19:09:36 -07001176 renderer.resetShader();
1177 }
1178 break;
1179 case SetupShader: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001180 SkiaShader* shader = getShader();
1181 DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1182 renderer.setupShader(shader);
Romain Guyb051e892010-09-28 19:09:36 -07001183 }
1184 break;
1185 case ResetColorFilter: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001186 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guyb051e892010-09-28 19:09:36 -07001187 renderer.resetColorFilter();
1188 }
1189 break;
1190 case SetupColorFilter: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001191 SkiaColorFilter *colorFilter = getColorFilter();
1192 DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1193 renderer.setupColorFilter(colorFilter);
Romain Guyb051e892010-09-28 19:09:36 -07001194 }
1195 break;
1196 case ResetShadow: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001197 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
Romain Guyb051e892010-09-28 19:09:36 -07001198 renderer.resetShadow();
1199 }
1200 break;
1201 case SetupShadow: {
Chet Haasedaf98e92011-01-10 14:10:36 -08001202 float radius = getFloat();
1203 float dx = getFloat();
1204 float dy = getFloat();
Romain Guy33f6beb2012-02-16 19:24:51 -08001205 int32_t color = getInt();
Chet Haasedaf98e92011-01-10 14:10:36 -08001206 DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
Chet Haasea1cff502012-02-21 13:43:44 -08001207 radius, dx, dy, color);
Chet Haasedaf98e92011-01-10 14:10:36 -08001208 renderer.setupShadow(radius, dx, dy, color);
Romain Guyb051e892010-09-28 19:09:36 -07001209 }
1210 break;
Romain Guy5ff9df62012-01-23 17:09:05 -08001211 case ResetPaintFilter: {
1212 DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1213 renderer.resetPaintFilter();
1214 }
1215 break;
1216 case SetupPaintFilter: {
Romain Guy33f6beb2012-02-16 19:24:51 -08001217 int32_t clearBits = getInt();
1218 int32_t setBits = getInt();
Romain Guy5ff9df62012-01-23 17:09:05 -08001219 DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
1220 clearBits, setBits);
1221 renderer.setupPaintFilter(clearBits, setBits);
1222 }
1223 break;
Chet Haasedaf98e92011-01-10 14:10:36 -08001224 default:
1225 DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
Chet Haasea1cff502012-02-21 13:43:44 -08001226 (char*) indent, OP_NAMES[op]);
Chet Haasedaf98e92011-01-10 14:10:36 -08001227 break;
Romain Guyb051e892010-09-28 19:09:36 -07001228 }
1229 }
Romain Guyffac7fc2011-01-13 17:21:49 -08001230
Chet Haasea1cff502012-02-21 13:43:44 -08001231 if (USE_DISPLAY_LIST_PROPERTIES) {
1232 DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
1233 renderer.restoreToCount(restoreTo);
1234 }
Romain Guy13631f32012-01-30 17:41:55 -08001235 renderer.endMark();
1236
Chet Haasea1cff502012-02-21 13:43:44 -08001237 DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
Romain Guy65549432012-03-26 16:45:05 -07001238 drawGlStatus);
1239 return drawGlStatus;
Romain Guyb051e892010-09-28 19:09:36 -07001240}
1241
1242///////////////////////////////////////////////////////////////////////////////
Romain Guy4aa90572010-09-26 18:40:37 -07001243// Base structure
1244///////////////////////////////////////////////////////////////////////////////
1245
Chet Haasea1cff502012-02-21 13:43:44 -08001246DisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
Romain Guy33f6beb2012-02-16 19:24:51 -08001247 mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
Romain Guy4aa90572010-09-26 18:40:37 -07001248}
1249
1250DisplayListRenderer::~DisplayListRenderer() {
1251 reset();
1252}
1253
1254void DisplayListRenderer::reset() {
Romain Guy4aa90572010-09-26 18:40:37 -07001255 mWriter.reset();
Chet Haase5c13d892010-10-08 08:37:55 -07001256
1257 Caches& caches = Caches::getInstance();
1258 for (size_t i = 0; i < mBitmapResources.size(); i++) {
Romain Guyd586ad92011-06-22 16:14:36 -07001259 caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
Chet Haase5c13d892010-10-08 08:37:55 -07001260 }
1261 mBitmapResources.clear();
Chet Haased98aa2d2010-10-25 15:47:32 -07001262
Romain Guyd586ad92011-06-22 16:14:36 -07001263 for (size_t i = 0; i < mFilterResources.size(); i++) {
1264 caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1265 }
1266 mFilterResources.clear();
1267
Romain Guy43ccf462011-01-14 18:51:01 -08001268 for (size_t i = 0; i < mShaders.size(); i++) {
Romain Guyd586ad92011-06-22 16:14:36 -07001269 caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
Romain Guy43ccf462011-01-14 18:51:01 -08001270 }
Romain Guy24c00212011-01-14 15:31:00 -08001271 mShaders.clear();
1272 mShaderMap.clear();
Romain Guy43ccf462011-01-14 18:51:01 -08001273
1274 mPaints.clear();
1275 mPaintMap.clear();
Romain Guyd586ad92011-06-22 16:14:36 -07001276
Romain Guy2fc941e2011-02-03 15:06:05 -08001277 mPaths.clear();
1278 mPathMap.clear();
Romain Guyd586ad92011-06-22 16:14:36 -07001279
Chet Haased98aa2d2010-10-25 15:47:32 -07001280 mMatrices.clear();
Romain Guy04c9d8c2011-08-25 14:01:48 -07001281
1282 mHasDrawOps = false;
Romain Guy4aa90572010-09-26 18:40:37 -07001283}
1284
1285///////////////////////////////////////////////////////////////////////////////
1286// Operations
1287///////////////////////////////////////////////////////////////////////////////
1288
Jeff Brown162a0212011-07-21 17:02:54 -07001289DisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1290 if (!displayList) {
1291 displayList = new DisplayList(*this);
Chet Haase5977baa2011-01-05 18:01:22 -08001292 } else {
Jeff Brown162a0212011-07-21 17:02:54 -07001293 displayList->initFromDisplayListRenderer(*this, true);
Chet Haase5977baa2011-01-05 18:01:22 -08001294 }
Romain Guy04c9d8c2011-08-25 14:01:48 -07001295 displayList->setRenderable(mHasDrawOps);
Jeff Brown162a0212011-07-21 17:02:54 -07001296 return displayList;
Chet Haase5977baa2011-01-05 18:01:22 -08001297}
1298
Romain Guyb051e892010-09-28 19:09:36 -07001299void DisplayListRenderer::setViewport(int width, int height) {
1300 mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1301
1302 mWidth = width;
1303 mHeight = height;
1304}
1305
Romain Guy7d7b5492011-01-24 16:33:45 -08001306void DisplayListRenderer::prepareDirty(float left, float top,
1307 float right, float bottom, bool opaque) {
Romain Guyb051e892010-09-28 19:09:36 -07001308 mSnapshot = new Snapshot(mFirstSnapshot,
1309 SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1310 mSaveCount = 1;
1311 mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
Romain Guy27454a42011-01-23 12:01:41 -08001312 mRestoreSaveCount = -1;
1313}
1314
1315void DisplayListRenderer::finish() {
1316 insertRestoreToCount();
Romain Guy33f6beb2012-02-16 19:24:51 -08001317 insertTranlate();
Romain Guyb051e892010-09-28 19:09:36 -07001318}
1319
Chet Haasedaf98e92011-01-10 14:10:36 -08001320void DisplayListRenderer::interrupt() {
Chet Haasedaf98e92011-01-10 14:10:36 -08001321}
Romain Guy2b1847e2011-01-26 13:43:01 -08001322
Chet Haasedaf98e92011-01-10 14:10:36 -08001323void DisplayListRenderer::resume() {
Romain Guy4aa90572010-09-26 18:40:37 -07001324}
1325
Romain Guy65549432012-03-26 16:45:05 -07001326status_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
Romain Guycabfcc12011-03-07 18:06:46 -08001327 // Ignore dirty during recording, it matters only when we replay
Chet Haasedaf98e92011-01-10 14:10:36 -08001328 addOp(DisplayList::DrawGLFunction);
1329 addInt((int) functor);
Romain Guy65549432012-03-26 16:45:05 -07001330 return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
Chet Haasedaf98e92011-01-10 14:10:36 -08001331}
1332
Romain Guy4aa90572010-09-26 18:40:37 -07001333int DisplayListRenderer::save(int flags) {
Romain Guyb051e892010-09-28 19:09:36 -07001334 addOp(DisplayList::Save);
Romain Guy4aa90572010-09-26 18:40:37 -07001335 addInt(flags);
1336 return OpenGLRenderer::save(flags);
1337}
1338
1339void DisplayListRenderer::restore() {
Romain Guy04c9d8c2011-08-25 14:01:48 -07001340 if (mRestoreSaveCount < 0) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001341 restoreToCount(getSaveCount() - 1);
1342 return;
Romain Guy04c9d8c2011-08-25 14:01:48 -07001343 }
Romain Guy33f6beb2012-02-16 19:24:51 -08001344
1345 mRestoreSaveCount--;
1346 insertTranlate();
Romain Guy4aa90572010-09-26 18:40:37 -07001347 OpenGLRenderer::restore();
1348}
1349
1350void DisplayListRenderer::restoreToCount(int saveCount) {
Romain Guy27454a42011-01-23 12:01:41 -08001351 mRestoreSaveCount = saveCount;
Romain Guy33f6beb2012-02-16 19:24:51 -08001352 insertTranlate();
Romain Guy4aa90572010-09-26 18:40:37 -07001353 OpenGLRenderer::restoreToCount(saveCount);
1354}
1355
1356int DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
Chet Haase5c13d892010-10-08 08:37:55 -07001357 SkPaint* p, int flags) {
Romain Guyb051e892010-09-28 19:09:36 -07001358 addOp(DisplayList::SaveLayer);
Romain Guy4aa90572010-09-26 18:40:37 -07001359 addBounds(left, top, right, bottom);
1360 addPaint(p);
1361 addInt(flags);
Romain Guyb051e892010-09-28 19:09:36 -07001362 return OpenGLRenderer::save(flags);
Romain Guy4aa90572010-09-26 18:40:37 -07001363}
1364
Romain Guy5b3b3522010-10-27 18:57:51 -07001365int DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
1366 int alpha, int flags) {
1367 addOp(DisplayList::SaveLayerAlpha);
1368 addBounds(left, top, right, bottom);
1369 addInt(alpha);
1370 addInt(flags);
1371 return OpenGLRenderer::save(flags);
1372}
1373
Romain Guy4aa90572010-09-26 18:40:37 -07001374void DisplayListRenderer::translate(float dx, float dy) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001375 mHasTranslate = true;
1376 mTranslateX += dx;
1377 mTranslateY += dy;
1378 insertRestoreToCount();
Romain Guy4aa90572010-09-26 18:40:37 -07001379 OpenGLRenderer::translate(dx, dy);
1380}
1381
1382void DisplayListRenderer::rotate(float degrees) {
Romain Guyb051e892010-09-28 19:09:36 -07001383 addOp(DisplayList::Rotate);
Romain Guy4aa90572010-09-26 18:40:37 -07001384 addFloat(degrees);
1385 OpenGLRenderer::rotate(degrees);
1386}
1387
1388void DisplayListRenderer::scale(float sx, float sy) {
Romain Guyb051e892010-09-28 19:09:36 -07001389 addOp(DisplayList::Scale);
Romain Guy4aa90572010-09-26 18:40:37 -07001390 addPoint(sx, sy);
1391 OpenGLRenderer::scale(sx, sy);
1392}
1393
Romain Guy807daf72011-01-18 11:19:19 -08001394void DisplayListRenderer::skew(float sx, float sy) {
1395 addOp(DisplayList::Skew);
1396 addPoint(sx, sy);
1397 OpenGLRenderer::skew(sx, sy);
1398}
1399
Romain Guy4aa90572010-09-26 18:40:37 -07001400void DisplayListRenderer::setMatrix(SkMatrix* matrix) {
Romain Guyb051e892010-09-28 19:09:36 -07001401 addOp(DisplayList::SetMatrix);
Romain Guy4aa90572010-09-26 18:40:37 -07001402 addMatrix(matrix);
1403 OpenGLRenderer::setMatrix(matrix);
1404}
1405
1406void DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
Romain Guyb051e892010-09-28 19:09:36 -07001407 addOp(DisplayList::ConcatMatrix);
Romain Guy4aa90572010-09-26 18:40:37 -07001408 addMatrix(matrix);
1409 OpenGLRenderer::concatMatrix(matrix);
1410}
1411
1412bool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
1413 SkRegion::Op op) {
Romain Guyb051e892010-09-28 19:09:36 -07001414 addOp(DisplayList::ClipRect);
Romain Guy4aa90572010-09-26 18:40:37 -07001415 addBounds(left, top, right, bottom);
1416 addInt(op);
1417 return OpenGLRenderer::clipRect(left, top, right, bottom, op);
1418}
1419
Romain Guy65549432012-03-26 16:45:05 -07001420status_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
Romain Guy33f6beb2012-02-16 19:24:51 -08001421 uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
Romain Guycabfcc12011-03-07 18:06:46 -08001422 // dirty is an out parameter and should not be recorded,
1423 // it matters only when replaying the display list
Chet Haasea1cff502012-02-21 13:43:44 -08001424 float top = 0;
1425 float left = 0;
1426 float right = width;
1427 float bottom = height;
1428 if (USE_DISPLAY_LIST_PROPERTIES) {
1429 Rect transformedRect;
1430 displayList->transformRect(left, top, right, bottom, transformedRect);
1431 left = transformedRect.left;
1432 top = transformedRect.top;
1433 right = transformedRect.right;
1434 bottom = transformedRect.bottom;
1435 }
1436 const bool reject = quickReject(left, top, right, bottom);
Romain Guy33f6beb2012-02-16 19:24:51 -08001437 uint32_t* location = addOp(DisplayList::DrawDisplayList, reject);
Romain Guy0fe478e2010-11-08 12:08:41 -08001438 addDisplayList(displayList);
Romain Guy7b5b6ab2011-03-14 18:05:08 -07001439 addSize(width, height);
Romain Guy33f6beb2012-02-16 19:24:51 -08001440 addInt(flags);
1441 addSkip(location);
Romain Guy65549432012-03-26 16:45:05 -07001442 return DrawGlInfo::kStatusDone;
Romain Guy0fe478e2010-11-08 12:08:41 -08001443}
1444
Romain Guyada830f2011-01-13 12:13:20 -08001445void DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
Romain Guy6c319ca2011-01-11 14:29:25 -08001446 addOp(DisplayList::DrawLayer);
Romain Guyada830f2011-01-13 12:13:20 -08001447 addInt((int) layer);
1448 addPoint(x, y);
Romain Guy6c319ca2011-01-11 14:29:25 -08001449 addPaint(paint);
1450}
1451
Romain Guy33f6beb2012-02-16 19:24:51 -08001452void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
1453 const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
1454 uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001455 addBitmap(bitmap);
1456 addPoint(left, top);
1457 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001458 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001459}
1460
Romain Guy33f6beb2012-02-16 19:24:51 -08001461void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
1462 Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
1463 const mat4 transform(*matrix);
1464 transform.mapRect(r);
1465
1466 const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
1467 uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001468 addBitmap(bitmap);
1469 addMatrix(matrix);
1470 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001471 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001472}
1473
1474void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
1475 float srcRight, float srcBottom, float dstLeft, float dstTop,
Chet Haase5c13d892010-10-08 08:37:55 -07001476 float dstRight, float dstBottom, SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001477 const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
1478 uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001479 addBitmap(bitmap);
1480 addBounds(srcLeft, srcTop, srcRight, srcBottom);
1481 addBounds(dstLeft, dstTop, dstRight, dstBottom);
1482 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001483 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001484}
1485
Romain Guy5a7b4662011-01-20 19:09:30 -08001486void DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
1487 float* vertices, int* colors, SkPaint* paint) {
1488 addOp(DisplayList::DrawBitmapMesh);
1489 addBitmap(bitmap);
1490 addInt(meshWidth);
1491 addInt(meshHeight);
1492 addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
1493 if (colors) {
1494 addInt(1);
1495 addInts(colors, (meshWidth + 1) * (meshHeight + 1));
1496 } else {
1497 addInt(0);
1498 }
1499 addPaint(paint);
1500}
1501
Romain Guy4aa90572010-09-26 18:40:37 -07001502void DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
Romain Guy4bb94202010-10-12 15:59:26 -07001503 const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
Chet Haase5c13d892010-10-08 08:37:55 -07001504 float left, float top, float right, float bottom, SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001505 const bool reject = quickReject(left, top, right, bottom);
1506 uint32_t* location = addOp(DisplayList::DrawPatch, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001507 addBitmap(bitmap);
1508 addInts(xDivs, width);
1509 addInts(yDivs, height);
Romain Guy4bb94202010-10-12 15:59:26 -07001510 addUInts(colors, numColors);
Romain Guy4aa90572010-09-26 18:40:37 -07001511 addBounds(left, top, right, bottom);
1512 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001513 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001514}
1515
1516void DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
Romain Guyb051e892010-09-28 19:09:36 -07001517 addOp(DisplayList::DrawColor);
Romain Guy4aa90572010-09-26 18:40:37 -07001518 addInt(color);
1519 addInt(mode);
Romain Guy4aa90572010-09-26 18:40:37 -07001520}
1521
1522void DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
Chet Haase5c13d892010-10-08 08:37:55 -07001523 SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001524 const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
1525 quickReject(left, top, right, bottom);
1526 uint32_t* location = addOp(DisplayList::DrawRect, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001527 addBounds(left, top, right, bottom);
1528 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001529 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001530}
1531
Romain Guy01d58e42011-01-19 21:54:02 -08001532void DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
Chet Haasea1cff502012-02-21 13:43:44 -08001533 float rx, float ry, SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001534 const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
1535 quickReject(left, top, right, bottom);
1536 uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
Romain Guy01d58e42011-01-19 21:54:02 -08001537 addBounds(left, top, right, bottom);
1538 addPoint(rx, ry);
1539 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001540 addSkip(location);
Romain Guy01d58e42011-01-19 21:54:02 -08001541}
1542
1543void DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
1544 addOp(DisplayList::DrawCircle);
1545 addPoint(x, y);
1546 addFloat(radius);
1547 addPaint(paint);
1548}
1549
Romain Guyc1cd9ba32011-01-23 14:18:41 -08001550void DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1551 SkPaint* paint) {
1552 addOp(DisplayList::DrawOval);
1553 addBounds(left, top, right, bottom);
1554 addPaint(paint);
1555}
1556
Romain Guy8b2f5262011-01-23 16:15:02 -08001557void DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
1558 float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
Romain Guy82d41a52011-01-24 21:53:42 -08001559 addOp(DisplayList::DrawArc);
Romain Guy8b2f5262011-01-23 16:15:02 -08001560 addBounds(left, top, right, bottom);
1561 addPoint(startAngle, sweepAngle);
1562 addInt(useCenter ? 1 : 0);
1563 addPaint(paint);
1564}
1565
Romain Guy4aa90572010-09-26 18:40:37 -07001566void DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001567 float left, top, offset;
1568 uint32_t width, height;
1569 computePathBounds(path, paint, left, top, offset, width, height);
1570
1571 const bool reject = quickReject(left - offset, top - offset, width, height);
1572 uint32_t* location = addOp(DisplayList::DrawPath, reject);
Romain Guy4aa90572010-09-26 18:40:37 -07001573 addPath(path);
1574 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001575 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001576}
1577
Chet Haase5c13d892010-10-08 08:37:55 -07001578void DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -07001579 addOp(DisplayList::DrawLines);
Romain Guy4aa90572010-09-26 18:40:37 -07001580 addFloats(points, count);
1581 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -07001582}
1583
Romain Guyed6fcb02011-03-21 13:11:28 -07001584void DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1585 addOp(DisplayList::DrawPoints);
1586 addFloats(points, count);
1587 addPaint(paint);
1588}
1589
Romain Guy4aa90572010-09-26 18:40:37 -07001590void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
Romain Guycac5fd32011-12-01 20:08:50 -08001591 float x, float y, SkPaint* paint, float length) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001592 if (!text || count <= 0) return;
1593
Romain Guy8f9a9f62011-12-05 11:53:26 -08001594 // TODO: We should probably make a copy of the paint instead of modifying
1595 // it; modifying the paint will change its generationID the first
1596 // time, which might impact caches. More investigation needed to
1597 // see if it matters.
1598 // If we make a copy, then drawTextDecorations() should *not* make
1599 // its own copy as it does right now.
Fabrice Di Meglioc511bee82012-01-05 13:30:54 -08001600 // Beware: this needs Glyph encoding (already done on the Paint constructor)
Romain Guy8f9a9f62011-12-05 11:53:26 -08001601 paint->setAntiAlias(true);
Romain Guy33f6beb2012-02-16 19:24:51 -08001602 if (length < 0.0f) length = paint->measureText(text, bytesCount);
1603
1604 bool reject = false;
1605 if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
1606 SkPaint::FontMetrics metrics;
1607 paint->getFontMetrics(&metrics, 0.0f);
1608 reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
1609 }
1610
1611 uint32_t* location = addOp(DisplayList::DrawText, reject);
1612 addText(text, bytesCount);
1613 addInt(count);
1614 addPoint(x, y);
Romain Guy4aa90572010-09-26 18:40:37 -07001615 addPaint(paint);
Romain Guy33f6beb2012-02-16 19:24:51 -08001616 addFloat(length);
1617 addSkip(location);
Romain Guy4aa90572010-09-26 18:40:37 -07001618}
1619
Romain Guy325740f2012-02-24 16:48:34 -08001620void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1621 SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1622 if (!text || count <= 0) return;
1623 addOp(DisplayList::DrawTextOnPath);
1624 addText(text, bytesCount);
1625 addInt(count);
1626 addPath(path);
1627 addFloat(hOffset);
1628 addFloat(vOffset);
1629 paint->setAntiAlias(true);
1630 addPaint(paint);
1631}
1632
Romain Guyeb9a5362012-01-17 17:39:26 -08001633void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1634 const float* positions, SkPaint* paint) {
Romain Guy33f6beb2012-02-16 19:24:51 -08001635 if (!text || count <= 0) return;
Romain Guyeb9a5362012-01-17 17:39:26 -08001636 addOp(DisplayList::DrawPosText);
1637 addText(text, bytesCount);
1638 addInt(count);
1639 addFloats(positions, count * 2);
1640 paint->setAntiAlias(true);
1641 addPaint(paint);
1642}
1643
Romain Guy4aa90572010-09-26 18:40:37 -07001644void DisplayListRenderer::resetShader() {
Romain Guyb051e892010-09-28 19:09:36 -07001645 addOp(DisplayList::ResetShader);
Romain Guy4aa90572010-09-26 18:40:37 -07001646}
1647
1648void DisplayListRenderer::setupShader(SkiaShader* shader) {
Chet Haase5c13d892010-10-08 08:37:55 -07001649 addOp(DisplayList::SetupShader);
1650 addShader(shader);
Romain Guy4aa90572010-09-26 18:40:37 -07001651}
1652
1653void DisplayListRenderer::resetColorFilter() {
Romain Guyb051e892010-09-28 19:09:36 -07001654 addOp(DisplayList::ResetColorFilter);
Romain Guy4aa90572010-09-26 18:40:37 -07001655}
1656
1657void DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
Chet Haasead93c2b2010-10-22 16:17:12 -07001658 addOp(DisplayList::SetupColorFilter);
1659 addColorFilter(filter);
Romain Guy4aa90572010-09-26 18:40:37 -07001660}
1661
1662void DisplayListRenderer::resetShadow() {
Romain Guyb051e892010-09-28 19:09:36 -07001663 addOp(DisplayList::ResetShadow);
Romain Guy4aa90572010-09-26 18:40:37 -07001664}
1665
1666void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
Romain Guyb051e892010-09-28 19:09:36 -07001667 addOp(DisplayList::SetupShadow);
Romain Guy4aa90572010-09-26 18:40:37 -07001668 addFloat(radius);
1669 addPoint(dx, dy);
1670 addInt(color);
Romain Guy4aa90572010-09-26 18:40:37 -07001671}
1672
Romain Guy5ff9df62012-01-23 17:09:05 -08001673void DisplayListRenderer::resetPaintFilter() {
1674 addOp(DisplayList::ResetPaintFilter);
1675}
1676
1677void DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
1678 addOp(DisplayList::SetupPaintFilter);
1679 addInt(clearBits);
1680 addInt(setBits);
1681}
1682
Romain Guy4aa90572010-09-26 18:40:37 -07001683}; // namespace uirenderer
1684}; // namespace android