blob: fdb4e8ce8532a5d29ca6f1fb0f5f297f0e9c0771 [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
19#include "DisplayListRenderer.h"
20
21namespace android {
22namespace uirenderer {
23
24///////////////////////////////////////////////////////////////////////////////
Romain Guy7975fb62010-10-01 16:36:14 -070025// Defines
26///////////////////////////////////////////////////////////////////////////////
27
28#define PATH_HEAP_SIZE 64
29
30///////////////////////////////////////////////////////////////////////////////
31// Helpers
32///////////////////////////////////////////////////////////////////////////////
33
34PathHeap::PathHeap(): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
35}
36
37PathHeap::PathHeap(SkFlattenableReadBuffer& buffer): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
38 int count = buffer.readS32();
39
40 mPaths.setCount(count);
41 SkPath** ptr = mPaths.begin();
42 SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath));
43
44 for (int i = 0; i < count; i++) {
45 new (p) SkPath;
46 p->unflatten(buffer);
47 *ptr++ = p;
48 p++;
49 }
50}
51
52PathHeap::~PathHeap() {
53 SkPath** iter = mPaths.begin();
54 SkPath** stop = mPaths.end();
55 while (iter < stop) {
56 (*iter)->~SkPath();
57 iter++;
58 }
59}
60
61int PathHeap::append(const SkPath& path) {
62 SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath));
63 new (p) SkPath(path);
64 *mPaths.append() = p;
65 return mPaths.count();
66}
67
68void PathHeap::flatten(SkFlattenableWriteBuffer& buffer) const {
69 int count = mPaths.count();
70
71 buffer.write32(count);
72 SkPath** iter = mPaths.begin();
73 SkPath** stop = mPaths.end();
74 while (iter < stop) {
75 (*iter)->flatten(buffer);
76 iter++;
77 }
78}
79
80///////////////////////////////////////////////////////////////////////////////
Romain Guyb051e892010-09-28 19:09:36 -070081// Display list
82///////////////////////////////////////////////////////////////////////////////
83
84DisplayList::DisplayList(const DisplayListRenderer& recorder) {
Chet Haase5977baa2011-01-05 18:01:22 -080085 initFromDisplayListRenderer(recorder);
86}
87
88DisplayList::~DisplayList() {
89 sk_free((void*) mReader.base());
90
91 Caches& caches = Caches::getInstance();
92
93 for (size_t i = 0; i < mBitmapResources.size(); i++) {
94 caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
95 }
96 mBitmapResources.clear();
97
98 for (size_t i = 0; i < mShaderResources.size(); i++) {
99 caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i));
100 }
101 mShaderResources.clear();
102
103 for (size_t i = 0; i < mPaints.size(); i++) {
104 delete mPaints.itemAt(i);
105 }
106 mPaints.clear();
107
108 for (size_t i = 0; i < mMatrices.size(); i++) {
109 delete mMatrices.itemAt(i);
110 }
111 mMatrices.clear();
112
113 if (mPathHeap) {
114 for (int i = 0; i < mPathHeap->count(); i++) {
115 caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
116 }
117 mPathHeap->safeUnref();
118 }
119}
120
121void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
Romain Guyb051e892010-09-28 19:09:36 -0700122 const SkWriter32& writer = recorder.writeStream();
123 init();
124
125 if (writer.size() == 0) {
126 return;
127 }
128
129 size_t size = writer.size();
130 void* buffer = sk_malloc_throw(size);
131 writer.flatten(buffer);
132 mReader.setMemory(buffer, size);
133
134 mRCPlayback.reset(&recorder.mRCRecorder);
135 mRCPlayback.setupBuffer(mReader);
136
137 mTFPlayback.reset(&recorder.mTFRecorder);
138 mTFPlayback.setupBuffer(mReader);
139
Chet Haase5c13d892010-10-08 08:37:55 -0700140 Caches& caches = Caches::getInstance();
Romain Guyb051e892010-09-28 19:09:36 -0700141
Chet Haase5c13d892010-10-08 08:37:55 -0700142 const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
143 for (size_t i = 0; i < bitmapResources.size(); i++) {
144 SkBitmap* resource = bitmapResources.itemAt(i);
145 mBitmapResources.add(resource);
146 caches.resourceCache.incrementRefcount(resource);
Romain Guyb051e892010-09-28 19:09:36 -0700147 }
Chet Haased98aa2d2010-10-25 15:47:32 -0700148
Chet Haase5c13d892010-10-08 08:37:55 -0700149 const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources();
150 for (size_t i = 0; i < shaderResources.size(); i++) {
151 SkiaShader* resource = shaderResources.itemAt(i);
152 mShaderResources.add(resource);
153 caches.resourceCache.incrementRefcount(resource);
Romain Guyb051e892010-09-28 19:09:36 -0700154 }
155
Chet Haased98aa2d2010-10-25 15:47:32 -0700156 const Vector<SkPaint*> &paints = recorder.getPaints();
157 for (size_t i = 0; i < paints.size(); i++) {
158 mPaints.add(paints.itemAt(i));
159 }
160
161 const Vector<SkMatrix*> &matrices = recorder.getMatrices();
162 for (size_t i = 0; i < matrices.size(); i++) {
163 mMatrices.add(matrices.itemAt(i));
164 }
165
Romain Guyb051e892010-09-28 19:09:36 -0700166 mPathHeap = recorder.mPathHeap;
Romain Guy9e108412010-11-09 14:35:20 -0800167 if (mPathHeap) {
168 mPathHeap->safeRef();
169 }
Romain Guyb051e892010-09-28 19:09:36 -0700170}
171
Romain Guyb051e892010-09-28 19:09:36 -0700172void DisplayList::init() {
Romain Guyb051e892010-09-28 19:09:36 -0700173 mPathHeap = NULL;
Romain Guyb051e892010-09-28 19:09:36 -0700174}
175
176void DisplayList::replay(OpenGLRenderer& renderer) {
177 TextContainer text;
178 mReader.rewind();
179
180 int saveCount = renderer.getSaveCount() - 1;
181
182 while (!mReader.eof()) {
Romain Guy5b3b3522010-10-27 18:57:51 -0700183 int op = mReader.readInt();
184 switch (op) {
Romain Guyb051e892010-09-28 19:09:36 -0700185 case AcquireContext: {
186 renderer.acquireContext();
187 }
188 break;
189 case ReleaseContext: {
190 renderer.releaseContext();
191 }
192 break;
193 case Save: {
194 renderer.save(getInt());
195 }
196 break;
197 case Restore: {
198 renderer.restore();
199 }
200 break;
201 case RestoreToCount: {
202 renderer.restoreToCount(saveCount + getInt());
203 }
204 break;
205 case SaveLayer: {
206 renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
207 getPaint(), getInt());
208 }
209 break;
Romain Guy5b3b3522010-10-27 18:57:51 -0700210 case SaveLayerAlpha: {
211 renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
212 getInt(), getInt());
213 }
214 break;
Romain Guyb051e892010-09-28 19:09:36 -0700215 case Translate: {
216 renderer.translate(getFloat(), getFloat());
217 }
218 break;
219 case Rotate: {
220 renderer.rotate(getFloat());
221 }
222 break;
223 case Scale: {
224 renderer.scale(getFloat(), getFloat());
225 }
226 break;
227 case SetMatrix: {
228 renderer.setMatrix(getMatrix());
229 }
230 break;
231 case ConcatMatrix: {
232 renderer.concatMatrix(getMatrix());
233 }
234 break;
235 case ClipRect: {
236 renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
237 (SkRegion::Op) getInt());
238 }
239 break;
Romain Guy0fe478e2010-11-08 12:08:41 -0800240 case DrawDisplayList: {
241 renderer.drawDisplayList(getDisplayList());
242 }
243 break;
Romain Guy6c319ca2011-01-11 14:29:25 -0800244 case DrawLayer: {
245 renderer.drawLayer(getInt(), getFloat(), getFloat(), getFloat(), getFloat(),
246 getFloat(), getFloat(), getPaint());
247 }
248 break;
Romain Guyb051e892010-09-28 19:09:36 -0700249 case DrawBitmap: {
250 renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
251 }
252 break;
253 case DrawBitmapMatrix: {
254 renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
255 }
256 break;
257 case DrawBitmapRect: {
258 renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
259 getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
260 }
261 break;
262 case DrawPatch: {
263 int32_t* xDivs = NULL;
264 int32_t* yDivs = NULL;
Romain Guy4bb94202010-10-12 15:59:26 -0700265 uint32_t* colors = NULL;
Romain Guyb051e892010-09-28 19:09:36 -0700266 uint32_t xDivsCount = 0;
267 uint32_t yDivsCount = 0;
Romain Guy4bb94202010-10-12 15:59:26 -0700268 int8_t numColors = 0;
Romain Guyb051e892010-09-28 19:09:36 -0700269
270 SkBitmap* bitmap = getBitmap();
271
272 xDivs = getInts(xDivsCount);
273 yDivs = getInts(yDivsCount);
Romain Guy4bb94202010-10-12 15:59:26 -0700274 colors = getUInts(numColors);
Romain Guyb051e892010-09-28 19:09:36 -0700275
Romain Guy4bb94202010-10-12 15:59:26 -0700276 renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
277 numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
Romain Guyb051e892010-09-28 19:09:36 -0700278 }
279 break;
280 case DrawColor: {
281 renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
282 }
283 break;
284 case DrawRect: {
285 renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
286 }
287 break;
288 case DrawPath: {
289 renderer.drawPath(getPath(), getPaint());
290 }
291 break;
292 case DrawLines: {
293 int count = 0;
294 float* points = getFloats(count);
295 renderer.drawLines(points, count, getPaint());
296 }
297 break;
298 case DrawText: {
299 getText(&text);
300 renderer.drawText(text.text(), text.length(), getInt(),
301 getFloat(), getFloat(), getPaint());
302 }
303 break;
304 case ResetShader: {
305 renderer.resetShader();
306 }
307 break;
308 case SetupShader: {
Chet Haase5c13d892010-10-08 08:37:55 -0700309 renderer.setupShader(getShader());
Romain Guyb051e892010-09-28 19:09:36 -0700310 }
311 break;
312 case ResetColorFilter: {
313 renderer.resetColorFilter();
314 }
315 break;
316 case SetupColorFilter: {
Chet Haasead93c2b2010-10-22 16:17:12 -0700317 renderer.setupColorFilter(getColorFilter());
Romain Guyb051e892010-09-28 19:09:36 -0700318 }
319 break;
320 case ResetShadow: {
321 renderer.resetShadow();
322 }
323 break;
324 case SetupShadow: {
325 renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
326 }
327 break;
328 }
329 }
330}
331
332///////////////////////////////////////////////////////////////////////////////
Romain Guy4aa90572010-09-26 18:40:37 -0700333// Base structure
334///////////////////////////////////////////////////////////////////////////////
335
336DisplayListRenderer::DisplayListRenderer():
337 mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
Romain Guy4aa90572010-09-26 18:40:37 -0700338 mPathHeap = NULL;
Chet Haase5977baa2011-01-05 18:01:22 -0800339 mDisplayList = NULL;
Romain Guy4aa90572010-09-26 18:40:37 -0700340}
341
342DisplayListRenderer::~DisplayListRenderer() {
343 reset();
344}
345
346void DisplayListRenderer::reset() {
347 if (mPathHeap) {
348 mPathHeap->unref();
349 mPathHeap = NULL;
350 }
351
Romain Guy4aa90572010-09-26 18:40:37 -0700352 mWriter.reset();
353 mHeap.reset();
354
355 mRCRecorder.reset();
356 mTFRecorder.reset();
Chet Haase5c13d892010-10-08 08:37:55 -0700357
358 Caches& caches = Caches::getInstance();
359 for (size_t i = 0; i < mBitmapResources.size(); i++) {
360 SkBitmap* resource = mBitmapResources.itemAt(i);
361 caches.resourceCache.decrementRefcount(resource);
362 }
363 mBitmapResources.clear();
Chet Haased98aa2d2010-10-25 15:47:32 -0700364
Chet Haase5c13d892010-10-08 08:37:55 -0700365 for (size_t i = 0; i < mShaderResources.size(); i++) {
366 SkiaShader* resource = mShaderResources.itemAt(i);
367 caches.resourceCache.decrementRefcount(resource);
368 }
369 mShaderResources.clear();
Chet Haased98aa2d2010-10-25 15:47:32 -0700370
371 mPaints.clear();
372 mPaintMap.clear();
373 mMatrices.clear();
Romain Guy4aa90572010-09-26 18:40:37 -0700374}
375
376///////////////////////////////////////////////////////////////////////////////
377// Operations
378///////////////////////////////////////////////////////////////////////////////
379
Chet Haase5977baa2011-01-05 18:01:22 -0800380DisplayList* DisplayListRenderer::getDisplayList() {
381 if (mDisplayList == NULL) {
382 mDisplayList = new DisplayList(*this);
383 } else {
384 mDisplayList->initFromDisplayListRenderer(*this);
385 }
386 return mDisplayList;
387}
388
Romain Guyb051e892010-09-28 19:09:36 -0700389void DisplayListRenderer::setViewport(int width, int height) {
390 mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
391
392 mWidth = width;
393 mHeight = height;
394}
395
Romain Guy6b7bd242010-10-06 19:49:23 -0700396void DisplayListRenderer::prepare(bool opaque) {
Romain Guyb051e892010-09-28 19:09:36 -0700397 mSnapshot = new Snapshot(mFirstSnapshot,
398 SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
399 mSaveCount = 1;
400 mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
401}
402
Romain Guy4aa90572010-09-26 18:40:37 -0700403void DisplayListRenderer::acquireContext() {
Romain Guyb051e892010-09-28 19:09:36 -0700404 addOp(DisplayList::AcquireContext);
Romain Guy4aa90572010-09-26 18:40:37 -0700405 OpenGLRenderer::acquireContext();
406}
407
408void DisplayListRenderer::releaseContext() {
Romain Guyb051e892010-09-28 19:09:36 -0700409 addOp(DisplayList::ReleaseContext);
Romain Guy4aa90572010-09-26 18:40:37 -0700410 OpenGLRenderer::releaseContext();
411}
412
413int DisplayListRenderer::save(int flags) {
Romain Guyb051e892010-09-28 19:09:36 -0700414 addOp(DisplayList::Save);
Romain Guy4aa90572010-09-26 18:40:37 -0700415 addInt(flags);
416 return OpenGLRenderer::save(flags);
417}
418
419void DisplayListRenderer::restore() {
Romain Guyb051e892010-09-28 19:09:36 -0700420 addOp(DisplayList::Restore);
Romain Guy4aa90572010-09-26 18:40:37 -0700421 OpenGLRenderer::restore();
422}
423
424void DisplayListRenderer::restoreToCount(int saveCount) {
Romain Guyb051e892010-09-28 19:09:36 -0700425 addOp(DisplayList::RestoreToCount);
Romain Guy4aa90572010-09-26 18:40:37 -0700426 addInt(saveCount);
427 OpenGLRenderer::restoreToCount(saveCount);
428}
429
430int DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
Chet Haase5c13d892010-10-08 08:37:55 -0700431 SkPaint* p, int flags) {
Romain Guyb051e892010-09-28 19:09:36 -0700432 addOp(DisplayList::SaveLayer);
Romain Guy4aa90572010-09-26 18:40:37 -0700433 addBounds(left, top, right, bottom);
434 addPaint(p);
435 addInt(flags);
Romain Guyb051e892010-09-28 19:09:36 -0700436 return OpenGLRenderer::save(flags);
Romain Guy4aa90572010-09-26 18:40:37 -0700437}
438
Romain Guy5b3b3522010-10-27 18:57:51 -0700439int DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
440 int alpha, int flags) {
441 addOp(DisplayList::SaveLayerAlpha);
442 addBounds(left, top, right, bottom);
443 addInt(alpha);
444 addInt(flags);
445 return OpenGLRenderer::save(flags);
446}
447
Romain Guy4aa90572010-09-26 18:40:37 -0700448void DisplayListRenderer::translate(float dx, float dy) {
Romain Guyb051e892010-09-28 19:09:36 -0700449 addOp(DisplayList::Translate);
Romain Guy4aa90572010-09-26 18:40:37 -0700450 addPoint(dx, dy);
451 OpenGLRenderer::translate(dx, dy);
452}
453
454void DisplayListRenderer::rotate(float degrees) {
Romain Guyb051e892010-09-28 19:09:36 -0700455 addOp(DisplayList::Rotate);
Romain Guy4aa90572010-09-26 18:40:37 -0700456 addFloat(degrees);
457 OpenGLRenderer::rotate(degrees);
458}
459
460void DisplayListRenderer::scale(float sx, float sy) {
Romain Guyb051e892010-09-28 19:09:36 -0700461 addOp(DisplayList::Scale);
Romain Guy4aa90572010-09-26 18:40:37 -0700462 addPoint(sx, sy);
463 OpenGLRenderer::scale(sx, sy);
464}
465
466void DisplayListRenderer::setMatrix(SkMatrix* matrix) {
Romain Guyb051e892010-09-28 19:09:36 -0700467 addOp(DisplayList::SetMatrix);
Romain Guy4aa90572010-09-26 18:40:37 -0700468 addMatrix(matrix);
469 OpenGLRenderer::setMatrix(matrix);
470}
471
472void DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
Romain Guyb051e892010-09-28 19:09:36 -0700473 addOp(DisplayList::ConcatMatrix);
Romain Guy4aa90572010-09-26 18:40:37 -0700474 addMatrix(matrix);
475 OpenGLRenderer::concatMatrix(matrix);
476}
477
478bool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
479 SkRegion::Op op) {
Romain Guyb051e892010-09-28 19:09:36 -0700480 addOp(DisplayList::ClipRect);
Romain Guy4aa90572010-09-26 18:40:37 -0700481 addBounds(left, top, right, bottom);
482 addInt(op);
483 return OpenGLRenderer::clipRect(left, top, right, bottom, op);
484}
485
Romain Guy0fe478e2010-11-08 12:08:41 -0800486void DisplayListRenderer::drawDisplayList(DisplayList* displayList) {
487 addOp(DisplayList::DrawDisplayList);
488 addDisplayList(displayList);
489}
490
Romain Guy6c319ca2011-01-11 14:29:25 -0800491void DisplayListRenderer::drawLayer(int texture, float left, float top, float right, float bottom,
492 float u, float v, SkPaint* paint) {
493 addOp(DisplayList::DrawLayer);
494 addInt(texture);
495 addBounds(left, top, right, bottom);
496 addFloat(u);
497 addFloat(v);
498 addPaint(paint);
499}
500
Romain Guy4aa90572010-09-26 18:40:37 -0700501void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
Chet Haase5c13d892010-10-08 08:37:55 -0700502 SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700503 addOp(DisplayList::DrawBitmap);
Romain Guy4aa90572010-09-26 18:40:37 -0700504 addBitmap(bitmap);
505 addPoint(left, top);
506 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700507}
508
Chet Haase5c13d892010-10-08 08:37:55 -0700509void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
510 SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700511 addOp(DisplayList::DrawBitmapMatrix);
Romain Guy4aa90572010-09-26 18:40:37 -0700512 addBitmap(bitmap);
513 addMatrix(matrix);
514 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700515}
516
517void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
518 float srcRight, float srcBottom, float dstLeft, float dstTop,
Chet Haase5c13d892010-10-08 08:37:55 -0700519 float dstRight, float dstBottom, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700520 addOp(DisplayList::DrawBitmapRect);
Romain Guy4aa90572010-09-26 18:40:37 -0700521 addBitmap(bitmap);
522 addBounds(srcLeft, srcTop, srcRight, srcBottom);
523 addBounds(dstLeft, dstTop, dstRight, dstBottom);
524 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700525}
526
527void DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
Romain Guy4bb94202010-10-12 15:59:26 -0700528 const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
Chet Haase5c13d892010-10-08 08:37:55 -0700529 float left, float top, float right, float bottom, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700530 addOp(DisplayList::DrawPatch);
Romain Guy4aa90572010-09-26 18:40:37 -0700531 addBitmap(bitmap);
532 addInts(xDivs, width);
533 addInts(yDivs, height);
Romain Guy4bb94202010-10-12 15:59:26 -0700534 addUInts(colors, numColors);
Romain Guy4aa90572010-09-26 18:40:37 -0700535 addBounds(left, top, right, bottom);
536 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700537}
538
539void DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
Romain Guyb051e892010-09-28 19:09:36 -0700540 addOp(DisplayList::DrawColor);
Romain Guy4aa90572010-09-26 18:40:37 -0700541 addInt(color);
542 addInt(mode);
Romain Guy4aa90572010-09-26 18:40:37 -0700543}
544
545void DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
Chet Haase5c13d892010-10-08 08:37:55 -0700546 SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700547 addOp(DisplayList::DrawRect);
Romain Guy4aa90572010-09-26 18:40:37 -0700548 addBounds(left, top, right, bottom);
549 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700550}
551
552void DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700553 addOp(DisplayList::DrawPath);
Romain Guy4aa90572010-09-26 18:40:37 -0700554 addPath(path);
555 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700556}
557
Chet Haase5c13d892010-10-08 08:37:55 -0700558void DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700559 addOp(DisplayList::DrawLines);
Romain Guy4aa90572010-09-26 18:40:37 -0700560 addFloats(points, count);
561 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700562}
563
564void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
565 float x, float y, SkPaint* paint) {
Romain Guyb051e892010-09-28 19:09:36 -0700566 addOp(DisplayList::DrawText);
Romain Guy4aa90572010-09-26 18:40:37 -0700567 addText(text, bytesCount);
568 addInt(count);
569 addPoint(x, y);
570 addPaint(paint);
Romain Guy4aa90572010-09-26 18:40:37 -0700571}
572
573void DisplayListRenderer::resetShader() {
Romain Guyb051e892010-09-28 19:09:36 -0700574 addOp(DisplayList::ResetShader);
Romain Guy4aa90572010-09-26 18:40:37 -0700575}
576
577void DisplayListRenderer::setupShader(SkiaShader* shader) {
Chet Haase5c13d892010-10-08 08:37:55 -0700578 addOp(DisplayList::SetupShader);
579 addShader(shader);
Romain Guy4aa90572010-09-26 18:40:37 -0700580}
581
582void DisplayListRenderer::resetColorFilter() {
Romain Guyb051e892010-09-28 19:09:36 -0700583 addOp(DisplayList::ResetColorFilter);
Romain Guy4aa90572010-09-26 18:40:37 -0700584}
585
586void DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
Chet Haasead93c2b2010-10-22 16:17:12 -0700587 addOp(DisplayList::SetupColorFilter);
588 addColorFilter(filter);
Romain Guy4aa90572010-09-26 18:40:37 -0700589}
590
591void DisplayListRenderer::resetShadow() {
Romain Guyb051e892010-09-28 19:09:36 -0700592 addOp(DisplayList::ResetShadow);
Romain Guy4aa90572010-09-26 18:40:37 -0700593}
594
595void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
Romain Guyb051e892010-09-28 19:09:36 -0700596 addOp(DisplayList::SetupShadow);
Romain Guy4aa90572010-09-26 18:40:37 -0700597 addFloat(radius);
598 addPoint(dx, dy);
599 addInt(color);
Romain Guy4aa90572010-09-26 18:40:37 -0700600}
601
Romain Guy4aa90572010-09-26 18:40:37 -0700602}; // namespace uirenderer
603}; // namespace android