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 10static SkBitmap make_noconfig_bm(int width, int height) { 11 SkBitmap bm; 12 bm.setConfig(SkBitmap::kNo_Config, width, height); 13 return bm; 14} 15 16SkNWayCanvas::SkNWayCanvas(int width, int height) 17 : INHERITED(make_noconfig_bm(width, height)) {} 18 19SkNWayCanvas::~SkNWayCanvas() { 20 this->removeAll(); 21} 22 23void SkNWayCanvas::addCanvas(SkCanvas* canvas) { 24 if (canvas) { 25 canvas->ref(); 26 *fList.append() = canvas; 27 } 28} 29 30void SkNWayCanvas::removeCanvas(SkCanvas* canvas) { 31 int index = fList.find(canvas); 32 if (index >= 0) { 33 canvas->unref(); 34 fList.removeShuffle(index); 35 } 36} 37 38void SkNWayCanvas::removeAll() { 39 fList.unrefAll(); 40 fList.reset(); 41} 42 43/////////////////////////////////////////////////////////////////////////// 44// These are forwarded to the N canvases we're referencing 45 46class SkNWayCanvas::Iter { 47public: 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 60private: 61 const SkTDArray<SkCanvas*>& fList; 62 int fIndex; 63 SkCanvas* fCanvas; 64}; 65 66int 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 74int 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 83void SkNWayCanvas::restore() { 84 Iter iter(fList); 85 while (iter.next()) { 86 iter->restore(); 87 } 88 this->INHERITED::restore(); 89} 90 91bool 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 99bool 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 107bool 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 115bool 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 123bool 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 131void 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 139bool 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 147bool 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 155bool 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 163bool 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 171void SkNWayCanvas::clear(SkColor color) { 172 Iter iter(fList); 173 while (iter.next()) { 174 iter->clear(color); 175 } 176} 177 178void SkNWayCanvas::drawPaint(const SkPaint& paint) { 179 Iter iter(fList); 180 while (iter.next()) { 181 iter->drawPaint(paint); 182 } 183} 184 185void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], 186 const SkPaint& paint) { 187 Iter iter(fList); 188 while (iter.next()) { 189 iter->drawPoints(mode, count, pts, paint); 190 } 191} 192 193void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 194 Iter iter(fList); 195 while (iter.next()) { 196 iter->drawRect(rect, paint); 197 } 198} 199 200void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 201 Iter iter(fList); 202 while (iter.next()) { 203 iter->drawOval(rect, paint); 204 } 205} 206 207void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 208 Iter iter(fList); 209 while (iter.next()) { 210 iter->drawRRect(rrect, paint); 211 } 212} 213 214void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 215 Iter iter(fList); 216 while (iter.next()) { 217 iter->drawPath(path, paint); 218 } 219} 220 221void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, 222 const SkPaint* paint) { 223 Iter iter(fList); 224 while (iter.next()) { 225 iter->drawBitmap(bitmap, x, y, paint); 226 } 227} 228 229void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, 230 const SkRect& dst, const SkPaint* paint, 231 DrawBitmapRectFlags flags) { 232 Iter iter(fList); 233 while (iter.next()) { 234 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags); 235 } 236} 237 238void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 239 const SkPaint* paint) { 240 Iter iter(fList); 241 while (iter.next()) { 242 iter->drawBitmapMatrix(bitmap, m, paint); 243 } 244} 245 246void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, 247 const SkRect& dst, const SkPaint* paint) { 248 Iter iter(fList); 249 while (iter.next()) { 250 iter->drawBitmapNine(bitmap, center, dst, paint); 251 } 252} 253 254void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, 255 const SkPaint* paint) { 256 Iter iter(fList); 257 while (iter.next()) { 258 iter->drawSprite(bitmap, x, y, paint); 259 } 260} 261 262void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 263 SkScalar y, const SkPaint& paint) { 264 Iter iter(fList); 265 while (iter.next()) { 266 iter->drawText(text, byteLength, x, y, paint); 267 } 268} 269 270void SkNWayCanvas::drawPosText(const void* text, size_t byteLength, 271 const SkPoint pos[], const SkPaint& paint) { 272 Iter iter(fList); 273 while (iter.next()) { 274 iter->drawPosText(text, byteLength, pos, paint); 275 } 276} 277 278void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength, 279 const SkScalar xpos[], SkScalar constY, 280 const SkPaint& paint) { 281 Iter iter(fList); 282 while (iter.next()) { 283 iter->drawPosTextH(text, byteLength, xpos, constY, paint); 284 } 285} 286 287void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength, 288 const SkPath& path, const SkMatrix* matrix, 289 const SkPaint& paint) { 290 Iter iter(fList); 291 while (iter.next()) { 292 iter->drawTextOnPath(text, byteLength, path, matrix, paint); 293 } 294} 295 296void SkNWayCanvas::drawPicture(SkPicture& picture) { 297 Iter iter(fList); 298 while (iter.next()) { 299 iter->drawPicture(picture); 300 } 301} 302 303void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount, 304 const SkPoint vertices[], const SkPoint texs[], 305 const SkColor colors[], SkXfermode* xmode, 306 const uint16_t indices[], int indexCount, 307 const SkPaint& paint) { 308 Iter iter(fList); 309 while (iter.next()) { 310 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, 311 indices, indexCount, paint); 312 } 313} 314 315void SkNWayCanvas::drawData(const void* data, size_t length) { 316 Iter iter(fList); 317 while (iter.next()) { 318 iter->drawData(data, length); 319 } 320} 321 322SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) { 323 Iter iter(fList); 324 while (iter.next()) { 325 iter->setBounder(bounder); 326 } 327 return this->INHERITED::setBounder(bounder); 328} 329 330SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) { 331 Iter iter(fList); 332 while (iter.next()) { 333 iter->setDrawFilter(filter); 334 } 335 return this->INHERITED::setDrawFilter(filter); 336} 337 338void SkNWayCanvas::beginCommentGroup(const char* description) { 339 Iter iter(fList); 340 while (iter.next()) { 341 iter->beginCommentGroup(description); 342 } 343} 344 345void SkNWayCanvas::addComment(const char* kywd, const char* value) { 346 Iter iter(fList); 347 while (iter.next()) { 348 iter->addComment(kywd, value); 349 } 350} 351 352void SkNWayCanvas::endCommentGroup() { 353 Iter iter(fList); 354 while (iter.next()) { 355 iter->endCommentGroup(); 356 } 357} 358