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