Home | History | Annotate | Download | only in utils
      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