2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "include/utils/SkNWayCanvas.h"
10 #include "include/core/SkBlendMode.h"
11 #include "include/core/SkCanvas.h"
12 #include "include/core/SkClipOp.h"
13 #include "include/core/SkColor.h"
14 #include "include/core/SkM44.h"
15 #include "include/core/SkMatrix.h"
16 #include "include/core/SkPoint.h"
17 #include "include/core/SkRect.h"
18 #include "include/core/SkRefCnt.h"
19 #include "include/core/SkSamplingOptions.h"
20 #include "include/core/SkScalar.h"
21 #include "include/core/SkShader.h"
22 #include "include/core/SkTypes.h"
23 #include "include/private/SkTDArray.h"
24 #include "include/utils/SkNoDrawCanvas.h"
25 #include "src/core/SkCanvasPriv.h"
40 struct SkDrawShadowRec;
42 SkNWayCanvas::SkNWayCanvas(int width, int height) : INHERITED(width, height) {}
44 SkNWayCanvas::~SkNWayCanvas() {
48 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
49 if (!fList.isEmpty()) {
50 // We are using the nway canvas as a wrapper for the originally added canvas, and the device
51 // on the nway may contradict calls for the device on this canvas. So, to add a second
52 // canvas, the devices on the first canvas, and the nway base device must be different.
53 SkASSERT(fList[0]->baseDevice() != this->baseDevice());
56 *fList.append() = canvas;
60 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
61 int index = fList.find(canvas);
63 fList.removeShuffle(index);
67 void SkNWayCanvas::removeAll() {
71 ///////////////////////////////////////////////////////////////////////////
72 // These are forwarded to the N canvases we're referencing
74 class SkNWayCanvas::Iter {
76 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
80 if (fIndex < fList.count()) {
81 fCanvas = fList[fIndex++];
86 SkCanvas* operator->() { return fCanvas; }
87 SkCanvas* get() const { return fCanvas; }
90 const SkTDArray<SkCanvas*>& fList;
95 void SkNWayCanvas::willSave() {
101 this->INHERITED::willSave();
104 SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
106 while (iter.next()) {
107 iter->saveLayer(rec);
110 this->INHERITED::getSaveLayerStrategy(rec);
111 // No need for a layer.
112 return kNoLayer_SaveLayerStrategy;
115 bool SkNWayCanvas::onDoSaveBehind(const SkRect* bounds) {
117 while (iter.next()) {
118 SkCanvasPriv::SaveBehind(iter.get(), bounds);
120 this->INHERITED::onDoSaveBehind(bounds);
124 void SkNWayCanvas::willRestore() {
126 while (iter.next()) {
129 this->INHERITED::willRestore();
132 void SkNWayCanvas::didConcat44(const SkM44& m) {
134 while (iter.next()) {
139 void SkNWayCanvas::didSetM44(const SkM44& matrix) {
141 while (iter.next()) {
142 iter->setMatrix(matrix);
146 void SkNWayCanvas::didTranslate(SkScalar x, SkScalar y) {
148 while (iter.next()) {
149 iter->translate(x, y);
153 void SkNWayCanvas::didScale(SkScalar x, SkScalar y) {
155 while (iter.next()) {
160 void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) {
162 while (iter.next()) {
163 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
165 this->INHERITED::onClipRect(rect, op, edgeStyle);
168 void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) {
170 while (iter.next()) {
171 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
173 this->INHERITED::onClipRRect(rrect, op, edgeStyle);
176 void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) {
178 while (iter.next()) {
179 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
181 this->INHERITED::onClipPath(path, op, edgeStyle);
184 void SkNWayCanvas::onClipShader(sk_sp<SkShader> sh, SkClipOp op) {
186 while (iter.next()) {
187 iter->clipShader(sh, op);
189 this->INHERITED::onClipShader(std::move(sh), op);
192 void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {
194 while (iter.next()) {
195 iter->clipRegion(deviceRgn, op);
197 this->INHERITED::onClipRegion(deviceRgn, op);
200 void SkNWayCanvas::onResetClip() {
202 while (iter.next()) {
203 SkCanvasPriv::ResetClip(iter.get());
205 this->INHERITED::onResetClip();
208 void SkNWayCanvas::onDrawPaint(const SkPaint& paint) {
210 while (iter.next()) {
211 iter->drawPaint(paint);
215 void SkNWayCanvas::onDrawBehind(const SkPaint& paint) {
217 while (iter.next()) {
218 SkCanvasPriv::DrawBehind(iter.get(), paint);
222 void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[],
223 const SkPaint& paint) {
225 while (iter.next()) {
226 iter->drawPoints(mode, count, pts, paint);
230 void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
232 while (iter.next()) {
233 iter->drawRect(rect, paint);
237 void SkNWayCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint) {
239 while (iter.next()) {
240 iter->drawRegion(region, paint);
244 void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
246 while (iter.next()) {
247 iter->drawOval(rect, paint);
251 void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle,
252 bool useCenter, const SkPaint& paint) {
254 while (iter.next()) {
255 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint);
259 void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
261 while (iter.next()) {
262 iter->drawRRect(rrect, paint);
266 void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
268 while (iter.next()) {
269 iter->drawDRRect(outer, inner, paint);
273 void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
275 while (iter.next()) {
276 iter->drawPath(path, paint);
280 void SkNWayCanvas::onDrawImage2(const SkImage* image, SkScalar left, SkScalar top,
281 const SkSamplingOptions& sampling, const SkPaint* paint) {
283 while (iter.next()) {
284 iter->drawImage(image, left, top, sampling, paint);
288 void SkNWayCanvas::onDrawImageRect2(const SkImage* image, const SkRect& src, const SkRect& dst,
289 const SkSamplingOptions& sampling, const SkPaint* paint,
290 SrcRectConstraint constraint) {
292 while (iter.next()) {
293 iter->drawImageRect(image, src, dst, sampling, paint, constraint);
297 void SkNWayCanvas::onDrawImageLattice2(const SkImage* image, const Lattice& lattice,
298 const SkRect& dst, SkFilterMode filter,
299 const SkPaint* paint) {
301 while (iter.next()) {
302 iter->drawImageLattice(image, lattice, dst, filter, paint);
306 void SkNWayCanvas::onDrawAtlas2(const SkImage* image, const SkRSXform xform[], const SkRect tex[],
307 const SkColor colors[], int count, SkBlendMode bmode,
308 const SkSamplingOptions& sampling, const SkRect* cull,
309 const SkPaint* paint) {
311 while (iter.next()) {
312 iter->drawAtlas(image, xform, tex, colors, count, bmode, sampling, cull, paint);
316 void SkNWayCanvas::onDrawGlyphRunList(const SkGlyphRunList& list,
317 const SkPaint &paint) {
319 while (iter.next()) {
320 iter->onDrawGlyphRunList(list, paint);
324 void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
325 const SkPaint &paint) {
327 while (iter.next()) {
328 iter->drawTextBlob(blob, x, y, paint);
333 void SkNWayCanvas::onDrawSlug(const sktext::gpu::Slug* slug) {
335 while (iter.next()) {
336 iter->drawSlug(slug);
341 void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
342 const SkPaint* paint) {
344 while (iter.next()) {
345 iter->drawPicture(picture, matrix, paint);
349 void SkNWayCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) {
351 while (iter.next()) {
352 iter->drawDrawable(drawable, matrix);
356 void SkNWayCanvas::onDrawVerticesObject(const SkVertices* vertices,
357 SkBlendMode bmode, const SkPaint& paint) {
359 while (iter.next()) {
360 iter->drawVertices(vertices, bmode, paint);
364 void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
365 const SkPoint texCoords[4], SkBlendMode bmode,
366 const SkPaint& paint) {
368 while (iter.next()) {
369 iter->drawPatch(cubics, colors, texCoords, bmode, paint);
373 void SkNWayCanvas::onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec) {
375 while (iter.next()) {
376 iter->private_draw_shadow_rec(path, rec);
380 void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) {
382 while (iter.next()) {
383 iter->drawAnnotation(rect, key, data);
387 void SkNWayCanvas::onDrawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4],
388 QuadAAFlags aa, const SkColor4f& color, SkBlendMode mode) {
390 while (iter.next()) {
391 iter->experimental_DrawEdgeAAQuad(rect, clip, aa, color, mode);
395 void SkNWayCanvas::onDrawEdgeAAImageSet2(const ImageSetEntry set[], int count,
396 const SkPoint dstClips[], const SkMatrix preViewMatrices[],
397 const SkSamplingOptions& sampling, const SkPaint* paint,
398 SrcRectConstraint constraint) {
400 while (iter.next()) {
401 iter->experimental_DrawEdgeAAImageSet(
402 set, count, dstClips, preViewMatrices, sampling, paint, constraint);
406 void SkNWayCanvas::onFlush() {
408 while (iter.next()) {