OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. | 2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above | 8 * 1. Redistributions of source code must retain the above |
9 * copyright notice, this list of conditions and the following | 9 * copyright notice, this list of conditions and the following |
10 * disclaimer. | 10 * disclaimer. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 namespace blink { | 43 namespace blink { |
44 | 44 |
45 class FloatRect; | 45 class FloatRect; |
46 class FloatSize; | 46 class FloatSize; |
47 class Path; | 47 class Path; |
48 | 48 |
49 class CORE_EXPORT BasicShape : public RefCounted<BasicShape> { | 49 class CORE_EXPORT BasicShape : public RefCounted<BasicShape> { |
50 public: | 50 public: |
51 virtual ~BasicShape() { } | 51 virtual ~BasicShape() { } |
52 | 52 |
53 enum Type { | 53 enum ShapeType { |
54 BasicShapeEllipseType, | 54 BasicShapeEllipseType, |
55 BasicShapePolygonType, | 55 BasicShapePolygonType, |
56 BasicShapeCircleType, | 56 BasicShapeCircleType, |
57 BasicShapeInsetType | 57 BasicShapeInsetType |
58 }; | 58 }; |
59 | 59 |
60 bool canBlend(const BasicShape*) const; | 60 bool canBlend(const BasicShape*) const; |
61 bool isSameType(const BasicShape& other) const { return type() == other.type
(); } | 61 bool isSameType(const BasicShape& other) const { return type() == other.type
(); } |
62 | 62 |
63 virtual void path(Path&, const FloatRect&) = 0; | 63 virtual void path(Path&, const FloatRect&) = 0; |
64 virtual WindRule windRule() const { return RULE_NONZERO; } | 64 virtual WindRule getWindRule() const { return RULE_NONZERO; } |
65 virtual PassRefPtr<BasicShape> blend(const BasicShape*, double) const = 0; | 65 virtual PassRefPtr<BasicShape> blend(const BasicShape*, double) const = 0; |
66 virtual bool operator==(const BasicShape&) const = 0; | 66 virtual bool operator==(const BasicShape&) const = 0; |
67 | 67 |
68 virtual Type type() const = 0; | 68 virtual ShapeType type() const = 0; |
69 | 69 |
70 protected: | 70 protected: |
71 BasicShape() | 71 BasicShape() |
72 { | 72 { |
73 } | 73 } |
74 | 74 |
75 }; | 75 }; |
76 | 76 |
77 #define DEFINE_BASICSHAPE_TYPE_CASTS(thisType) \ | 77 #define DEFINE_BASICSHAPE_TYPE_CASTS(thisType) \ |
78 DEFINE_TYPE_CASTS(thisType, BasicShape, value, value->type() == BasicShape::
thisType##Type, value.type() == BasicShape::thisType##Type) | 78 DEFINE_TYPE_CASTS(thisType, BasicShape, value, value->type() == BasicShape::
thisType##Type, value.type() == BasicShape::thisType##Type) |
79 | 79 |
80 class BasicShapeCenterCoordinate { | 80 class BasicShapeCenterCoordinate { |
81 DISALLOW_NEW(); | 81 DISALLOW_NEW(); |
82 public: | 82 public: |
83 enum Direction { | 83 enum Direction { |
84 TopLeft, | 84 TopLeft, |
85 BottomRight | 85 BottomRight |
86 }; | 86 }; |
87 | 87 |
88 BasicShapeCenterCoordinate(Direction direction = TopLeft, const Length& leng
th = Length(0, Fixed)) | 88 BasicShapeCenterCoordinate(Direction direction = TopLeft, const Length& leng
th = Length(0, Fixed)) |
89 : m_direction(direction) | 89 : m_direction(direction) |
90 , m_length(length) | 90 , m_length(length) |
91 , m_computedLength(direction == TopLeft ? length : length.subtractFromOn
eHundredPercent()) | 91 , m_computedLength(direction == TopLeft ? length : length.subtractFromOn
eHundredPercent()) |
92 { | 92 { |
93 } | 93 } |
94 | 94 |
95 BasicShapeCenterCoordinate(const BasicShapeCenterCoordinate& other) | 95 BasicShapeCenterCoordinate(const BasicShapeCenterCoordinate& other) |
96 : m_direction(other.direction()) | 96 : m_direction(other.getDirection()) |
97 , m_length(other.length()) | 97 , m_length(other.length()) |
98 , m_computedLength(other.m_computedLength) | 98 , m_computedLength(other.m_computedLength) |
99 { | 99 { |
100 } | 100 } |
101 | 101 |
102 bool operator==(const BasicShapeCenterCoordinate& other) const { return m_di
rection == other.m_direction && m_length == other.m_length && m_computedLength =
= other.m_computedLength; } | 102 bool operator==(const BasicShapeCenterCoordinate& other) const { return m_di
rection == other.m_direction && m_length == other.m_length && m_computedLength =
= other.m_computedLength; } |
103 | 103 |
104 Direction direction() const { return m_direction; } | 104 Direction getDirection() const { return m_direction; } |
105 const Length& length() const { return m_length; } | 105 const Length& length() const { return m_length; } |
106 const Length& computedLength() const { return m_computedLength; } | 106 const Length& computedLength() const { return m_computedLength; } |
107 | 107 |
108 BasicShapeCenterCoordinate blend(const BasicShapeCenterCoordinate& other, do
uble progress) const | 108 BasicShapeCenterCoordinate blend(const BasicShapeCenterCoordinate& other, do
uble progress) const |
109 { | 109 { |
110 return BasicShapeCenterCoordinate(TopLeft, m_computedLength.blend(other.
m_computedLength, progress, ValueRangeAll)); | 110 return BasicShapeCenterCoordinate(TopLeft, m_computedLength.blend(other.
m_computedLength, progress, ValueRangeAll)); |
111 } | 111 } |
112 | 112 |
113 private: | 113 private: |
114 Direction m_direction; | 114 Direction m_direction; |
115 Length m_length; | 115 Length m_length; |
116 Length m_computedLength; | 116 Length m_computedLength; |
117 }; | 117 }; |
118 | 118 |
119 class BasicShapeRadius { | 119 class BasicShapeRadius { |
120 DISALLOW_NEW(); | 120 DISALLOW_NEW(); |
121 public: | 121 public: |
122 enum Type { | 122 enum RadiusType { |
123 Value, | 123 Value, |
124 ClosestSide, | 124 ClosestSide, |
125 FarthestSide | 125 FarthestSide |
126 }; | 126 }; |
127 BasicShapeRadius() : m_type(ClosestSide) { } | 127 BasicShapeRadius() : m_type(ClosestSide) { } |
128 explicit BasicShapeRadius(const Length& v) : m_value(v), m_type(Value) { } | 128 explicit BasicShapeRadius(const Length& v) : m_value(v), m_type(Value) { } |
129 explicit BasicShapeRadius(Type t) : m_type(t) { } | 129 explicit BasicShapeRadius(RadiusType t) : m_type(t) { } |
130 BasicShapeRadius(const BasicShapeRadius& other) : m_value(other.value()), m_
type(other.type()) { } | 130 BasicShapeRadius(const BasicShapeRadius& other) : m_value(other.value()), m_
type(other.type()) { } |
131 bool operator==(const BasicShapeRadius& other) const { return m_type == othe
r.m_type && m_value == other.m_value; } | 131 bool operator==(const BasicShapeRadius& other) const { return m_type == othe
r.m_type && m_value == other.m_value; } |
132 | 132 |
133 const Length& value() const { return m_value; } | 133 const Length& value() const { return m_value; } |
134 Type type() const { return m_type; } | 134 RadiusType type() const { return m_type; } |
135 | 135 |
136 bool canBlend(const BasicShapeRadius& other) const | 136 bool canBlend(const BasicShapeRadius& other) const |
137 { | 137 { |
138 // FIXME determine how to interpolate between keywords. See issue 330248
. | 138 // FIXME determine how to interpolate between keywords. See issue 330248
. |
139 return m_type == Value && other.type() == Value; | 139 return m_type == Value && other.type() == Value; |
140 } | 140 } |
141 | 141 |
142 BasicShapeRadius blend(const BasicShapeRadius& other, double progress) const | 142 BasicShapeRadius blend(const BasicShapeRadius& other, double progress) const |
143 { | 143 { |
144 if (m_type != Value || other.type() != Value) | 144 if (m_type != Value || other.type() != Value) |
145 return BasicShapeRadius(other); | 145 return BasicShapeRadius(other); |
146 | 146 |
147 return BasicShapeRadius(m_value.blend(other.value(), progress, ValueRang
eNonNegative)); | 147 return BasicShapeRadius(m_value.blend(other.value(), progress, ValueRang
eNonNegative)); |
148 } | 148 } |
149 | 149 |
150 private: | 150 private: |
151 Length m_value; | 151 Length m_value; |
152 Type m_type; | 152 RadiusType m_type; |
153 | 153 |
154 }; | 154 }; |
155 | 155 |
156 class CORE_EXPORT BasicShapeCircle final : public BasicShape { | 156 class CORE_EXPORT BasicShapeCircle final : public BasicShape { |
157 public: | 157 public: |
158 static PassRefPtr<BasicShapeCircle> create() { return adoptRef(new BasicShap
eCircle); } | 158 static PassRefPtr<BasicShapeCircle> create() { return adoptRef(new BasicShap
eCircle); } |
159 | 159 |
160 const BasicShapeCenterCoordinate& centerX() const { return m_centerX; } | 160 const BasicShapeCenterCoordinate& centerX() const { return m_centerX; } |
161 const BasicShapeCenterCoordinate& centerY() const { return m_centerY; } | 161 const BasicShapeCenterCoordinate& centerY() const { return m_centerY; } |
162 const BasicShapeRadius& radius() const { return m_radius; } | 162 const BasicShapeRadius& radius() const { return m_radius; } |
163 | 163 |
164 float floatValueForRadiusInBox(FloatSize) const; | 164 float floatValueForRadiusInBox(FloatSize) const; |
165 void setCenterX(BasicShapeCenterCoordinate centerX) { m_centerX = centerX; } | 165 void setCenterX(BasicShapeCenterCoordinate centerX) { m_centerX = centerX; } |
166 void setCenterY(BasicShapeCenterCoordinate centerY) { m_centerY = centerY; } | 166 void setCenterY(BasicShapeCenterCoordinate centerY) { m_centerY = centerY; } |
167 void setRadius(BasicShapeRadius radius) { m_radius = radius; } | 167 void setRadius(BasicShapeRadius radius) { m_radius = radius; } |
168 | 168 |
169 void path(Path&, const FloatRect&) override; | 169 void path(Path&, const FloatRect&) override; |
170 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; | 170 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; |
171 bool operator==(const BasicShape&) const override; | 171 bool operator==(const BasicShape&) const override; |
172 | 172 |
173 Type type() const override { return BasicShapeCircleType; } | 173 ShapeType type() const override { return BasicShapeCircleType; } |
174 private: | 174 private: |
175 BasicShapeCircle() { } | 175 BasicShapeCircle() { } |
176 | 176 |
177 BasicShapeCenterCoordinate m_centerX; | 177 BasicShapeCenterCoordinate m_centerX; |
178 BasicShapeCenterCoordinate m_centerY; | 178 BasicShapeCenterCoordinate m_centerY; |
179 BasicShapeRadius m_radius; | 179 BasicShapeRadius m_radius; |
180 }; | 180 }; |
181 | 181 |
182 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeCircle); | 182 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeCircle); |
183 | 183 |
184 class BasicShapeEllipse final : public BasicShape { | 184 class BasicShapeEllipse final : public BasicShape { |
185 public: | 185 public: |
186 static PassRefPtr<BasicShapeEllipse> create() { return adoptRef(new BasicSha
peEllipse); } | 186 static PassRefPtr<BasicShapeEllipse> create() { return adoptRef(new BasicSha
peEllipse); } |
187 | 187 |
188 const BasicShapeCenterCoordinate& centerX() const { return m_centerX; } | 188 const BasicShapeCenterCoordinate& centerX() const { return m_centerX; } |
189 const BasicShapeCenterCoordinate& centerY() const { return m_centerY; } | 189 const BasicShapeCenterCoordinate& centerY() const { return m_centerY; } |
190 const BasicShapeRadius& radiusX() const { return m_radiusX; } | 190 const BasicShapeRadius& radiusX() const { return m_radiusX; } |
191 const BasicShapeRadius& radiusY() const { return m_radiusY; } | 191 const BasicShapeRadius& radiusY() const { return m_radiusY; } |
192 float floatValueForRadiusInBox(const BasicShapeRadius&, float center, float
boxWidthOrHeight) const; | 192 float floatValueForRadiusInBox(const BasicShapeRadius&, float center, float
boxWidthOrHeight) const; |
193 | 193 |
194 void setCenterX(BasicShapeCenterCoordinate centerX) { m_centerX = centerX; } | 194 void setCenterX(BasicShapeCenterCoordinate centerX) { m_centerX = centerX; } |
195 void setCenterY(BasicShapeCenterCoordinate centerY) { m_centerY = centerY; } | 195 void setCenterY(BasicShapeCenterCoordinate centerY) { m_centerY = centerY; } |
196 void setRadiusX(BasicShapeRadius radiusX) { m_radiusX = radiusX; } | 196 void setRadiusX(BasicShapeRadius radiusX) { m_radiusX = radiusX; } |
197 void setRadiusY(BasicShapeRadius radiusY) { m_radiusY = radiusY; } | 197 void setRadiusY(BasicShapeRadius radiusY) { m_radiusY = radiusY; } |
198 | 198 |
199 void path(Path&, const FloatRect&) override; | 199 void path(Path&, const FloatRect&) override; |
200 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; | 200 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; |
201 bool operator==(const BasicShape&) const override; | 201 bool operator==(const BasicShape&) const override; |
202 | 202 |
203 Type type() const override { return BasicShapeEllipseType; } | 203 ShapeType type() const override { return BasicShapeEllipseType; } |
204 private: | 204 private: |
205 BasicShapeEllipse() { } | 205 BasicShapeEllipse() { } |
206 | 206 |
207 BasicShapeCenterCoordinate m_centerX; | 207 BasicShapeCenterCoordinate m_centerX; |
208 BasicShapeCenterCoordinate m_centerY; | 208 BasicShapeCenterCoordinate m_centerY; |
209 BasicShapeRadius m_radiusX; | 209 BasicShapeRadius m_radiusX; |
210 BasicShapeRadius m_radiusY; | 210 BasicShapeRadius m_radiusY; |
211 }; | 211 }; |
212 | 212 |
213 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeEllipse); | 213 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeEllipse); |
214 | 214 |
215 class BasicShapePolygon final : public BasicShape { | 215 class BasicShapePolygon final : public BasicShape { |
216 public: | 216 public: |
217 static PassRefPtr<BasicShapePolygon> create() { return adoptRef(new BasicSha
pePolygon); } | 217 static PassRefPtr<BasicShapePolygon> create() { return adoptRef(new BasicSha
pePolygon); } |
218 | 218 |
219 const Vector<Length>& values() const { return m_values; } | 219 const Vector<Length>& values() const { return m_values; } |
220 Length getXAt(unsigned i) const { return m_values.at(2 * i); } | 220 Length getXAt(unsigned i) const { return m_values.at(2 * i); } |
221 Length getYAt(unsigned i) const { return m_values.at(2 * i + 1); } | 221 Length getYAt(unsigned i) const { return m_values.at(2 * i + 1); } |
222 | 222 |
223 void setWindRule(WindRule windRule) { m_windRule = windRule; } | 223 void setWindRule(WindRule windRule) { m_windRule = windRule; } |
224 void appendPoint(const Length& x, const Length& y) { m_values.append(x); m_v
alues.append(y); } | 224 void appendPoint(const Length& x, const Length& y) { m_values.append(x); m_v
alues.append(y); } |
225 | 225 |
226 void path(Path&, const FloatRect&) override; | 226 void path(Path&, const FloatRect&) override; |
227 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; | 227 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; |
228 bool operator==(const BasicShape&) const override; | 228 bool operator==(const BasicShape&) const override; |
229 | 229 |
230 WindRule windRule() const override { return m_windRule; } | 230 WindRule getWindRule() const override { return m_windRule; } |
231 | 231 |
232 Type type() const override { return BasicShapePolygonType; } | 232 ShapeType type() const override { return BasicShapePolygonType; } |
233 private: | 233 private: |
234 BasicShapePolygon() | 234 BasicShapePolygon() |
235 : m_windRule(RULE_NONZERO) | 235 : m_windRule(RULE_NONZERO) |
236 { } | 236 { } |
237 | 237 |
238 WindRule m_windRule; | 238 WindRule m_windRule; |
239 Vector<Length> m_values; | 239 Vector<Length> m_values; |
240 }; | 240 }; |
241 | 241 |
242 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapePolygon); | 242 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapePolygon); |
(...skipping 19 matching lines...) Expand all Loading... |
262 | 262 |
263 void setTopLeftRadius(const LengthSize& radius) { m_topLeftRadius = radius;
} | 263 void setTopLeftRadius(const LengthSize& radius) { m_topLeftRadius = radius;
} |
264 void setTopRightRadius(const LengthSize& radius) { m_topRightRadius = radius
; } | 264 void setTopRightRadius(const LengthSize& radius) { m_topRightRadius = radius
; } |
265 void setBottomRightRadius(const LengthSize& radius) { m_bottomRightRadius =
radius; } | 265 void setBottomRightRadius(const LengthSize& radius) { m_bottomRightRadius =
radius; } |
266 void setBottomLeftRadius(const LengthSize& radius) { m_bottomLeftRadius = ra
dius; } | 266 void setBottomLeftRadius(const LengthSize& radius) { m_bottomLeftRadius = ra
dius; } |
267 | 267 |
268 void path(Path&, const FloatRect&) override; | 268 void path(Path&, const FloatRect&) override; |
269 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; | 269 PassRefPtr<BasicShape> blend(const BasicShape*, double) const override; |
270 bool operator==(const BasicShape&) const override; | 270 bool operator==(const BasicShape&) const override; |
271 | 271 |
272 Type type() const override { return BasicShapeInsetType; } | 272 ShapeType type() const override { return BasicShapeInsetType; } |
273 private: | 273 private: |
274 BasicShapeInset() { } | 274 BasicShapeInset() { } |
275 | 275 |
276 Length m_right; | 276 Length m_right; |
277 Length m_top; | 277 Length m_top; |
278 Length m_bottom; | 278 Length m_bottom; |
279 Length m_left; | 279 Length m_left; |
280 | 280 |
281 LengthSize m_topLeftRadius; | 281 LengthSize m_topLeftRadius; |
282 LengthSize m_topRightRadius; | 282 LengthSize m_topRightRadius; |
283 LengthSize m_bottomRightRadius; | 283 LengthSize m_bottomRightRadius; |
284 LengthSize m_bottomLeftRadius; | 284 LengthSize m_bottomLeftRadius; |
285 }; | 285 }; |
286 | 286 |
287 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeInset); | 287 DEFINE_BASICSHAPE_TYPE_CASTS(BasicShapeInset); |
288 | 288 |
289 } // namespace blink | 289 } // namespace blink |
290 #endif | 290 #endif |
OLD | NEW |