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 SkNWayCanvas::SkNWayCanvas(int width, int height)
11 : INHERITED(width, height) {}
13 SkNWayCanvas::~SkNWayCanvas() {
17 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
20 *fList.append() = canvas;
24 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
25 int index = fList.find(canvas);
28 fList.removeShuffle(index);
32 void SkNWayCanvas::removeAll() {
37 ///////////////////////////////////////////////////////////////////////////
38 // These are forwarded to the N canvases we're referencing
40 class SkNWayCanvas::Iter {
42 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
46 if (fIndex < fList.count()) {
47 fCanvas = fList[fIndex++];
52 SkCanvas* operator->() { return fCanvas; }
55 const SkTDArray<SkCanvas*>& fList;
60 void SkNWayCanvas::willSave() {
66 this->INHERITED::willSave();
69 SkCanvas::SaveLayerStrategy SkNWayCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
73 iter->saveLayer(bounds, paint, flags);
76 this->INHERITED::willSaveLayer(bounds, paint, flags);
77 // No need for a layer.
78 return kNoLayer_SaveLayerStrategy;
81 void SkNWayCanvas::willRestore() {
86 this->INHERITED::willRestore();
89 void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
94 this->INHERITED::didConcat(matrix);
97 void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
100 iter->setMatrix(matrix);
102 this->INHERITED::didSetMatrix(matrix);
105 void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
107 while (iter.next()) {
108 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
110 this->INHERITED::onClipRect(rect, op, edgeStyle);
113 void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
115 while (iter.next()) {
116 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
118 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
121 void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
123 while (iter.next()) {
124 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
126 this->INHERITED::onClipPath(path, op, edgeStyle);
129 void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
131 while (iter.next()) {
132 iter->clipRegion(deviceRgn, op);
134 this->INHERITED::onClipRegion(deviceRgn, op);
137 void SkNWayCanvas::clear(SkColor color) {
139 while (iter.next()) {
144 void SkNWayCanvas::drawPaint(const SkPaint& paint) {
146 while (iter.next()) {
147 iter->drawPaint(paint);
151 void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
152 const SkPaint& paint) {
154 while (iter.next()) {
155 iter->drawPoints(mode, count, pts, paint);
159 void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
161 while (iter.next()) {
162 iter->drawRect(rect, paint);
166 void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
168 while (iter.next()) {
169 iter->drawOval(rect, paint);
173 void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
175 while (iter.next()) {
176 iter->drawRRect(rrect, paint);
180 void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
181 const SkPaint& paint) {
183 while (iter.next()) {
184 iter->drawDRRect(outer, inner, paint);
188 void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
190 while (iter.next()) {
191 iter->drawPath(path, paint);
195 void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
196 const SkPaint* paint) {
198 while (iter.next()) {
199 iter->drawBitmap(bitmap, x, y, paint);
203 void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
204 const SkRect& dst, const SkPaint* paint,
205 DrawBitmapRectFlags flags) {
207 while (iter.next()) {
208 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
212 void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
213 const SkPaint* paint) {
215 while (iter.next()) {
216 iter->drawBitmapMatrix(bitmap, m, paint);
220 void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
221 const SkRect& dst, const SkPaint* paint) {
223 while (iter.next()) {
224 iter->drawBitmapNine(bitmap, center, dst, paint);
228 void SkNWayCanvas::drawImage(const SkImage* image, SkScalar left, SkScalar top,
229 const SkPaint* paint) {
231 while (iter.next()) {
232 iter->drawImage(image, left, top, paint);
236 void SkNWayCanvas::drawImageRect(const SkImage* image, const SkRect* src,
238 const SkPaint* paint) {
240 while (iter.next()) {
241 iter->drawImageRect(image, src, dst, paint);
245 void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
246 const SkPaint* paint) {
248 while (iter.next()) {
249 iter->drawSprite(bitmap, x, y, paint);
253 void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
254 const SkPaint& paint) {
256 while (iter.next()) {
257 iter->drawText(text, byteLength, x, y, paint);
261 void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
262 const SkPaint& paint) {
264 while (iter.next()) {
265 iter->drawPosText(text, byteLength, pos, paint);
269 void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
270 SkScalar constY, const SkPaint& paint) {
272 while (iter.next()) {
273 iter->drawPosTextH(text, byteLength, xpos, constY, paint);
277 void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
278 const SkMatrix* matrix, const SkPaint& paint) {
280 while (iter.next()) {
281 iter->drawTextOnPath(text, byteLength, path, matrix, paint);
285 void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
286 const SkPaint &paint) {
288 while (iter.next()) {
289 iter->drawTextBlob(blob, x, y, paint);
293 void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
294 const SkPaint* paint) {
296 while (iter.next()) {
297 iter->drawPicture(picture, matrix, paint);
301 void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
302 const SkPoint vertices[], const SkPoint texs[],
303 const SkColor colors[], SkXfermode* xmode,
304 const uint16_t indices[], int indexCount,
305 const SkPaint& paint) {
307 while (iter.next()) {
308 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
309 indices, indexCount, paint);
313 void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
314 const SkPoint texCoords[4], SkXfermode* xmode,
315 const SkPaint& paint) {
317 while (iter.next()) {
318 iter->drawPatch(cubics, colors, texCoords, xmode, paint);
322 void SkNWayCanvas::drawData(const void* data, size_t length) {
324 while (iter.next()) {
325 iter->drawData(data, length);
329 SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
331 while (iter.next()) {
332 iter->setDrawFilter(filter);
334 return this->INHERITED::setDrawFilter(filter);
337 void SkNWayCanvas::beginCommentGroup(const char* description) {
339 while (iter.next()) {
340 iter->beginCommentGroup(description);
344 void SkNWayCanvas::addComment(const char* kywd, const char* value) {
346 while (iter.next()) {
347 iter->addComment(kywd, value);
351 void SkNWayCanvas::endCommentGroup() {
353 while (iter.next()) {
354 iter->endCommentGroup();