Index: Source/WebCore/rendering/svg/SVGMarkerData.h |
=================================================================== |
--- Source/WebCore/rendering/svg/SVGMarkerData.h (revision 118879) |
+++ Source/WebCore/rendering/svg/SVGMarkerData.h (working copy) |
@@ -29,25 +29,58 @@ |
class RenderSVGResourceMarker; |
+enum SVGMarkerType { |
+ StartMarker, |
+ MidMarker, |
+ EndMarker |
+}; |
+ |
+struct MarkerPosition { |
+ MarkerPosition(SVGMarkerType useType, const FloatPoint& useOrigin, float useAngle) |
+ : type(useType) |
+ , origin(useOrigin) |
+ , angle(useAngle) |
+ { |
+ } |
+ |
+ SVGMarkerType type; |
+ FloatPoint origin; |
+ float angle; |
+}; |
+ |
class SVGMarkerData { |
public: |
- enum Type { |
- Unknown = 0, |
- Start, |
- Mid, |
- End |
- }; |
+ SVGMarkerData(Vector<MarkerPosition>& positions) |
+ : m_positions(positions) |
+ , m_elementIndex(0) |
+ { |
+ } |
- SVGMarkerData(const Type& type = Unknown, RenderSVGResourceMarker* marker = 0) |
- : m_type(type) |
- , m_marker(marker) |
+ static void updateFromPathElement(void* info, const PathElement* element) |
{ |
+ SVGMarkerData* markerData = static_cast<SVGMarkerData*>(info); |
+ |
+ // First update the outslope for the previous element. |
+ markerData->updateOutslope(element->points[0]); |
+ |
+ // Record the marker for the previous element. |
+ if (markerData->m_elementIndex > 0) { |
+ SVGMarkerType markerType = markerData->m_elementIndex == 1 ? StartMarker : MidMarker; |
+ markerData->m_positions.append(MarkerPosition(markerType, markerData->m_origin, markerData->currentAngle(markerType))); |
+ } |
+ |
+ // Update our marker data for this element. |
+ markerData->updateMarkerDataForPathElement(element); |
+ ++markerData->m_elementIndex; |
} |
- FloatPoint origin() const { return m_origin; } |
- RenderSVGResourceMarker* marker() const { return m_marker; } |
+ void pathIsDone() |
+ { |
+ m_positions.append(MarkerPosition(EndMarker, m_origin, currentAngle(EndMarker))); |
+ } |
- float currentAngle() const |
+private: |
+ float currentAngle(SVGMarkerType type) const |
{ |
FloatSize inslopeChange = m_inslopePoints[1] - m_inslopePoints[0]; |
FloatSize outslopeChange = m_outslopePoints[1] - m_outslopePoints[0]; |
@@ -55,31 +88,19 @@ |
double inslope = rad2deg(atan2(inslopeChange.height(), inslopeChange.width())); |
double outslope = rad2deg(atan2(outslopeChange.height(), outslopeChange.width())); |
- double angle = 0; |
- switch (m_type) { |
- case Start: |
- angle = outslope; |
- break; |
- case Mid: |
- angle = (inslope + outslope) / 2; |
- break; |
- case End: |
- angle = inslope; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- break; |
+ switch (type) { |
+ case StartMarker: |
+ return narrowPrecisionToFloat(outslope); |
+ case MidMarker: |
+ return narrowPrecisionToFloat((inslope + outslope) / 2); |
+ case EndMarker: |
+ return narrowPrecisionToFloat(inslope); |
} |
- return narrowPrecisionToFloat(angle); |
+ ASSERT_NOT_REACHED(); |
+ return 0; |
} |
- void updateTypeAndMarker(const Type& type, RenderSVGResourceMarker* marker) |
- { |
- m_type = type; |
- m_marker = marker; |
- } |
- |
void updateOutslope(const FloatPoint& point) |
{ |
m_outslopePoints[0] = m_origin; |
@@ -113,15 +134,14 @@ |
} |
} |
-private: |
void updateInslope(const FloatPoint& point) |
{ |
m_inslopePoints[0] = m_origin; |
m_inslopePoints[1] = point; |
} |
- Type m_type; |
- RenderSVGResourceMarker* m_marker; |
+ Vector<MarkerPosition>& m_positions; |
+ unsigned m_elementIndex; |
FloatPoint m_origin; |
FloatPoint m_subpathStart; |
FloatPoint m_inslopePoints[2]; |