3 * Copyright 2011 Google Inc.
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
8 #include "SkNWayCanvas.h"
10 static SkBitmap make_noconfig_bm(int width, int height) {
12 bm.setConfig(SkBitmap::kNo_Config, width, height);
16 SkNWayCanvas::SkNWayCanvas(int width, int height)
17 : INHERITED(make_noconfig_bm(width, height)) {}
19 SkNWayCanvas::~SkNWayCanvas() {
23 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
26 *fList.append() = canvas;
30 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
31 int index = fList.find(canvas);
34 fList.removeShuffle(index);
38 void SkNWayCanvas::removeAll() {
43 ///////////////////////////////////////////////////////////////////////////
44 // These are forwarded to the N canvases we're referencing
46 class SkNWayCanvas::Iter {
48 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
52 if (fIndex < fList.count()) {
53 fCanvas = fList[fIndex++];
58 SkCanvas* operator->() { return fCanvas; }
61 const SkTDArray<SkCanvas*>& fList;
66 int SkNWayCanvas::save(SaveFlags flags) {
71 return this->INHERITED::save(flags);
74 int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
78 iter->saveLayer(bounds, paint, flags);
80 return this->INHERITED::saveLayer(bounds, paint, flags);
83 void SkNWayCanvas::restore() {
88 this->INHERITED::restore();
91 bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
94 iter->translate(dx, dy);
96 return this->INHERITED::translate(dx, dy);
99 bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
101 while (iter.next()) {
104 return this->INHERITED::scale(sx, sy);
107 bool SkNWayCanvas::rotate(SkScalar degrees) {
109 while (iter.next()) {
110 iter->rotate(degrees);
112 return this->INHERITED::rotate(degrees);
115 bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
117 while (iter.next()) {
120 return this->INHERITED::skew(sx, sy);
123 bool SkNWayCanvas::concat(const SkMatrix& matrix) {
125 while (iter.next()) {
126 iter->concat(matrix);
128 return this->INHERITED::concat(matrix);
131 void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
133 while (iter.next()) {
134 iter->setMatrix(matrix);
136 this->INHERITED::setMatrix(matrix);
139 bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
141 while (iter.next()) {
142 iter->clipRect(rect, op, doAA);
144 return this->INHERITED::clipRect(rect, op, doAA);
147 bool SkNWayCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
149 while (iter.next()) {
150 iter->clipRRect(rrect, op, doAA);
152 return this->INHERITED::clipRRect(rrect, op, doAA);
155 bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
157 while (iter.next()) {
158 iter->clipPath(path, op, doAA);
160 return this->INHERITED::clipPath(path, op, doAA);
163 bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
165 while (iter.next()) {
166 iter->clipRegion(deviceRgn, op);
168 return this->INHERITED::clipRegion(deviceRgn, op);
171 void SkNWayCanvas::clear(SkColor color) {
173 while (iter.next()) {
178 void SkNWayCanvas::drawPaint(const SkPaint& paint) {
180 while (iter.next()) {
181 iter->drawPaint(paint);
185 void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
186 const SkPaint& paint) {
188 while (iter.next()) {
189 iter->drawPoints(mode, count, pts, paint);
193 void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
195 while (iter.next()) {
196 iter->drawRect(rect, paint);
200 void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
202 while (iter.next()) {
203 iter->drawOval(rect, paint);
207 void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
209 while (iter.next()) {
210 iter->drawRRect(rrect, paint);
214 void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
216 while (iter.next()) {
217 iter->drawPath(path, paint);
221 void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
222 const SkPaint* paint) {
224 while (iter.next()) {
225 iter->drawBitmap(bitmap, x, y, paint);
229 void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
230 const SkRect& dst, const SkPaint* paint,
231 DrawBitmapRectFlags flags) {
233 while (iter.next()) {
234 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
238 void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
239 const SkPaint* paint) {
241 while (iter.next()) {
242 iter->drawBitmapMatrix(bitmap, m, paint);
246 void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
247 const SkRect& dst, const SkPaint* paint) {
249 while (iter.next()) {
250 iter->drawBitmapNine(bitmap, center, dst, paint);
254 void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
255 const SkPaint* paint) {
257 while (iter.next()) {
258 iter->drawSprite(bitmap, x, y, paint);
262 void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
263 SkScalar y, const SkPaint& paint) {
265 while (iter.next()) {
266 iter->drawText(text, byteLength, x, y, paint);
270 void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
271 const SkPoint pos[], const SkPaint& paint) {
273 while (iter.next()) {
274 iter->drawPosText(text, byteLength, pos, paint);
278 void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
279 const SkScalar xpos[], SkScalar constY,
280 const SkPaint& paint) {
282 while (iter.next()) {
283 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
287 void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
288 const SkPath& path, const SkMatrix* matrix,
289 const SkPaint& paint) {
291 while (iter.next()) {
292 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
296 void SkNWayCanvas::drawPicture(SkPicture& picture) {
298 while (iter.next()) {
299 iter->drawPicture(picture);
303 void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
304 const SkPoint vertices[], const SkPoint texs[],
305 const SkColor colors[], SkXfermode* xmode,
306 const uint16_t indices[], int indexCount,
307 const SkPaint& paint) {
309 while (iter.next()) {
310 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
311 indices, indexCount, paint);
315 void SkNWayCanvas::drawData(const void* data, size_t length) {
317 while (iter.next()) {
318 iter->drawData(data, length);
322 SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
324 while (iter.next()) {
325 iter->setBounder(bounder);
327 return this->INHERITED::setBounder(bounder);
330 SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
332 while (iter.next()) {
333 iter->setDrawFilter(filter);
335 return this->INHERITED::setDrawFilter(filter);
338 void SkNWayCanvas::beginCommentGroup(const char* description) {
340 while (iter.next()) {
341 iter->beginCommentGroup(description);
345 void SkNWayCanvas::addComment(const char* kywd, const char* value) {
347 while (iter.next()) {
348 iter->addComment(kywd, value);
352 void SkNWayCanvas::endCommentGroup() {
354 while (iter.next()) {
355 iter->endCommentGroup();