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