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 SkNWayCanvas::SkNWayCanvas(int width, int height) {
     11     SkBitmap bm;
     12     bm.setConfig(SkBitmap::kNo_Config, width, height);
     13     this->setBitmapDevice(bm);
     14 }
     15 
     16 SkNWayCanvas::~SkNWayCanvas() {
     17     this->removeAll();
     18 }
     19 
     20 void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
     21     if (canvas) {
     22         canvas->ref();
     23         *fList.append() = canvas;
     24     }
     25 }
     26 
     27 void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
     28     int index = fList.find(canvas);
     29     if (index >= 0) {
     30         canvas->unref();
     31         fList.removeShuffle(index);
     32     }
     33 }
     34 
     35 void SkNWayCanvas::removeAll() {
     36     fList.unrefAll();
     37     fList.reset();
     38 }
     39 
     40 ///////////////////////////////////////////////////////////////////////////
     41 // These are forwarded to the N canvases we're referencing
     42 
     43 class SkNWayCanvas::Iter {
     44 public:
     45     Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
     46         fIndex = 0;
     47     }
     48     bool next() {
     49         if (fIndex < fList.count()) {
     50             fCanvas = fList[fIndex++];
     51             return true;
     52         }
     53         return false;
     54     }
     55     SkCanvas* operator->() { return fCanvas; }
     56 
     57 private:
     58     const SkTDArray<SkCanvas*>& fList;
     59     int fIndex;
     60     SkCanvas* fCanvas;
     61 };
     62 
     63 int SkNWayCanvas::save(SaveFlags flags) {
     64     Iter iter(fList);
     65     while (iter.next()) {
     66         iter->save(flags);
     67     }
     68     return this->INHERITED::save(flags);
     69 }
     70 
     71 int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
     72                                     SaveFlags flags) {
     73     Iter iter(fList);
     74     while (iter.next()) {
     75         iter->saveLayer(bounds, paint, flags);
     76     }
     77     return this->INHERITED::saveLayer(bounds, paint, flags);
     78 }
     79 
     80 void SkNWayCanvas::restore() {
     81     Iter iter(fList);
     82     while (iter.next()) {
     83         iter->restore();
     84     }
     85     this->INHERITED::restore();
     86 }
     87 
     88 bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
     89     Iter iter(fList);
     90     while (iter.next()) {
     91         iter->translate(dx, dy);
     92     }
     93     return this->INHERITED::translate(dx, dy);
     94 }
     95 
     96 bool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
     97     Iter iter(fList);
     98     while (iter.next()) {
     99         iter->scale(sx, sy);
    100     }
    101     return this->INHERITED::scale(sx, sy);
    102 }
    103 
    104 bool SkNWayCanvas::rotate(SkScalar degrees) {
    105     Iter iter(fList);
    106     while (iter.next()) {
    107         iter->rotate(degrees);
    108     }
    109     return this->INHERITED::rotate(degrees);
    110 }
    111 
    112 bool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
    113     Iter iter(fList);
    114     while (iter.next()) {
    115         iter->skew(sx, sy);
    116     }
    117     return this->INHERITED::skew(sx, sy);
    118 }
    119 
    120 bool SkNWayCanvas::concat(const SkMatrix& matrix) {
    121     Iter iter(fList);
    122     while (iter.next()) {
    123         iter->concat(matrix);
    124     }
    125     return this->INHERITED::concat(matrix);
    126 }
    127 
    128 void SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
    129     Iter iter(fList);
    130     while (iter.next()) {
    131         iter->setMatrix(matrix);
    132     }
    133     this->INHERITED::setMatrix(matrix);
    134 }
    135 
    136 bool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
    137     Iter iter(fList);
    138     while (iter.next()) {
    139         iter->clipRect(rect, op, doAA);
    140     }
    141     return this->INHERITED::clipRect(rect, op, doAA);
    142 }
    143 
    144 bool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
    145     Iter iter(fList);
    146     while (iter.next()) {
    147         iter->clipPath(path, op, doAA);
    148     }
    149     return this->INHERITED::clipPath(path, op, doAA);
    150 }
    151 
    152 bool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
    153     Iter iter(fList);
    154     while (iter.next()) {
    155         iter->clipRegion(deviceRgn, op);
    156     }
    157     return this->INHERITED::clipRegion(deviceRgn, op);
    158 }
    159 
    160 void SkNWayCanvas::drawPaint(const SkPaint& paint) {
    161     Iter iter(fList);
    162     while (iter.next()) {
    163         iter->drawPaint(paint);
    164     }
    165 }
    166 
    167 void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
    168                         const SkPaint& paint) {
    169     Iter iter(fList);
    170     while (iter.next()) {
    171         iter->drawPoints(mode, count, pts, paint);
    172     }
    173 }
    174 
    175 void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
    176     Iter iter(fList);
    177     while (iter.next()) {
    178         iter->drawRect(rect, paint);
    179     }
    180 }
    181 
    182 void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
    183     Iter iter(fList);
    184     while (iter.next()) {
    185         iter->drawPath(path, paint);
    186     }
    187 }
    188 
    189 void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
    190                               const SkPaint* paint) {
    191     Iter iter(fList);
    192     while (iter.next()) {
    193         iter->drawBitmap(bitmap, x, y, paint);
    194     }
    195 }
    196 
    197 void SkNWayCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
    198                                   const SkRect& dst, const SkPaint* paint) {
    199     Iter iter(fList);
    200     while (iter.next()) {
    201         iter->drawBitmapRect(bitmap, src, dst, paint);
    202     }
    203 }
    204 
    205 void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
    206                                     const SkPaint* paint) {
    207     Iter iter(fList);
    208     while (iter.next()) {
    209         iter->drawBitmapMatrix(bitmap, m, paint);
    210     }
    211 }
    212 
    213 void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
    214                               const SkPaint* paint) {
    215     Iter iter(fList);
    216     while (iter.next()) {
    217         iter->drawSprite(bitmap, x, y, paint);
    218     }
    219 }
    220 
    221 void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
    222                             SkScalar y, const SkPaint& paint) {
    223     Iter iter(fList);
    224     while (iter.next()) {
    225         iter->drawText(text, byteLength, x, y, paint);
    226     }
    227 }
    228 
    229 void SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
    230                                const SkPoint pos[], const SkPaint& paint) {
    231     Iter iter(fList);
    232     while (iter.next()) {
    233         iter->drawPosText(text, byteLength, pos, paint);
    234     }
    235 }
    236 
    237 void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
    238                                 const SkScalar xpos[], SkScalar constY,
    239                                 const SkPaint& paint) {
    240     Iter iter(fList);
    241     while (iter.next()) {
    242         iter->drawPosTextH(text, byteLength, xpos, constY, paint);
    243     }
    244 }
    245 
    246 void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
    247                                   const SkPath& path, const SkMatrix* matrix,
    248                                   const SkPaint& paint) {
    249     Iter iter(fList);
    250     while (iter.next()) {
    251         iter->drawTextOnPath(text, byteLength, path, matrix, paint);
    252     }
    253 }
    254 
    255 void SkNWayCanvas::drawPicture(SkPicture& picture) {
    256     Iter iter(fList);
    257     while (iter.next()) {
    258         iter->drawPicture(picture);
    259     }
    260 }
    261 
    262 void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
    263                           const SkPoint vertices[], const SkPoint texs[],
    264                           const SkColor colors[], SkXfermode* xmode,
    265                           const uint16_t indices[], int indexCount,
    266                           const SkPaint& paint) {
    267     Iter iter(fList);
    268     while (iter.next()) {
    269         iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
    270                            indices, indexCount, paint);
    271     }
    272 }
    273 
    274 SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
    275     Iter iter(fList);
    276     while (iter.next()) {
    277         iter->setBounder(bounder);
    278     }
    279     return this->INHERITED::setBounder(bounder);
    280 }
    281 
    282 SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
    283     Iter iter(fList);
    284     while (iter.next()) {
    285         iter->setDrawFilter(filter);
    286     }
    287     return this->INHERITED::setDrawFilter(filter);
    288 }
    289 
    290 
    291