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