text: 
  /*
   * Copyright 2011 Google Inc.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  #include "SkNWayCanvas.h"
  
  SkNWayCanvas::SkNWayCanvas(int width, int height)
          : INHERITED(width, height) {}
  
  SkNWayCanvas::~SkNWayCanvas() {
      this->removeAll();
  }
  
  void SkNWayCanvas::addCanvas(SkCanvas* canvas) {
      if (canvas) {
          canvas->ref();
          *fList.append() = canvas;
      }
  }
  
  void SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
      int index = fList.find(canvas);
      if (index >= 0) {
          canvas->unref();
          fList.removeShuffle(index);
      }
  }
  
  void SkNWayCanvas::removeAll() {
      fList.unrefAll();
      fList.reset();
  }
  
  ///////////////////////////////////////////////////////////////////////////
  // These are forwarded to the N canvases we're referencing
  
  class SkNWayCanvas::Iter {
  public:
      Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
          fIndex = 0;
      }
      bool next() {
          if (fIndex < fList.count()) {
              fCanvas = fList[fIndex++];
              return true;
          }
          return false;
      }
      SkCanvas* operator->() { return fCanvas; }
  
  private:
      const SkTDArray<SkCanvas*>& fList;
      int fIndex;
      SkCanvas* fCanvas;
  };
  
  void SkNWayCanvas::willSave() {
      Iter iter(fList);
      while (iter.next()) {
          iter->save();
      }
  
      this->INHERITED::willSave();
  }
  
  SkCanvas::SaveLayerStrategy SkNWayCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint,
                                                          SaveFlags flags) {
      Iter iter(fList);
      while (iter.next()) {
          iter->saveLayer(bounds, paint, flags);
      }
  
      this->INHERITED::willSaveLayer(bounds, paint, flags);
      // No need for a layer.
      return kNoLayer_SaveLayerStrategy;
  }
  
  void SkNWayCanvas::willRestore() {
      Iter iter(fList);
      while (iter.next()) {
          iter->restore();
      }
      this->INHERITED::willRestore();
  }
  
  void SkNWayCanvas::didConcat(const SkMatrix& matrix) {
      Iter iter(fList);
      while (iter.next()) {
          iter->concat(matrix);
      }
      this->INHERITED::didConcat(matrix);
  }
  
  void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) {
      Iter iter(fList);
      while (iter.next()) {
          iter->setMatrix(matrix);
      }
      this->INHERITED::didSetMatrix(matrix);
  }
  
  void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
      Iter iter(fList);
      while (iter.next()) {
          iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
      }
      this->INHERITED::onClipRect(rect, op, edgeStyle);
  }
  
  void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
      Iter iter(fList);
      while (iter.next()) {
          iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
      }
      this->INHERITED::onClipRRect(rrect, op, edgeStyle);
  }
  
  void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
      Iter iter(fList);
      while (iter.next()) {
          iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
      }
      this->INHERITED::onClipPath(path, op, edgeStyle);
  }
  
  void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
      Iter iter(fList);
      while (iter.next()) {
          iter->clipRegion(deviceRgn, op);
      }
      this->INHERITED::onClipRegion(deviceRgn, op);
  }
  
  void SkNWayCanvas::clear(SkColor color) {
      Iter iter(fList);
      while (iter.next()) {
          iter->clear(color);
      }
  }
  
  void SkNWayCanvas::drawPaint(const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPaint(paint);
      }
  }
  
  void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                          const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPoints(mode, count, pts, paint);
      }
  }
  
  void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawRect(rect, paint);
      }
  }
  
  void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawOval(rect, paint);
      }
  }
  
  void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawRRect(rrect, paint);
      }
  }
  
  void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
                                  const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawDRRect(outer, inner, paint);
      }
  }
  
  void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPath(path, paint);
      }
  }
  
  void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
                                const SkPaint* paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawBitmap(bitmap, x, y, paint);
      }
  }
  
  void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
                                    const SkRect& dst, const SkPaint* paint,
                                    DrawBitmapRectFlags flags) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
      }
  }
  
  void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
                                      const SkPaint* paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawBitmapMatrix(bitmap, m, paint);
      }
  }
  
  void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
                                    const SkRect& dst, const SkPaint* paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawBitmapNine(bitmap, center, dst, paint);
      }
  }
  
  void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
                                const SkPaint* paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawSprite(bitmap, x, y, paint);
      }
  }
  
  void SkNWayCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
                                const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawText(text, byteLength, x, y, paint);
      }
  }
  
  void SkNWayCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
                                   const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPosText(text, byteLength, pos, paint);
      }
  }
  
  void SkNWayCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
                                    SkScalar constY, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPosTextH(text, byteLength, xpos, constY, paint);
      }
  }
  
  void SkNWayCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
                                      const SkMatrix* matrix, const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawTextOnPath(text, byteLength, path, matrix, paint);
      }
  }
  
  void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix,
                                   const SkPaint* paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPicture(picture, matrix, paint);
      }
  }
  
  void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
                            const SkPoint vertices[], const SkPoint texs[],
                            const SkColor colors[], SkXfermode* xmode,
                            const uint16_t indices[], int indexCount,
                            const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
                             indices, indexCount, paint);
      }
  }
  
  void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
                                 const SkPoint texCoords[4], SkXfermode* xmode,
                                 const SkPaint& paint) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawPatch(cubics, colors, texCoords, xmode, paint);
      }
  }
  
  void SkNWayCanvas::drawData(const void* data, size_t length) {
      Iter iter(fList);
      while (iter.next()) {
          iter->drawData(data, length);
      }
  }
  
  SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
      Iter iter(fList);
      while (iter.next()) {
          iter->setDrawFilter(filter);
      }
      return this->INHERITED::setDrawFilter(filter);
  }
  
  void SkNWayCanvas::beginCommentGroup(const char* description) {
      Iter iter(fList);
      while (iter.next()) {
          iter->beginCommentGroup(description);
      }
  }
  
  void SkNWayCanvas::addComment(const char* kywd, const char* value) {
      Iter iter(fList);
      while (iter.next()) {
          iter->addComment(kywd, value);
      }
  }
  
  void SkNWayCanvas::endCommentGroup() {
      Iter iter(fList);
      while (iter.next()) {
          iter->endCommentGroup();
      }
  }
  