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