SkNWayCanvas.cpp revision 8e7432b7f98dd592e529a0c8bb038d73ebfb0478
1/* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7#include "SkNWayCanvas.h" 8 9SkNWayCanvas::SkNWayCanvas(int width, int height) : INHERITED(width, height) {} 10 11SkNWayCanvas::~SkNWayCanvas() { 12 this->removeAll(); 13} 14 15void SkNWayCanvas::addCanvas(SkCanvas* canvas) { 16 if (canvas) { 17 *fList.append() = canvas; 18 } 19} 20 21void SkNWayCanvas::removeCanvas(SkCanvas* canvas) { 22 int index = fList.find(canvas); 23 if (index >= 0) { 24 fList.removeShuffle(index); 25 } 26} 27 28void SkNWayCanvas::removeAll() { 29 fList.reset(); 30} 31 32/////////////////////////////////////////////////////////////////////////// 33// These are forwarded to the N canvases we're referencing 34 35class SkNWayCanvas::Iter { 36public: 37 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) { 38 fIndex = 0; 39 } 40 bool next() { 41 if (fIndex < fList.count()) { 42 fCanvas = fList[fIndex++]; 43 return true; 44 } 45 return false; 46 } 47 SkCanvas* operator->() { return fCanvas; } 48 49private: 50 const SkTDArray<SkCanvas*>& fList; 51 int fIndex; 52 SkCanvas* fCanvas; 53}; 54 55void SkNWayCanvas::willSave() { 56 Iter iter(fList); 57 while (iter.next()) { 58 iter->save(); 59 } 60 61 this->INHERITED::willSave(); 62} 63 64SkCanvas::SaveLayerStrategy SkNWayCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) { 65 Iter iter(fList); 66 while (iter.next()) { 67 iter->saveLayer(rec); 68 } 69 70 this->INHERITED::getSaveLayerStrategy(rec); 71 // No need for a layer. 72 return kNoLayer_SaveLayerStrategy; 73} 74 75void SkNWayCanvas::willRestore() { 76 Iter iter(fList); 77 while (iter.next()) { 78 iter->restore(); 79 } 80 this->INHERITED::willRestore(); 81} 82 83void SkNWayCanvas::didConcat(const SkMatrix& matrix) { 84 Iter iter(fList); 85 while (iter.next()) { 86 iter->concat(matrix); 87 } 88 this->INHERITED::didConcat(matrix); 89} 90 91void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) { 92 Iter iter(fList); 93 while (iter.next()) { 94 iter->setMatrix(matrix); 95 } 96 this->INHERITED::didSetMatrix(matrix); 97} 98 99void SkNWayCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle edgeStyle) { 100 Iter iter(fList); 101 while (iter.next()) { 102 iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle); 103 } 104 this->INHERITED::onClipRect(rect, op, edgeStyle); 105} 106 107void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle edgeStyle) { 108 Iter iter(fList); 109 while (iter.next()) { 110 iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); 111 } 112 this->INHERITED::onClipRRect(rrect, op, edgeStyle); 113} 114 115void SkNWayCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle edgeStyle) { 116 Iter iter(fList); 117 while (iter.next()) { 118 iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle); 119 } 120 this->INHERITED::onClipPath(path, op, edgeStyle); 121} 122 123void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) { 124 Iter iter(fList); 125 while (iter.next()) { 126 iter->clipRegion(deviceRgn, op); 127 } 128 this->INHERITED::onClipRegion(deviceRgn, op); 129} 130 131void SkNWayCanvas::onDrawPaint(const SkPaint& paint) { 132 Iter iter(fList); 133 while (iter.next()) { 134 iter->drawPaint(paint); 135 } 136} 137 138void SkNWayCanvas::onDrawPoints(PointMode mode, size_t count, const SkPoint pts[], 139 const SkPaint& paint) { 140 Iter iter(fList); 141 while (iter.next()) { 142 iter->drawPoints(mode, count, pts, paint); 143 } 144} 145 146void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { 147 Iter iter(fList); 148 while (iter.next()) { 149 iter->drawRect(rect, paint); 150 } 151} 152 153void SkNWayCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) { 154 Iter iter(fList); 155 while (iter.next()) { 156 iter->drawOval(rect, paint); 157 } 158} 159 160void SkNWayCanvas::onDrawArc(const SkRect& rect, SkScalar startAngle, SkScalar sweepAngle, 161 bool useCenter, const SkPaint& paint) { 162 Iter iter(fList); 163 while (iter.next()) { 164 iter->drawArc(rect, startAngle, sweepAngle, useCenter, paint); 165 } 166} 167 168void SkNWayCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { 169 Iter iter(fList); 170 while (iter.next()) { 171 iter->drawRRect(rrect, paint); 172 } 173} 174 175void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) { 176 Iter iter(fList); 177 while (iter.next()) { 178 iter->drawDRRect(outer, inner, paint); 179 } 180} 181 182void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { 183 Iter iter(fList); 184 while (iter.next()) { 185 iter->drawPath(path, paint); 186 } 187} 188 189void SkNWayCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, 190 const SkPaint* paint) { 191 Iter iter(fList); 192 while (iter.next()) { 193 iter->drawBitmap(bitmap, x, y, paint); 194 } 195} 196 197void SkNWayCanvas::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst, 198 const SkPaint* paint, SrcRectConstraint constraint) { 199 Iter iter(fList); 200 while (iter.next()) { 201 iter->legacy_drawBitmapRect(bitmap, src, dst, paint, (SrcRectConstraint)constraint); 202 } 203} 204 205void SkNWayCanvas::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 206 const SkRect& dst, const SkPaint* paint) { 207 Iter iter(fList); 208 while (iter.next()) { 209 iter->drawBitmapNine(bitmap, center, dst, paint); 210 } 211} 212 213void SkNWayCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar top, 214 const SkPaint* paint) { 215 Iter iter(fList); 216 while (iter.next()) { 217 iter->drawImage(image, left, top, paint); 218 } 219} 220 221void SkNWayCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, 222 const SkPaint* paint, SrcRectConstraint constraint) { 223 Iter iter(fList); 224 while (iter.next()) { 225 iter->legacy_drawImageRect(image, src, dst, paint, constraint); 226 } 227} 228 229void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 230 const SkPaint& paint) { 231 Iter iter(fList); 232 while (iter.next()) { 233 iter->drawText(text, byteLength, x, y, paint); 234 } 235} 236 237void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 238 const SkPaint& paint) { 239 Iter iter(fList); 240 while (iter.next()) { 241 iter->drawPosText(text, byteLength, pos, paint); 242 } 243} 244 245void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 246 SkScalar constY, const SkPaint& paint) { 247 Iter iter(fList); 248 while (iter.next()) { 249 iter->drawPosTextH(text, byteLength, xpos, constY, paint); 250 } 251} 252 253void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 254 const SkMatrix* matrix, const SkPaint& paint) { 255 Iter iter(fList); 256 while (iter.next()) { 257 iter->drawTextOnPath(text, byteLength, path, matrix, paint); 258 } 259} 260 261void SkNWayCanvas::onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[], 262 const SkRect* cull, const SkPaint& paint) { 263 Iter iter(fList); 264 while (iter.next()) { 265 iter->drawTextRSXform(text, byteLength, xform, cull, paint); 266 } 267} 268 269void SkNWayCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 270 const SkPaint &paint) { 271 Iter iter(fList); 272 while (iter.next()) { 273 iter->drawTextBlob(blob, x, y, paint); 274 } 275} 276 277void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, 278 const SkPaint* paint) { 279 Iter iter(fList); 280 while (iter.next()) { 281 iter->drawPicture(picture, matrix, paint); 282 } 283} 284 285void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount, 286 const SkPoint vertices[], const SkPoint texs[], 287 const SkColor colors[], SkBlendMode bmode, 288 const uint16_t indices[], int indexCount, 289 const SkPaint& paint) { 290 Iter iter(fList); 291 while (iter.next()) { 292 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, bmode, 293 indices, indexCount, paint); 294 } 295} 296 297void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 298 const SkPoint texCoords[4], SkBlendMode bmode, 299 const SkPaint& paint) { 300 Iter iter(fList); 301 while (iter.next()) { 302 iter->drawPatch(cubics, colors, texCoords, bmode, paint); 303 } 304} 305 306void SkNWayCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* data) { 307 Iter iter(fList); 308 while (iter.next()) { 309 iter->drawAnnotation(rect, key, data); 310 } 311} 312 313#ifdef SK_SUPPORT_LEGACY_DRAWFILTER 314SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) { 315 Iter iter(fList); 316 while (iter.next()) { 317 iter->setDrawFilter(filter); 318 } 319 return this->INHERITED::setDrawFilter(filter); 320} 321#endif 322