Index: experimental/svg/SkSVGDevice.cpp |
diff --git a/experimental/svg/SkSVGDevice.cpp b/experimental/svg/SkSVGDevice.cpp |
index 9f4a54a8a8b5f4821be7467548d86de008654f27..91ff31364dd610b6f07532ce9ba0bc4b63b61821 100644 |
--- a/experimental/svg/SkSVGDevice.cpp |
+++ b/experimental/svg/SkSVGDevice.cpp |
@@ -31,6 +31,32 @@ static SkScalar svg_opacity(SkColor color) { |
return SkIntToScalar(SkColorGetA(color)) / SK_AlphaOPAQUE; |
} |
+// Keep in sync with SkPaint::Cap |
+static const char* cap_map[] = { |
+ NULL, // kButt_Cap (default) |
+ "round", // kRound_Cap |
+ "square" // kSquare_Cap |
+}; |
+SK_COMPILE_ASSERT(SK_ARRAY_COUNT(cap_map) == SkPaint::kCapCount, missing_cap_map_entry); |
+ |
+static const char* svg_cap(SkPaint::Cap cap) { |
+ SkASSERT(cap < SK_ARRAY_COUNT(cap_map)); |
+ return cap_map[cap]; |
+} |
+ |
+// Keep in sync with SkPaint::Join |
+static const char* join_map[] = { |
+ NULL, // kMiter_Join (default) |
+ "round", // kRound_Join |
+ "bevel" // kBevel_Join |
+}; |
+SK_COMPILE_ASSERT(SK_ARRAY_COUNT(join_map) == SkPaint::kJoinCount, missing_join_map_entry); |
+ |
+static const char* svg_join(SkPaint::Join join) { |
+ SkASSERT(join < SK_ARRAY_COUNT(join_map)); |
+ return join_map[join]; |
+} |
+ |
static void append_escaped_unichar(SkUnichar c, SkString* text) { |
switch(c) { |
case '&': |
@@ -191,21 +217,46 @@ void SkSVGDevice::AutoElement::addPaint(const SkPaint& paint, const Resources& r |
SkPaint::Style style = paint.getStyle(); |
if (style == SkPaint::kFill_Style || style == SkPaint::kStrokeAndFill_Style) { |
this->addAttribute("fill", resources.fPaintServer); |
+ |
+ if (SK_AlphaOPAQUE != SkColorGetA(paint.getColor())) { |
+ this->addAttribute("fill-opacity", svg_opacity(paint.getColor())); |
+ } |
} else { |
+ SkASSERT(style == SkPaint::kStroke_Style); |
this->addAttribute("fill", "none"); |
} |
if (style == SkPaint::kStroke_Style || style == SkPaint::kStrokeAndFill_Style) { |
this->addAttribute("stroke", resources.fPaintServer); |
- this->addAttribute("stroke-width", paint.getStrokeWidth()); |
+ |
+ SkScalar strokeWidth = paint.getStrokeWidth(); |
+ if (strokeWidth == 0) { |
+ // Hairline stroke |
+ strokeWidth = 1; |
+ this->addAttribute("vector-effect", "non-scaling-stroke"); |
+ } |
+ this->addAttribute("stroke-width", strokeWidth); |
+ |
+ if (const char* cap = svg_cap(paint.getStrokeCap())) { |
+ this->addAttribute("stroke-linecap", cap); |
+ } |
+ |
+ if (const char* join = svg_join(paint.getStrokeJoin())) { |
+ this->addAttribute("stroke-linejoin", join); |
+ } |
+ |
+ if (paint.getStrokeJoin() == SkPaint::kMiter_Join) { |
+ this->addAttribute("stroke-miterlimit", paint.getStrokeMiter()); |
+ } |
+ |
+ if (SK_AlphaOPAQUE != SkColorGetA(paint.getColor())) { |
+ this->addAttribute("stroke-opacity", svg_opacity(paint.getColor())); |
+ } |
} else { |
+ SkASSERT(style == SkPaint::kFill_Style); |
this->addAttribute("stroke", "none"); |
} |
- if (SK_AlphaOPAQUE != SkColorGetA(paint.getColor())) { |
- this->addAttribute("opacity", svg_opacity(paint.getColor())); |
- } |
- |
if (!resources.fClip.isEmpty()) { |
this->addAttribute("clip-path", resources.fClip); |
} |