OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
18 */ | 18 */ |
19 | 19 |
20 #include "config.h" | 20 #include "config.h" |
21 | |
22 #include "core/svg/SVGPathByteStreamBuilder.h" | 21 #include "core/svg/SVGPathByteStreamBuilder.h" |
23 | 22 |
| 23 #include "core/svg/SVGPathByteStream.h" |
24 #include "core/svg/SVGPathSeg.h" | 24 #include "core/svg/SVGPathSeg.h" |
25 #include "wtf/OwnPtr.h" | 25 #include "platform/geometry/FloatPoint.h" |
26 | 26 |
27 namespace blink { | 27 namespace blink { |
28 | 28 |
29 // Helper class that coalesces writes to a SVGPathByteStream to a local buffer. | 29 // Helper class that coalesces writes to a SVGPathByteStream to a local buffer. |
30 class CoalescingBuffer { | 30 class CoalescingBuffer { |
31 public: | 31 public: |
32 CoalescingBuffer(SVGPathByteStream& byteStream) | 32 CoalescingBuffer(SVGPathByteStream& byteStream) |
33 : m_currentOffset(0) | 33 : m_currentOffset(0) |
34 , m_byteStream(byteStream) | 34 , m_byteStream(byteStream) |
35 { | 35 { |
(...skipping 30 matching lines...) Expand all Loading... |
66 size_t m_currentOffset; | 66 size_t m_currentOffset; |
67 unsigned char m_bytes[sizeof(unsigned short) + sizeof(FloatPoint) * 3]; | 67 unsigned char m_bytes[sizeof(unsigned short) + sizeof(FloatPoint) * 3]; |
68 SVGPathByteStream& m_byteStream; | 68 SVGPathByteStream& m_byteStream; |
69 }; | 69 }; |
70 | 70 |
71 SVGPathByteStreamBuilder::SVGPathByteStreamBuilder(SVGPathByteStream& byteStream
) | 71 SVGPathByteStreamBuilder::SVGPathByteStreamBuilder(SVGPathByteStream& byteStream
) |
72 : m_byteStream(byteStream) | 72 : m_byteStream(byteStream) |
73 { | 73 { |
74 } | 74 } |
75 | 75 |
76 void SVGPathByteStreamBuilder::moveTo(const FloatPoint& targetPoint, PathCoordin
ateMode mode) | 76 void SVGPathByteStreamBuilder::emitSegment(const PathSegmentData& segment) |
77 { | 77 { |
78 CoalescingBuffer buffer(m_byteStream); | 78 CoalescingBuffer buffer(m_byteStream); |
79 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegMoveToRel : Pa
thSegMoveToAbs); | 79 buffer.writeSegmentType(segment.command); |
80 buffer.writeFloatPoint(targetPoint); | |
81 } | |
82 | 80 |
83 void SVGPathByteStreamBuilder::lineTo(const FloatPoint& targetPoint, PathCoordin
ateMode mode) | 81 switch (segment.command) { |
84 { | 82 case PathSegMoveToRel: |
85 CoalescingBuffer buffer(m_byteStream); | 83 case PathSegMoveToAbs: |
86 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegLineToRel : Pat
hSegLineToAbs); | 84 case PathSegLineToRel: |
87 buffer.writeFloatPoint(targetPoint); | 85 case PathSegLineToAbs: |
88 } | 86 case PathSegCurveToQuadraticSmoothRel: |
89 | 87 case PathSegCurveToQuadraticSmoothAbs: |
90 void SVGPathByteStreamBuilder::lineToHorizontal(float x, PathCoordinateMode mode
) | 88 buffer.writeFloatPoint(segment.targetPoint); |
91 { | 89 break; |
92 CoalescingBuffer buffer(m_byteStream); | 90 case PathSegLineToHorizontalRel: |
93 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegLineToHorizonta
lRel : PathSegLineToHorizontalAbs); | 91 case PathSegLineToHorizontalAbs: |
94 buffer.writeFloat(x); | 92 buffer.writeFloat(segment.targetPoint.x()); |
95 } | 93 break; |
96 | 94 case PathSegLineToVerticalRel: |
97 void SVGPathByteStreamBuilder::lineToVertical(float y, PathCoordinateMode mode) | 95 case PathSegLineToVerticalAbs: |
98 { | 96 buffer.writeFloat(segment.targetPoint.y()); |
99 CoalescingBuffer buffer(m_byteStream); | 97 break; |
100 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegLineToVerticalR
el : PathSegLineToVerticalAbs); | 98 case PathSegClosePath: |
101 buffer.writeFloat(y); | 99 break; |
102 } | 100 case PathSegCurveToCubicRel: |
103 | 101 case PathSegCurveToCubicAbs: |
104 void SVGPathByteStreamBuilder::curveToCubic(const FloatPoint& point1, const Floa
tPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode) | 102 buffer.writeFloatPoint(segment.point1); |
105 { | 103 buffer.writeFloatPoint(segment.point2); |
106 CoalescingBuffer buffer(m_byteStream); | 104 buffer.writeFloatPoint(segment.targetPoint); |
107 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegCurveToCubicRel
: PathSegCurveToCubicAbs); | 105 break; |
108 buffer.writeFloatPoint(point1); | 106 case PathSegCurveToCubicSmoothRel: |
109 buffer.writeFloatPoint(point2); | 107 case PathSegCurveToCubicSmoothAbs: |
110 buffer.writeFloatPoint(targetPoint); | 108 buffer.writeFloatPoint(segment.point2); |
111 } | 109 buffer.writeFloatPoint(segment.targetPoint); |
112 | 110 break; |
113 void SVGPathByteStreamBuilder::curveToCubicSmooth(const FloatPoint& point2, cons
t FloatPoint& targetPoint, PathCoordinateMode mode) | 111 case PathSegCurveToQuadraticRel: |
114 { | 112 case PathSegCurveToQuadraticAbs: |
115 CoalescingBuffer buffer(m_byteStream); | 113 buffer.writeFloatPoint(segment.point1); |
116 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegCurveToCubicSmo
othRel : PathSegCurveToCubicSmoothAbs); | 114 buffer.writeFloatPoint(segment.targetPoint); |
117 buffer.writeFloatPoint(point2); | 115 break; |
118 buffer.writeFloatPoint(targetPoint); | 116 case PathSegArcRel: |
119 } | 117 case PathSegArcAbs: |
120 | 118 buffer.writeFloatPoint(segment.point1); |
121 void SVGPathByteStreamBuilder::curveToQuadratic(const FloatPoint& point1, const
FloatPoint& targetPoint, PathCoordinateMode mode) | 119 buffer.writeFloat(segment.point2.x()); |
122 { | 120 buffer.writeFlag(segment.arcLarge); |
123 CoalescingBuffer buffer(m_byteStream); | 121 buffer.writeFlag(segment.arcSweep); |
124 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegCurveToQuadrati
cRel : PathSegCurveToQuadraticAbs); | 122 buffer.writeFloatPoint(segment.targetPoint); |
125 buffer.writeFloatPoint(point1); | 123 break; |
126 buffer.writeFloatPoint(targetPoint); | 124 default: |
127 } | 125 ASSERT_NOT_REACHED(); |
128 | 126 } |
129 void SVGPathByteStreamBuilder::curveToQuadraticSmooth(const FloatPoint& targetPo
int, PathCoordinateMode mode) | |
130 { | |
131 CoalescingBuffer buffer(m_byteStream); | |
132 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegCurveToQuadrati
cSmoothRel : PathSegCurveToQuadraticSmoothAbs); | |
133 buffer.writeFloatPoint(targetPoint); | |
134 } | |
135 | |
136 void SVGPathByteStreamBuilder::arcTo(float r1, float r2, float angle, bool large
ArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode) | |
137 { | |
138 CoalescingBuffer buffer(m_byteStream); | |
139 buffer.writeSegmentType(mode == RelativeCoordinates ? PathSegArcRel : PathSe
gArcAbs); | |
140 buffer.writeFloat(r1); | |
141 buffer.writeFloat(r2); | |
142 buffer.writeFloat(angle); | |
143 buffer.writeFlag(largeArcFlag); | |
144 buffer.writeFlag(sweepFlag); | |
145 buffer.writeFloatPoint(targetPoint); | |
146 } | |
147 | |
148 void SVGPathByteStreamBuilder::closePath() | |
149 { | |
150 CoalescingBuffer buffer(m_byteStream); | |
151 buffer.writeSegmentType(PathSegClosePath); | |
152 } | 127 } |
153 | 128 |
154 } // namespace blink | 129 } // namespace blink |
OLD | NEW |