656e7fda5663d1d460d40015fc58eac238af7fe6
[WebKit-https.git] / Source / WebCore / rendering / ClipPathOperation.h
1 /*
2  * Copyright (C) 2012, 2013 Adobe Systems Incorporated. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above
9  *    copyright notice, this list of conditions and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials
14  *    provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #ifndef ClipPathOperation_h
31 #define ClipPathOperation_h
32
33 #include "BasicShapes.h"
34 #include "Path.h"
35 #include "RenderStyleConstants.h"
36 #include <wtf/OwnPtr.h>
37 #include <wtf/PassOwnPtr.h>
38 #include <wtf/RefCounted.h>
39 #include <wtf/text/WTFString.h>
40
41 namespace WebCore {
42
43 class ClipPathOperation : public RefCounted<ClipPathOperation> {
44 public:
45     enum OperationType {
46         Reference,
47         Shape,
48         Box
49     };
50
51     virtual ~ClipPathOperation() { }
52
53     virtual bool operator==(const ClipPathOperation&) const = 0;
54     bool operator!=(const ClipPathOperation& o) const { return !(*this == o); }
55
56     virtual OperationType type() const { return m_type; }
57     virtual bool isSameType(const ClipPathOperation& o) const { return o.type() == m_type; }
58
59 protected:
60     explicit ClipPathOperation(OperationType type)
61         : m_type(type)
62     {
63     }
64
65     OperationType m_type;
66 };
67
68 class ReferenceClipPathOperation : public ClipPathOperation {
69 public:
70     static PassRefPtr<ReferenceClipPathOperation> create(const String& url, const String& fragment)
71     {
72         return adoptRef(new ReferenceClipPathOperation(url, fragment));
73     }
74
75     const String& url() const { return m_url; }
76     const String& fragment() const { return m_fragment; }
77
78 private:
79     virtual bool operator==(const ClipPathOperation& o) const override
80     {
81         if (!isSameType(o))
82             return false;
83         const ReferenceClipPathOperation* other = static_cast<const ReferenceClipPathOperation*>(&o);
84         return m_url == other->m_url;
85     }
86
87     ReferenceClipPathOperation(const String& url, const String& fragment)
88         : ClipPathOperation(Reference)
89         , m_url(url)
90         , m_fragment(fragment)
91     {
92     }
93
94     String m_url;
95     String m_fragment;
96 };
97
98 class ShapeClipPathOperation : public ClipPathOperation {
99 public:
100     static PassRefPtr<ShapeClipPathOperation> create(PassRefPtr<BasicShape> shape)
101     {
102         return adoptRef(new ShapeClipPathOperation(shape));
103     }
104
105     const BasicShape* basicShape() const { return m_shape.get(); }
106     WindRule windRule() const { return m_shape->windRule(); }
107     const Path pathForReferenceRect(const FloatRect& boundingRect) const
108     {
109         ASSERT(m_shape);
110         Path path;
111         m_shape->path(path, boundingRect);
112         return path;
113     }
114
115     void setReferenceBox(CSSBoxType referenceBox) { m_referenceBox = referenceBox; }
116     CSSBoxType referenceBox() const { return m_referenceBox; }
117
118 private:
119     virtual bool operator==(const ClipPathOperation& o) const override
120     {
121         if (!isSameType(o))
122             return false;
123         const ShapeClipPathOperation* other = static_cast<const ShapeClipPathOperation*>(&o);
124         return m_shape == other->m_shape;
125     }
126
127     explicit ShapeClipPathOperation(PassRefPtr<BasicShape> shape)
128         : ClipPathOperation(Shape)
129         , m_shape(shape)
130         , m_referenceBox(BoxMissing)
131     {
132     }
133
134     RefPtr<BasicShape> m_shape;
135     CSSBoxType m_referenceBox;
136 };
137
138 class BoxClipPathOperation : public ClipPathOperation {
139 public:
140     static PassRefPtr<BoxClipPathOperation> create(CSSBoxType referenceBox)
141     {
142         return adoptRef(new BoxClipPathOperation(referenceBox));
143     }
144
145     const Path pathForReferenceRect(const RoundedRect& boundingRect) const
146     {
147         Path path;
148         path.addRoundedRect(boundingRect);
149         return path;
150     }
151     CSSBoxType referenceBox() const { return m_referenceBox; }
152
153 private:
154     virtual bool operator==(const ClipPathOperation& o) const override
155     {
156         if (!isSameType(o))
157             return false;
158         const BoxClipPathOperation* other = static_cast<const BoxClipPathOperation*>(&o);
159         return m_referenceBox == other->m_referenceBox;
160     }
161
162     explicit BoxClipPathOperation(CSSBoxType referenceBox)
163         : ClipPathOperation(Box)
164         , m_referenceBox(referenceBox)
165     {
166     }
167
168     CSSBoxType m_referenceBox;
169 };
170
171 #define CLIP_PATH_OPERATION_CASTS(ToValueTypeName, predicate) \
172     TYPE_CASTS_BASE(ToValueTypeName, ClipPathOperation, operation, operation->type() == ClipPathOperation::predicate, operation.type() == ClipPathOperation::predicate)
173
174 CLIP_PATH_OPERATION_CASTS(ReferenceClipPathOperation, Reference)
175 CLIP_PATH_OPERATION_CASTS(ShapeClipPathOperation, Shape)
176 CLIP_PATH_OPERATION_CASTS(BoxClipPathOperation, Box)
177
178 } // namespace WebCore
179
180 #endif // ClipPathOperation_h