|  |  | 
|  | /* | 
|  | * 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 "SkTArray.h" | 
|  |  | 
|  | class SkCanvasStack : public SkNWayCanvas { | 
|  | public: | 
|  | SkCanvasStack(int width, int height); | 
|  | virtual ~SkCanvasStack(); | 
|  |  | 
|  | void pushCanvas(SkCanvas* canvas, const SkIPoint& origin); | 
|  | virtual void removeAll() SK_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. | 
|  | */ | 
|  | virtual void addCanvas(SkCanvas*) SK_OVERRIDE { SkDEBUGFAIL("Invalid Op"); } | 
|  | virtual void removeCanvas(SkCanvas*) SK_OVERRIDE { SkDEBUGFAIL("Invalid Op"); } | 
|  |  | 
|  | protected: | 
|  | virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; | 
|  |  | 
|  | virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; | 
|  | virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; | 
|  | virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; | 
|  | virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE; | 
|  |  | 
|  | private: | 
|  | void clipToZOrderedBounds(); | 
|  |  | 
|  | struct CanvasData { | 
|  | SkIPoint origin; | 
|  | SkRegion requiredClip; | 
|  | }; | 
|  |  | 
|  | SkTArray<CanvasData> fCanvasData; | 
|  |  | 
|  | typedef SkNWayCanvas INHERITED; | 
|  | }; | 
|  |  | 
|  | #endif |