Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: Source/WebCore/rendering/svg/SVGMarkerData.h

Issue 10447082: Merge 117971 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1132/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
(...skipping 11 matching lines...) Expand all
22 22
23 #if ENABLE(SVG) 23 #if ENABLE(SVG)
24 #include "FloatConversion.h" 24 #include "FloatConversion.h"
25 #include "Path.h" 25 #include "Path.h"
26 #include <wtf/MathExtras.h> 26 #include <wtf/MathExtras.h>
27 27
28 namespace WebCore { 28 namespace WebCore {
29 29
30 class RenderSVGResourceMarker; 30 class RenderSVGResourceMarker;
31 31
32 class SVGMarkerData { 32 enum SVGMarkerType {
33 public: 33 StartMarker,
34 enum Type { 34 MidMarker,
35 Unknown = 0, 35 EndMarker
36 Start, 36 };
37 Mid,
38 End
39 };
40 37
41 SVGMarkerData(const Type& type = Unknown, RenderSVGResourceMarker* marker = 0) 38 struct MarkerPosition {
42 : m_type(type) 39 MarkerPosition(SVGMarkerType useType, const FloatPoint& useOrigin, float use Angle)
43 , m_marker(marker) 40 : type(useType)
41 , origin(useOrigin)
42 , angle(useAngle)
44 { 43 {
45 } 44 }
46 45
47 FloatPoint origin() const { return m_origin; } 46 SVGMarkerType type;
48 RenderSVGResourceMarker* marker() const { return m_marker; } 47 FloatPoint origin;
48 float angle;
49 };
49 50
50 float currentAngle() const 51 class SVGMarkerData {
52 public:
53 SVGMarkerData(Vector<MarkerPosition>& positions)
54 : m_positions(positions)
55 , m_elementIndex(0)
56 {
57 }
58
59 static void updateFromPathElement(void* info, const PathElement* element)
60 {
61 SVGMarkerData* markerData = static_cast<SVGMarkerData*>(info);
62
63 // First update the outslope for the previous element.
64 markerData->updateOutslope(element->points[0]);
65
66 // Record the marker for the previous element.
67 if (markerData->m_elementIndex > 0) {
68 SVGMarkerType markerType = markerData->m_elementIndex == 1 ? StartMa rker : MidMarker;
69 markerData->m_positions.append(MarkerPosition(markerType, markerData ->m_origin, markerData->currentAngle(markerType)));
70 }
71
72 // Update our marker data for this element.
73 markerData->updateMarkerDataForPathElement(element);
74 ++markerData->m_elementIndex;
75 }
76
77 void pathIsDone()
78 {
79 m_positions.append(MarkerPosition(EndMarker, m_origin, currentAngle(EndM arker)));
80 }
81
82 private:
83 float currentAngle(SVGMarkerType type) const
51 { 84 {
52 FloatSize inslopeChange = m_inslopePoints[1] - m_inslopePoints[0]; 85 FloatSize inslopeChange = m_inslopePoints[1] - m_inslopePoints[0];
53 FloatSize outslopeChange = m_outslopePoints[1] - m_outslopePoints[0]; 86 FloatSize outslopeChange = m_outslopePoints[1] - m_outslopePoints[0];
54 87
55 double inslope = rad2deg(atan2(inslopeChange.height(), inslopeChange.wid th())); 88 double inslope = rad2deg(atan2(inslopeChange.height(), inslopeChange.wid th()));
56 double outslope = rad2deg(atan2(outslopeChange.height(), outslopeChange. width())); 89 double outslope = rad2deg(atan2(outslopeChange.height(), outslopeChange. width()));
57 90
58 double angle = 0; 91 switch (type) {
59 switch (m_type) { 92 case StartMarker:
60 case Start: 93 return narrowPrecisionToFloat(outslope);
61 angle = outslope; 94 case MidMarker:
62 break; 95 return narrowPrecisionToFloat((inslope + outslope) / 2);
63 case Mid: 96 case EndMarker:
64 angle = (inslope + outslope) / 2; 97 return narrowPrecisionToFloat(inslope);
65 break;
66 case End:
67 angle = inslope;
68 break;
69 default:
70 ASSERT_NOT_REACHED();
71 break;
72 } 98 }
73 99
74 return narrowPrecisionToFloat(angle); 100 ASSERT_NOT_REACHED();
75 } 101 return 0;
76
77 void updateTypeAndMarker(const Type& type, RenderSVGResourceMarker* marker)
78 {
79 m_type = type;
80 m_marker = marker;
81 } 102 }
82 103
83 void updateOutslope(const FloatPoint& point) 104 void updateOutslope(const FloatPoint& point)
84 { 105 {
85 m_outslopePoints[0] = m_origin; 106 m_outslopePoints[0] = m_origin;
86 m_outslopePoints[1] = point; 107 m_outslopePoints[1] = point;
87 } 108 }
88 109
89 void updateMarkerDataForPathElement(const PathElement* element) 110 void updateMarkerDataForPathElement(const PathElement* element)
90 { 111 {
(...skipping 15 matching lines...) Expand all
106 updateInslope(points[0]); 127 updateInslope(points[0]);
107 m_origin = points[0]; 128 m_origin = points[0];
108 break; 129 break;
109 case PathElementCloseSubpath: 130 case PathElementCloseSubpath:
110 updateInslope(points[0]); 131 updateInslope(points[0]);
111 m_origin = m_subpathStart; 132 m_origin = m_subpathStart;
112 m_subpathStart = FloatPoint(); 133 m_subpathStart = FloatPoint();
113 } 134 }
114 } 135 }
115 136
116 private:
117 void updateInslope(const FloatPoint& point) 137 void updateInslope(const FloatPoint& point)
118 { 138 {
119 m_inslopePoints[0] = m_origin; 139 m_inslopePoints[0] = m_origin;
120 m_inslopePoints[1] = point; 140 m_inslopePoints[1] = point;
121 } 141 }
122 142
123 Type m_type; 143 Vector<MarkerPosition>& m_positions;
124 RenderSVGResourceMarker* m_marker; 144 unsigned m_elementIndex;
125 FloatPoint m_origin; 145 FloatPoint m_origin;
126 FloatPoint m_subpathStart; 146 FloatPoint m_subpathStart;
127 FloatPoint m_inslopePoints[2]; 147 FloatPoint m_inslopePoints[2];
128 FloatPoint m_outslopePoints[2]; 148 FloatPoint m_outslopePoints[2];
129 }; 149 };
130 150
131 } 151 }
132 152
133 #endif // ENABLE(SVG) 153 #endif // ENABLE(SVG)
134 #endif // SVGMarkerData_h 154 #endif // SVGMarkerData_h
OLDNEW
« no previous file with comments | « Source/WebCore/rendering/svg/RenderSVGShape.cpp ('k') | Source/WebCore/rendering/svg/SVGMarkerLayoutInfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698