SkNWayCanvas.cpp revision ad254fee73ad70a45acba69dccb9b65f88c3a92a
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::drawPaint(const SkPaint& paint) { 172 Iter iter(fList); 173 while (iter.next()) { 174 iter->drawPaint(paint); 175 } 176} 177 178void 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 186void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 187 Iter iter(fList); 188 while (iter.next()) { 189 iter->drawOval(rect, paint); 190 } 191} 192 193void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { 194 Iter iter(fList); 195 while (iter.next()) { 196 iter->drawRect(rect, paint); 197 } 198} 199 200void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 201 Iter iter(fList); 202 while (iter.next()) { 203 iter->drawRRect(rrect, paint); 204 } 205} 206 207void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { 208 Iter iter(fList); 209 while (iter.next()) { 210 iter->drawPath(path, paint); 211 } 212} 213 214void 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 222void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, 223 const SkRect& dst, const SkPaint* paint, 224 DrawBitmapRectFlags flags) { 225 Iter iter(fList); 226 while (iter.next()) { 227 iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags); 228 } 229} 230 231void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 232 const SkPaint* paint) { 233 Iter iter(fList); 234 while (iter.next()) { 235 iter->drawBitmapMatrix(bitmap, m, paint); 236 } 237} 238 239void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, 240 const SkPaint* paint) { 241 Iter iter(fList); 242 while (iter.next()) { 243 iter->drawSprite(bitmap, x, y, paint); 244 } 245} 246 247void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x, 248 SkScalar y, const SkPaint& paint) { 249 Iter iter(fList); 250 while (iter.next()) { 251 iter->drawText(text, byteLength, x, y, paint); 252 } 253} 254 255void SkNWayCanvas::drawPosText(const void* text, size_t byteLength, 256 const SkPoint pos[], const SkPaint& paint) { 257 Iter iter(fList); 258 while (iter.next()) { 259 iter->drawPosText(text, byteLength, pos, paint); 260 } 261} 262 263void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength, 264 const SkScalar xpos[], SkScalar constY, 265 const SkPaint& paint) { 266 Iter iter(fList); 267 while (iter.next()) { 268 iter->drawPosTextH(text, byteLength, xpos, constY, paint); 269 } 270} 271 272void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength, 273 const SkPath& path, const SkMatrix* matrix, 274 const SkPaint& paint) { 275 Iter iter(fList); 276 while (iter.next()) { 277 iter->drawTextOnPath(text, byteLength, path, matrix, paint); 278 } 279} 280 281void SkNWayCanvas::drawPicture(SkPicture& picture) { 282 Iter iter(fList); 283 while (iter.next()) { 284 iter->drawPicture(picture); 285 } 286} 287 288void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount, 289 const SkPoint vertices[], const SkPoint texs[], 290 const SkColor colors[], SkXfermode* xmode, 291 const uint16_t indices[], int indexCount, 292 const SkPaint& paint) { 293 Iter iter(fList); 294 while (iter.next()) { 295 iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, 296 indices, indexCount, paint); 297 } 298} 299 300SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) { 301 Iter iter(fList); 302 while (iter.next()) { 303 iter->setBounder(bounder); 304 } 305 return this->INHERITED::setBounder(bounder); 306} 307 308SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) { 309 Iter iter(fList); 310 while (iter.next()) { 311 iter->setDrawFilter(filter); 312 } 313 return this->INHERITED::setDrawFilter(filter); 314} 315 316void SkNWayCanvas::beginCommentGroup(const char* description) { 317 Iter iter(fList); 318 while (iter.next()) { 319 iter->beginCommentGroup(description); 320 } 321} 322 323void SkNWayCanvas::addComment(const char* kywd, const char* value) { 324 Iter iter(fList); 325 while (iter.next()) { 326 iter->addComment(kywd, value); 327 } 328} 329 330void SkNWayCanvas::endCommentGroup() { 331 Iter iter(fList); 332 while (iter.next()) { 333 iter->endCommentGroup(); 334 } 335} 336