text: /*
   * Copyright 2013 Google Inc.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  
  #ifndef SkCanvasStack_DEFINED
  #define SkCanvasStack_DEFINED
  
  #include "SkNWayCanvas.h"
  #include "SkRegion.h"
  #include "SkTArray.h"
  
  /**
   *  Like NWayCanvas, in that it forwards all canvas methods to each sub-canvas that is "pushed".
   *
   *  Unlike NWayCanvas, this takes ownership of each subcanvas, and deletes them when this canvas
   *  is deleted.
   */
  class SkCanvasStack : public SkNWayCanvas {
  public:
      SkCanvasStack(int width, int height);
      virtual ~SkCanvasStack();
  
      void pushCanvas(std::unique_ptr<SkCanvas>, const SkIPoint& origin);
      void removeAll() override;
  
      /*
       * The following add/remove canvas methods are overrides from SkNWayCanvas
       * that do not make sense in the context of our CanvasStack, but since we
       * can share most of the other implementation of NWay we override those
       * methods to be no-ops.
       */
      void addCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
      void removeCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
  
  protected:
      void didSetMatrix(const SkMatrix&) override;
  
      void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
      void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
      void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
      void onClipRegion(const SkRegion&, SkClipOp) override;
  
  private:
      void clipToZOrderedBounds();
  
      struct CanvasData {
          SkIPoint origin;
          SkRegion requiredClip;
          std::unique_ptr<SkCanvas> ownedCanvas;
      };
  
      SkTArray<CanvasData> fCanvasData;
  
      typedef SkNWayCanvas INHERITED;
  };
  
  #endif
  