Index: third_party/WebKit/Source/platform/graphics/StrokeData.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp |
index 2bd0a5125d18eda885b0a3f79c30992e1695de26..cbdb47b677f27bed5c95c4cb058e56f8c8842681 100644 |
--- a/third_party/WebKit/Source/platform/graphics/StrokeData.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/StrokeData.cpp |
@@ -70,7 +70,7 @@ void StrokeData::setupPaint(PaintFlags* flags, int length) const { |
void StrokeData::setupPaintDashPathEffect(PaintFlags* flags, int length) const { |
if (m_dash) { |
flags->setPathEffect(m_dash); |
- } else if (m_style == DashedStroke || m_style == DottedStroke) { |
+ } else if (strokeIsDashed(m_thickness, m_style)) { |
float width = |
m_style == DashedStroke ? dashRatio * m_thickness : m_thickness; |
@@ -96,10 +96,39 @@ void StrokeData::setupPaintDashPathEffect(PaintFlags* flags, int length) const { |
SkScalar intervals[2] = {dashLengthSk, dashLengthSk}; |
flags->setPathEffect( |
SkDashPathEffect::Make(intervals, 2, SkIntToScalar(phase))); |
+ } else if (m_style == DottedStroke) { |
+ flags->setStrokeCap((PaintFlags::Cap)RoundCap); |
+ // Adjust the width to get equal dot spacing as much as possible. |
+ float perDotLength = m_thickness * 2; |
+ static float epsilon = 1.0e-2f; |
+ if (length < perDotLength + m_thickness) { |
+ // Exactly 2 dots with whatever space we can get |
+ SkScalar intervals[2] = {0, length - m_thickness - epsilon}; |
+ flags->setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); |
+ return; |
+ } |
+ |
+ // Determine what number of dots gives the minimum deviation from |
+ // idealGap between dots. Set the gap to that width. |
+ float minNumDots = floorf((length + m_thickness) / perDotLength); |
+ float maxNumDots = minNumDots + 1; |
+ float minGap = (length - minNumDots * m_thickness) / (minNumDots - 1); |
+ float maxGap = (length - maxNumDots * m_thickness) / (maxNumDots - 1); |
+ if (fabs(minGap - m_thickness) < fabs(maxGap - m_thickness)) { |
+ SkScalar intervals[2] = {0, minGap + m_thickness - epsilon}; |
+ flags->setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); |
+ } else { |
+ SkScalar intervals[2] = {0, maxGap + m_thickness - epsilon}; |
+ flags->setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); |
+ } |
} else { |
- // TODO(schenney): WavyStroke: https://crbug.com/229574 |
+ // TODO(schenney): WavyStroke https://crbug.com/229574 |
flags->setPathEffect(0); |
} |
} |
+bool StrokeData::strokeIsDashed(float width, StrokeStyle style) { |
+ return style == DashedStroke || (style == DottedStroke && width <= 3); |
+} |
+ |
} // namespace blink |