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