1 #include "SkNWayCanvas.h" 2 3 SkNWayCanvas::SkNWayCanvas() {} 4 5 SkNWayCanvas::~SkNWayCanvas() { 6 this->removeAll(); 7 } 8 9 void SkNWayCanvas::addCanvas(SkCanvas* canvas) { 10 if (canvas) { 11 canvas->ref(); 12 *fList.append() = canvas; 13 } 14 } 15 16 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) { 17 int index = fList.find(canvas); 18 if (index >= 0) { 19 canvas->unref(); 20 fList.removeShuffle(index); 21 } 22 } 23 24 void SkNWayCanvas::removeAll() { 25 fList.unrefAll(); 26 fList.reset(); 27 } 28 29 /////////////////////////////////////////////////////////////////////////// 30 // These are forwarded to the N canvases we're referencing 31 32 class SkNWayCanvas::Iter { 33 public: 34 Iter(const SkTDArray<SkCanvas*>& list) : fList(list) { 35 fIndex = 0; 36 } 37 bool next() { 38 if (fIndex < fList.count()) { 39 fCanvas = fList[fIndex++]; 40 return true; 41 } 42 return false; 43 } 44 SkCanvas* operator->() { return fCanvas; } 45 46 private: 47 const SkTDArray<SkCanvas*>& fList; 48 int fIndex; 49 SkCanvas* fCanvas; 50 }; 51 52 int SkNWayCanvas::save(SaveFlags flags) { 53 Iter iter(fList); 54 while (iter.next()) { 55 iter->save(flags); 56 } 57 return this->INHERITED::save(flags); 58 } 59 60 int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 61 SaveFlags flags) { 62 Iter iter(fList); 63 while (iter.next()) { 64 iter->saveLayer(bounds, paint, flags); 65 } 66 return this->INHERITED::saveLayer(bounds, paint, flags); 67 } 68 69 void SkNWayCanvas::restore() { 70 Iter iter(fList); 71 while (iter.next()) { 72 iter->restore(); 73 } 74 this->INHERITED::restore(); 75 } 76 77 bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) { 78 Iter iter(fList); 79 while (iter.next()) { 80 iter->translate(dx, dy); 81 } 82 return this->INHERITED::translate(dx, dy); 83 } 84 85 bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) { 86 Iter iter(fList); 87 while (iter.next()) { 88 iter->scale(sx, sy); 89 } 90 return this->INHERITED::scale(sx, sy); 91 } 92 93 bool SkNWayCanvas::rotate(SkScalar degrees) { 94 Iter iter(fList); 95 while (iter.next()) { 96 iter->rotate(degrees); 97 } 98 return this->INHERITED::rotate(degrees); 99 } 100 101 bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) { 102 Iter iter(fList); 103 while (iter.next()) { 104 iter->skew(sx, sy); 105 } 106 return this->INHERITED::skew(sx, sy); 107 } 108 109 bool SkNWayCanvas::concat(const SkMatrix& matrix) { 110 Iter iter(fList); 111 while (iter.next()) { 112 iter->concat(matrix); 113 } 114 return this->INHERITED::concat(matrix); 115 } 116 117 void SkNWayCanvas::setMatrix(const SkMatrix& matrix) { 118 Iter iter(fList); 119 while (iter.next()) { 120 iter->setMatrix(matrix); 121 } 122 this->INHERITED::setMatrix(matrix); 123 } 124 125 bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op) { 126 Iter iter(fList); 127 while (iter.next()) { 128 iter->clipRect(rect, op); 129 } 130 return this->INHERITED::clipRect(rect, op); 131 } 132 133 bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op) { 134 Iter iter(fList); 135 while (iter.next()) { 136 iter->clipPath(path, op); 137 } 138 return this->INHERITED::clipPath(path, op); 139 } 140 141 bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { 142 Iter iter(fList); 143 while (iter.next()) { 144 iter->clipRegion(deviceRgn, op); 145 } 146 return this->INHERITED::clipRegion(deviceRgn, op); 147 } 148 149 void SkNWayCanvas::drawPaint(const SkPaint& paint) { 150 Iter iter(fList); 151 while (iter.next()) { 152 iter->drawPaint(paint); 153 } 154 } 155 156 void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], 157 const SkPaint& paint) { 158 Iter iter(fList); 159 while (iter.next()) { 160 iter->drawPoints(mode, count, pts, paint); 161 } 162 } 163 164 void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 165 Iter iter(fList); 166 while (iter.next()) { 167 iter->drawRect(rect, paint); 168 } 169 } 170 171 void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 172 Iter iter(fList); 173 while (iter.next()) { 174 iter->drawPath(path, paint); 175 } 176 } 177 178 void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, 179 const SkPaint* paint) { 180 Iter iter(fList); 181 while (iter.next()) { 182 iter->drawBitmap(bitmap, x, y, paint); 183 } 184 } 185 186 void SkNWayCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 187 const SkRect& dst, const SkPaint* paint) { 188 Iter iter(fList); 189 while (iter.next()) { 190 iter->drawBitmapRect(bitmap, src, dst, paint); 191 } 192 } 193 194 void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 195 const SkPaint* paint) { 196 Iter iter(fList); 197 while (iter.next()) { 198 iter->drawBitmapMatrix(bitmap, m, paint); 199 } 200 } 201 202 void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, 203 const SkPaint* paint) { 204 Iter iter(fList); 205 while (iter.next()) { 206 iter->drawSprite(bitmap, x, y, paint); 207 } 208 } 209 210 void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 211 SkScalar y, const SkPaint& paint) { 212 Iter iter(fList); 213 while (iter.next()) { 214 iter->drawText(text, byteLength, x, y, paint); 215 } 216 } 217 218 void SkNWayCanvas::drawPosText(const void* text, size_t byteLength, 219 const SkPoint pos[], const SkPaint& paint) { 220 Iter iter(fList); 221 while (iter.next()) { 222 iter->drawPosText(text, byteLength, pos, paint); 223 } 224 } 225 226 void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength, 227 const SkScalar xpos[], SkScalar constY, 228 const SkPaint& paint) { 229 Iter iter(fList); 230 while (iter.next()) { 231 iter->drawPosTextH(text, byteLength, xpos, constY, paint); 232 } 233 } 234 235 void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength, 236 const SkPath& path, const SkMatrix* matrix, 237 const SkPaint& paint) { 238 Iter iter(fList); 239 while (iter.next()) { 240 iter->drawTextOnPath(text, byteLength, path, matrix, paint); 241 } 242 } 243 244 void SkNWayCanvas::drawPicture(SkPicture& picture) { 245 Iter iter(fList); 246 while (iter.next()) { 247 iter->drawPicture(picture); 248 } 249 } 250 251 void SkNWayCanvas::drawShape(SkShape* shape) { 252 Iter iter(fList); 253 while (iter.next()) { 254 iter->drawShape(shape); 255 } 256 } 257 258 void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount, 259 const SkPoint vertices[], const SkPoint texs[], 260 const SkColor colors[], SkXfermode* xmode, 261 const uint16_t indices[], int indexCount, 262 const SkPaint& paint) { 263 Iter iter(fList); 264 while (iter.next()) { 265 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, 266 indices, indexCount, paint); 267 } 268 } 269 270 SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) { 271 Iter iter(fList); 272 while (iter.next()) { 273 iter->setBounder(bounder); 274 } 275 return this->INHERITED::setBounder(bounder); 276 } 277 278 SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) { 279 Iter iter(fList); 280 while (iter.next()) { 281 iter->setDrawFilter(filter); 282 } 283 return this->INHERITED::setDrawFilter(filter); 284 } 285 286 287