xref: /aosp_15_r20/external/skia/src/utils/SkCanvasStack.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkCanvasStack_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkCanvasStack_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkM44.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTypeTraits.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkNWayCanvas.h"
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
22*c8dee2aaSAndroid Build Coastguard Worker #include <type_traits>
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker class SkPath;
25*c8dee2aaSAndroid Build Coastguard Worker class SkRRect;
26*c8dee2aaSAndroid Build Coastguard Worker class SkShader;
27*c8dee2aaSAndroid Build Coastguard Worker enum class SkClipOp;
28*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker /**
31*c8dee2aaSAndroid Build Coastguard Worker  *  Like NWayCanvas, in that it forwards all canvas methods to each sub-canvas that is "pushed".
32*c8dee2aaSAndroid Build Coastguard Worker  *
33*c8dee2aaSAndroid Build Coastguard Worker  *  Unlike NWayCanvas, this takes ownership of each subcanvas, and deletes them when this canvas
34*c8dee2aaSAndroid Build Coastguard Worker  *  is deleted.
35*c8dee2aaSAndroid Build Coastguard Worker  */
36*c8dee2aaSAndroid Build Coastguard Worker class SkCanvasStack : public SkNWayCanvas {
37*c8dee2aaSAndroid Build Coastguard Worker public:
38*c8dee2aaSAndroid Build Coastguard Worker     SkCanvasStack(int width, int height);
39*c8dee2aaSAndroid Build Coastguard Worker     ~SkCanvasStack() override;
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     void pushCanvas(std::unique_ptr<SkCanvas>, const SkIPoint& origin);
42*c8dee2aaSAndroid Build Coastguard Worker     void removeAll() override;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     /*
45*c8dee2aaSAndroid Build Coastguard Worker      * The following add/remove canvas methods are overrides from SkNWayCanvas
46*c8dee2aaSAndroid Build Coastguard Worker      * that do not make sense in the context of our CanvasStack, but since we
47*c8dee2aaSAndroid Build Coastguard Worker      * can share most of the other implementation of NWay we override those
48*c8dee2aaSAndroid Build Coastguard Worker      * methods to be no-ops.
49*c8dee2aaSAndroid Build Coastguard Worker      */
addCanvas(SkCanvas *)50*c8dee2aaSAndroid Build Coastguard Worker     void addCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
removeCanvas(SkCanvas *)51*c8dee2aaSAndroid Build Coastguard Worker     void removeCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker protected:
54*c8dee2aaSAndroid Build Coastguard Worker     void didSetM44(const SkM44&) override;
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
57*c8dee2aaSAndroid Build Coastguard Worker     void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
58*c8dee2aaSAndroid Build Coastguard Worker     void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
59*c8dee2aaSAndroid Build Coastguard Worker     void onClipShader(sk_sp<SkShader>, SkClipOp) override;
60*c8dee2aaSAndroid Build Coastguard Worker     void onClipRegion(const SkRegion&, SkClipOp) override;
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker private:
63*c8dee2aaSAndroid Build Coastguard Worker     void clipToZOrderedBounds();
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     struct CanvasData {
66*c8dee2aaSAndroid Build Coastguard Worker         SkIPoint origin;
67*c8dee2aaSAndroid Build Coastguard Worker         SkRegion requiredClip;
68*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<SkCanvas> ownedCanvas;
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker         static_assert(::sk_is_trivially_relocatable<decltype(origin)>::value);
71*c8dee2aaSAndroid Build Coastguard Worker         static_assert(::sk_is_trivially_relocatable<decltype(requiredClip)>::value);
72*c8dee2aaSAndroid Build Coastguard Worker         static_assert(::sk_is_trivially_relocatable<decltype(ownedCanvas)>::value);
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker         using sk_is_trivially_relocatable = std::true_type;
75*c8dee2aaSAndroid Build Coastguard Worker     };
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<CanvasData> fCanvasData;
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkNWayCanvas;
80*c8dee2aaSAndroid Build Coastguard Worker };
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker #endif
83