aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/svg
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2015-02-06 12:51:10 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-06 12:51:10 -0800
commit2aafe6f427f6d98aa4d173efc6195fe245add91d (patch)
treee54ed2c567cafcc6ca76b5d424d0b70eda00fece /experimental/svg
parent23e619cf462b2a8a500f3ca750e099f79601f508 (diff)
Add SkSVGCanvas
Add a public SVG canvas factory + move the SVG files from experimental -> src/svg/. Update current clients to the new API. R=reed@google.com, mtklein@google.com, halcanary@google.com Review URL: https://codereview.chromium.org/902583006
Diffstat (limited to 'experimental/svg')
-rw-r--r--experimental/svg/SkSVGDevice.cpp650
-rw-r--r--experimental/svg/SkSVGDevice.h74
-rw-r--r--experimental/svg/skp2svg.cpp70
3 files changed, 0 insertions, 794 deletions
diff --git a/experimental/svg/SkSVGDevice.cpp b/experimental/svg/SkSVGDevice.cpp
deleted file mode 100644
index 8d4ee4c05a..0000000000
--- a/experimental/svg/SkSVGDevice.cpp
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkSVGDevice.h"
-
-#include "SkBitmap.h"
-#include "SkDraw.h"
-#include "SkPaint.h"
-#include "SkParsePath.h"
-#include "SkPathOps.h"
-#include "SkShader.h"
-#include "SkStream.h"
-#include "SkTypeface.h"
-#include "SkUtils.h"
-#include "SkXMLWriter.h"
-
-namespace {
-
-static SkString svg_color(SkColor color) {
- return SkStringPrintf("rgb(%u,%u,%u)",
- SkColorGetR(color),
- SkColorGetG(color),
- SkColorGetB(color));
-}
-
-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];
-}
-
-// Keep in sync with SkPaint::Align
-static const char* text_align_map[] = {
- NULL, // kLeft_Align (default)
- "middle", // kCenter_Align
- "end" // kRight_Align
-};
-SK_COMPILE_ASSERT(SK_ARRAY_COUNT(text_align_map) == SkPaint::kAlignCount,
- missing_text_align_map_entry);
-static const char* svg_text_align(SkPaint::Align align) {
- SkASSERT(align < SK_ARRAY_COUNT(text_align_map));
- return text_align_map[align];
-}
-
-static SkString svg_transform(const SkMatrix& t) {
- SkASSERT(!t.isIdentity());
-
- SkString tstr;
- switch (t.getType()) {
- case SkMatrix::kPerspective_Mask:
- SkDebugf("Can't handle perspective matrices.");
- break;
- case SkMatrix::kTranslate_Mask:
- tstr.printf("translate(%g %g)", t.getTranslateX(), t.getTranslateY());
- break;
- case SkMatrix::kScale_Mask:
- tstr.printf("scale(%g %g)", t.getScaleX(), t.getScaleY());
- break;
- default:
- // http://www.w3.org/TR/SVG/coords.html#TransformMatrixDefined
- // | a c e |
- // | b d f |
- // | 0 0 1 |
- tstr.printf("matrix(%g %g %g %g %g %g)",
- t.getScaleX(), t.getSkewY(),
- t.getSkewX(), t.getScaleY(),
- t.getTranslateX(), t.getTranslateY());
- break;
- }
-
- return tstr;
-}
-
-static void append_escaped_unichar(SkUnichar c, SkString* text) {
- switch(c) {
- case '&':
- text->append("&amp;");
- break;
- case '"':
- text->append("&quot;");
- break;
- case '\'':
- text->append("&apos;");
- break;
- case '<':
- text->append("&lt;");
- break;
- case '>':
- text->append("&gt;");
- break;
- default:
- text->appendUnichar(c);
- break;
- }
-}
-
-static SkString svg_text(const void* text, size_t byteLen, const SkPaint& paint) {
- SkString svgText;
- int count = paint.countText(text, byteLen);
-
- switch(paint.getTextEncoding()) {
- case SkPaint::kGlyphID_TextEncoding: {
- SkASSERT(count * sizeof(uint16_t) == byteLen);
- SkAutoSTArray<64, SkUnichar> unichars(count);
- paint.glyphsToUnichars((const uint16_t*)text, count, unichars.get());
- for (int i = 0; i < count; ++i) {
- append_escaped_unichar(unichars[i], &svgText);
- }
- } break;
- case SkPaint::kUTF8_TextEncoding: {
- const char* c8 = reinterpret_cast<const char*>(text);
- for (int i = 0; i < count; ++i) {
- append_escaped_unichar(SkUTF8_NextUnichar(&c8), &svgText);
- }
- SkASSERT(reinterpret_cast<const char*>(text) + byteLen == c8);
- } break;
- case SkPaint::kUTF16_TextEncoding: {
- const uint16_t* c16 = reinterpret_cast<const uint16_t*>(text);
- for (int i = 0; i < count; ++i) {
- append_escaped_unichar(SkUTF16_NextUnichar(&c16), &svgText);
- }
- SkASSERT(SkIsAlign2(byteLen));
- SkASSERT(reinterpret_cast<const uint16_t*>(text) + (byteLen / 2) == c16);
- } break;
- case SkPaint::kUTF32_TextEncoding: {
- SkASSERT(count * sizeof(uint32_t) == byteLen);
- const uint32_t* c32 = reinterpret_cast<const uint32_t*>(text);
- for (int i = 0; i < count; ++i) {
- append_escaped_unichar(c32[i], &svgText);
- }
- } break;
- default:
- SkFAIL("unknown text encoding");
- }
-
- return svgText;
-}
-
-struct Resources {
- Resources(const SkPaint& paint)
- : fPaintServer(svg_color(paint.getColor())) {}
-
- SkString fPaintServer;
- SkString fClip;
-};
-
-}
-
-// For now all this does is serve unique serial IDs, but it will eventually evolve to track
-// and deduplicate resources.
-class SkSVGDevice::ResourceBucket : ::SkNoncopyable {
-public:
- ResourceBucket() : fGradientCount(0), fClipCount(0), fPathCount(0) {}
-
- SkString addLinearGradient() {
- return SkStringPrintf("gradient_%d", fGradientCount++);
- }
-
- SkString addClip() {
- return SkStringPrintf("clip_%d", fClipCount++);
- }
-
- SkString addPath() {
- return SkStringPrintf("path_%d", fPathCount++);
- }
-
-private:
- uint32_t fGradientCount;
- uint32_t fClipCount;
- uint32_t fPathCount;
-};
-
-class SkSVGDevice::AutoElement : ::SkNoncopyable {
-public:
- AutoElement(const char name[], SkXMLWriter* writer)
- : fWriter(writer)
- , fResourceBucket(NULL) {
- fWriter->startElement(name);
- }
-
- AutoElement(const char name[], SkXMLWriter* writer, ResourceBucket* bucket,
- const SkDraw& draw, const SkPaint& paint)
- : fWriter(writer)
- , fResourceBucket(bucket) {
-
- Resources res = this->addResources(draw, paint);
-
- fWriter->startElement(name);
-
- this->addPaint(paint, res);
-
- if (!draw.fMatrix->isIdentity()) {
- this->addAttribute("transform", svg_transform(*draw.fMatrix));
- }
- }
-
- ~AutoElement() {
- fWriter->endElement();
- }
-
- void addAttribute(const char name[], const char val[]) {
- fWriter->addAttribute(name, val);
- }
-
- void addAttribute(const char name[], const SkString& val) {
- fWriter->addAttribute(name, val.c_str());
- }
-
- void addAttribute(const char name[], int32_t val) {
- fWriter->addS32Attribute(name, val);
- }
-
- void addAttribute(const char name[], SkScalar val) {
- fWriter->addScalarAttribute(name, val);
- }
-
- void addText(const SkString& text) {
- fWriter->addText(text.c_str(), text.size());
- }
-
- void addRectAttributes(const SkRect&);
- void addPathAttributes(const SkPath&);
- void addTextAttributes(const SkPaint&);
-
-private:
- Resources addResources(const SkDraw& draw, const SkPaint& paint);
- void addClipResources(const SkDraw& draw, Resources* resources);
- void addShaderResources(const SkPaint& paint, Resources* resources);
-
- void addPaint(const SkPaint& paint, const Resources& resources);
-
- SkString addLinearGradientDef(const SkShader::GradientInfo& info, const SkShader* shader);
-
- SkXMLWriter* fWriter;
- ResourceBucket* fResourceBucket;
-};
-
-void SkSVGDevice::AutoElement::addPaint(const SkPaint& paint, const Resources& resources) {
- 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);
-
- 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 (!resources.fClip.isEmpty()) {
- this->addAttribute("clip-path", resources.fClip);
- }
-}
-
-Resources SkSVGDevice::AutoElement::addResources(const SkDraw& draw, const SkPaint& paint) {
- Resources resources(paint);
-
- // FIXME: this is a weak heuristic and we end up with LOTS of redundant clips.
- bool hasClip = !draw.fClipStack->isWideOpen();
- bool hasShader = SkToBool(paint.getShader());
-
- if (hasClip || hasShader) {
- AutoElement defs("defs", fWriter);
-
- if (hasClip) {
- this->addClipResources(draw, &resources);
- }
-
- if (hasShader) {
- this->addShaderResources(paint, &resources);
- }
- }
-
- return resources;
-}
-
-void SkSVGDevice::AutoElement::addShaderResources(const SkPaint& paint, Resources* resources) {
- const SkShader* shader = paint.getShader();
- SkASSERT(SkToBool(shader));
-
- SkShader::GradientInfo grInfo;
- grInfo.fColorCount = 0;
- if (SkShader::kLinear_GradientType != shader->asAGradient(&grInfo)) {
- // TODO: non-linear gradient support
- SkDebugf("unsupported shader type\n");
- return;
- }
-
- SkAutoSTArray<16, SkColor> grColors(grInfo.fColorCount);
- SkAutoSTArray<16, SkScalar> grOffsets(grInfo.fColorCount);
- grInfo.fColors = grColors.get();
- grInfo.fColorOffsets = grOffsets.get();
-
- // One more call to get the actual colors/offsets.
- shader->asAGradient(&grInfo);
- SkASSERT(grInfo.fColorCount <= grColors.count());
- SkASSERT(grInfo.fColorCount <= grOffsets.count());
-
- resources->fPaintServer.printf("url(#%s)", addLinearGradientDef(grInfo, shader).c_str());
-}
-
-void SkSVGDevice::AutoElement::addClipResources(const SkDraw& draw, Resources* resources) {
- SkASSERT(!draw.fClipStack->isWideOpen());
-
- SkPath clipPath;
- (void) draw.fClipStack->asPath(&clipPath);
-
- SkString clipID = fResourceBucket->addClip();
- const char* clipRule = clipPath.getFillType() == SkPath::kEvenOdd_FillType ?
- "evenodd" : "nonzero";
- {
- // clipPath is in device space, but since we're only pushing transform attributes
- // to the leaf nodes, so are all our elements => SVG userSpaceOnUse == device space.
- AutoElement clipPathElement("clipPath", fWriter);
- clipPathElement.addAttribute("id", clipID);
-
- SkRect clipRect = SkRect::MakeEmpty();
- if (clipPath.isEmpty() || clipPath.isRect(&clipRect)) {
- AutoElement rectElement("rect", fWriter);
- rectElement.addRectAttributes(clipRect);
- rectElement.addAttribute("clip-rule", clipRule);
- } else {
- AutoElement pathElement("path", fWriter);
- pathElement.addPathAttributes(clipPath);
- pathElement.addAttribute("clip-rule", clipRule);
- }
- }
-
- resources->fClip.printf("url(#%s)", clipID.c_str());
-}
-
-SkString SkSVGDevice::AutoElement::addLinearGradientDef(const SkShader::GradientInfo& info,
- const SkShader* shader) {
- SkASSERT(fResourceBucket);
- SkString id = fResourceBucket->addLinearGradient();
-
- {
- AutoElement gradient("linearGradient", fWriter);
-
- gradient.addAttribute("id", id);
- gradient.addAttribute("gradientUnits", "userSpaceOnUse");
- gradient.addAttribute("x1", info.fPoint[0].x());
- gradient.addAttribute("y1", info.fPoint[0].y());
- gradient.addAttribute("x2", info.fPoint[1].x());
- gradient.addAttribute("y2", info.fPoint[1].y());
-
- if (!shader->getLocalMatrix().isIdentity()) {
- this->addAttribute("gradientTransform", svg_transform(shader->getLocalMatrix()));
- }
-
- SkASSERT(info.fColorCount >= 2);
- for (int i = 0; i < info.fColorCount; ++i) {
- SkColor color = info.fColors[i];
- SkString colorStr(svg_color(color));
-
- {
- AutoElement stop("stop", fWriter);
- stop.addAttribute("offset", info.fColorOffsets[i]);
- stop.addAttribute("stop-color", colorStr.c_str());
-
- if (SK_AlphaOPAQUE != SkColorGetA(color)) {
- stop.addAttribute("stop-opacity", svg_opacity(color));
- }
- }
- }
- }
-
- return id;
-}
-
-void SkSVGDevice::AutoElement::addRectAttributes(const SkRect& rect) {
- // x, y default to 0
- if (rect.x() != 0) {
- this->addAttribute("x", rect.x());
- }
- if (rect.y() != 0) {
- this->addAttribute("y", rect.y());
- }
-
- this->addAttribute("width", rect.width());
- this->addAttribute("height", rect.height());
-}
-
-void SkSVGDevice::AutoElement::addPathAttributes(const SkPath& path) {
- SkString pathData;
- SkParsePath::ToSVGString(path, &pathData);
- this->addAttribute("d", pathData);
-}
-
-void SkSVGDevice::AutoElement::addTextAttributes(const SkPaint& paint) {
- this->addAttribute("font-size", paint.getTextSize());
-
- SkTypeface::Style style = paint.getTypeface()->style();
- if (style & SkTypeface::kItalic) {
- this->addAttribute("font-style", "italic");
- }
- if (style & SkTypeface::kBold) {
- this->addAttribute("font-weight", "bold");
- }
-
- SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ?
- SkRef(paint.getTypeface()) : SkTypeface::RefDefault(style));
- SkString familyName;
- tface->getFamilyName(&familyName);
- if (!familyName.isEmpty()) {
- this->addAttribute("font-family", familyName);
- }
-
- if (const char* textAlign = svg_text_align(paint.getTextAlign())) {
- this->addAttribute("text-anchor", textAlign);
- }
-}
-
-SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkWStream* wstream) {
- if (!SkToBool(wstream)) {
- return NULL;
- }
-
- return SkNEW_ARGS(SkSVGDevice, (size, wstream));
-}
-
-SkSVGDevice::SkSVGDevice(const SkISize& size, SkWStream* wstream)
- : fWriter(SkNEW_ARGS(SkXMLStreamWriter, (wstream)))
- , fResourceBucket(SkNEW(ResourceBucket)) {
-
- fLegacyBitmap.setInfo(SkImageInfo::MakeUnknown(size.width(), size.height()));
-
- fWriter->writeHeader();
-
- // The root <svg> tag gets closed by the destructor.
- fRootElement.reset(SkNEW_ARGS(AutoElement, ("svg", fWriter)));
-
- fRootElement->addAttribute("xmlns", "http://www.w3.org/2000/svg");
- fRootElement->addAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
- fRootElement->addAttribute("width", size.width());
- fRootElement->addAttribute("height", size.height());
-}
-
-SkSVGDevice::~SkSVGDevice() {
-}
-
-SkImageInfo SkSVGDevice::imageInfo() const {
- return fLegacyBitmap.info();
-}
-
-const SkBitmap& SkSVGDevice::onAccessBitmap() {
- return fLegacyBitmap;
-}
-
-void SkSVGDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) {
- AutoElement rect("rect", fWriter, fResourceBucket, draw, paint);
- rect.addRectAttributes(SkRect::MakeWH(SkIntToScalar(this->width()),
- SkIntToScalar(this->height())));
-}
-
-void SkSVGDevice::drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
- const SkPoint[], const SkPaint& paint) {
- // todo
- SkDebugf("unsupported operation: drawPoints()\n");
-}
-
-void SkSVGDevice::drawRect(const SkDraw& draw, const SkRect& r, const SkPaint& paint) {
- AutoElement rect("rect", fWriter, fResourceBucket, draw, paint);
- rect.addRectAttributes(r);
-}
-
-void SkSVGDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint& paint) {
- AutoElement ellipse("ellipse", fWriter, fResourceBucket, draw, paint);
- ellipse.addAttribute("cx", oval.centerX());
- ellipse.addAttribute("cy", oval.centerY());
- ellipse.addAttribute("rx", oval.width() / 2);
- ellipse.addAttribute("ry", oval.height() / 2);
-}
-
-void SkSVGDevice::drawRRect(const SkDraw&, const SkRRect& rr, const SkPaint& paint) {
- // todo
- SkDebugf("unsupported operation: drawRRect()\n");
-}
-
-void SkSVGDevice::drawPath(const SkDraw& draw, const SkPath& path, const SkPaint& paint,
- const SkMatrix* prePathMatrix, bool pathIsMutable) {
- AutoElement elem("path", fWriter, fResourceBucket, draw, paint);
- elem.addPathAttributes(path);
-}
-
-void SkSVGDevice::drawBitmap(const SkDraw&, const SkBitmap& bitmap,
- const SkMatrix& matrix, const SkPaint& paint) {
- // todo
- SkDebugf("unsupported operation: drawBitmap()\n");
-}
-
-void SkSVGDevice::drawSprite(const SkDraw&, const SkBitmap& bitmap,
- int x, int y, const SkPaint& paint) {
- // todo
- SkDebugf("unsupported operation: drawSprite()\n");
-}
-
-void SkSVGDevice::drawBitmapRect(const SkDraw&, const SkBitmap&, const SkRect* srcOrNull,
- const SkRect& dst, const SkPaint& paint,
- SkCanvas::DrawBitmapRectFlags flags) {
- // todo
- SkDebugf("unsupported operation: drawBitmapRect()\n");
-}
-
-void SkSVGDevice::drawText(const SkDraw& draw, const void* text, size_t len,
- SkScalar x, SkScalar y, const SkPaint& paint) {
- AutoElement elem("text", fWriter, fResourceBucket, draw, paint);
- elem.addTextAttributes(paint);
- elem.addAttribute("x", x);
- elem.addAttribute("y", y);
- elem.addText(svg_text(text, len, paint));
-}
-
-void SkSVGDevice::drawPosText(const SkDraw& draw, const void* text, size_t len,
- const SkScalar pos[], int scalarsPerPos, const SkPoint& offset,
- const SkPaint& paint) {
- SkASSERT(scalarsPerPos == 1 || scalarsPerPos == 2);
-
- AutoElement elem("text", fWriter, fResourceBucket, draw, paint);
- elem.addTextAttributes(paint);
-
- SkString xStr;
- SkString yStr;
- for (int i = 0; i < paint.countText(text, len); ++i) {
- xStr.appendf("%.8g, ", offset.x() + pos[i * scalarsPerPos]);
-
- if (scalarsPerPos == 2) {
- yStr.appendf("%.8g, ", offset.y() + pos[i * scalarsPerPos + 1]);
- }
- }
-
- if (scalarsPerPos != 2) {
- yStr.appendScalar(offset.y());
- }
-
- elem.addAttribute("x", xStr);
- elem.addAttribute("y", yStr);
- elem.addText(svg_text(text, len, paint));
-}
-
-void SkSVGDevice::drawTextOnPath(const SkDraw&, const void* text, size_t len, const SkPath& path,
- const SkMatrix* matrix, const SkPaint& paint) {
- SkString pathID = fResourceBucket->addPath();
-
- {
- AutoElement defs("defs", fWriter);
- AutoElement pathElement("path", fWriter);
- pathElement.addAttribute("id", pathID);
- pathElement.addPathAttributes(path);
-
- }
-
- {
- AutoElement textElement("text", fWriter);
- textElement.addTextAttributes(paint);
-
- if (matrix && !matrix->isIdentity()) {
- textElement.addAttribute("transform", svg_transform(*matrix));
- }
-
- {
- AutoElement textPathElement("textPath", fWriter);
- textPathElement.addAttribute("xlink:href", SkStringPrintf("#%s", pathID.c_str()));
-
- if (paint.getTextAlign() != SkPaint::kLeft_Align) {
- SkASSERT(paint.getTextAlign() == SkPaint::kCenter_Align ||
- paint.getTextAlign() == SkPaint::kRight_Align);
- textPathElement.addAttribute("startOffset",
- paint.getTextAlign() == SkPaint::kCenter_Align ? "50%" : "100%");
- }
-
- textPathElement.addText(svg_text(text, len, paint));
- }
- }
-}
-
-void SkSVGDevice::drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
- const SkPoint verts[], const SkPoint texs[],
- const SkColor colors[], SkXfermode* xmode,
- const uint16_t indices[], int indexCount,
- const SkPaint& paint) {
- // todo
- SkDebugf("unsupported operation: drawVertices()\n");
-}
-
-void SkSVGDevice::drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
- const SkPaint&) {
- // todo
- SkDebugf("unsupported operation: drawDevice()\n");
-}
diff --git a/experimental/svg/SkSVGDevice.h b/experimental/svg/SkSVGDevice.h
deleted file mode 100644
index 0ea9e19bfc..0000000000
--- a/experimental/svg/SkSVGDevice.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkSVGDevice_DEFINED
-#define SkSVGDevice_DEFINED
-
-#include "SkDevice.h"
-
-class SkWStream;
-class SkXMLWriter;
-
-class SkSVGDevice : public SkBaseDevice {
-public:
- static SkBaseDevice* Create(const SkISize& size, SkWStream* wstream);
-
- virtual SkImageInfo imageInfo() const SK_OVERRIDE;
-
-protected:
- virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
- const SkPoint[], const SkPaint& paint) SK_OVERRIDE;
- virtual void drawRect(const SkDraw&, const SkRect& r, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawOval(const SkDraw&, const SkRect& oval, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawRRect(const SkDraw&, const SkRRect& rr, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawPath(const SkDraw&, const SkPath& path,
- const SkPaint& paint,
- const SkMatrix* prePathMatrix = NULL,
- bool pathIsMutable = false) SK_OVERRIDE;
-
- virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
- const SkMatrix& matrix, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
- int x, int y, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawBitmapRect(const SkDraw&, const SkBitmap&,
- const SkRect* srcOrNull, const SkRect& dst,
- const SkPaint& paint,
- SkCanvas::DrawBitmapRectFlags flags) SK_OVERRIDE;
-
- virtual void drawText(const SkDraw&, const void* text, size_t len,
- SkScalar x, SkScalar y, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawPosText(const SkDraw&, const void* text, size_t len,
- const SkScalar pos[], int scalarsPerPos,
- const SkPoint& offset, const SkPaint& paint) SK_OVERRIDE;
- virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
- const SkPath& path, const SkMatrix* matrix,
- const SkPaint& paint) SK_OVERRIDE;
- virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
- const SkPoint verts[], const SkPoint texs[],
- const SkColor colors[], SkXfermode* xmode,
- const uint16_t indices[], int indexCount,
- const SkPaint& paint) SK_OVERRIDE;
-
- virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
- const SkPaint&) SK_OVERRIDE;
- virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE;
-
-private:
- SkSVGDevice(const SkISize& size, SkWStream* wstream);
- virtual ~SkSVGDevice();
-
- class AutoElement;
- class ResourceBucket;
-
- SkAutoTDelete<SkXMLWriter> fWriter;
- SkAutoTDelete<AutoElement> fRootElement;
- SkAutoTDelete<ResourceBucket> fResourceBucket;
- SkBitmap fLegacyBitmap;
-};
-
-#endif // SkSVGDevice_DEFINED
diff --git a/experimental/svg/skp2svg.cpp b/experimental/svg/skp2svg.cpp
deleted file mode 100644
index 95bb04a061..0000000000
--- a/experimental/svg/skp2svg.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "LazyDecodeBitmap.h"
-#include "SkCommandLineFlags.h"
-#include "SkPicture.h"
-#include "SkStream.h"
-#include "SkSVGDevice.h"
-
-DEFINE_string2(input, i, "", "input skp file");
-DEFINE_string2(output, o, "", "output svg file (optional)");
-
-// return codes:
-static const int kSuccess = 0;
-static const int kInvalidArgs = 1;
-static const int kIOError = 2;
-static const int kNotAnSKP = 3;
-
-int tool_main(int argc, char** argv);
-int tool_main(int argc, char** argv) {
- SkCommandLineFlags::SetUsage("Converts an SKP file to SVG.");
- SkCommandLineFlags::Parse(argc, argv);
-
- if (FLAGS_input.count() != 1) {
- SkDebugf("Missing input file\n");
- return kInvalidArgs;
- }
-
- SkFILEStream stream(FLAGS_input[0]);
- if (!stream.isValid()) {
- SkDebugf("Couldn't open file: %s\n", FLAGS_input[0]);
- return kIOError;
- }
-
- SkAutoTUnref<SkPicture> pic(SkPicture::CreateFromStream(&stream, &sk_tools::LazyDecodeBitmap));
- if (!SkToBool(pic.get())) {
- SkDebugf("Could not load SKP: %s\n", FLAGS_input[0]);
- return kNotAnSKP;
- }
-
- SkAutoTDelete<SkWStream> outStream;
- if (FLAGS_output.count() > 0) {
- SkFILEWStream* fileStream = SkNEW_ARGS(SkFILEWStream, (FLAGS_output[0]));
- if (!fileStream->isValid()) {
- SkDebugf("Couldn't open output file for writing: %s\n", FLAGS_output[0]);
- return kIOError;
- }
- outStream.reset(fileStream);
- } else {
- outStream.reset(SkNEW(SkDebugWStream));
- }
-
- SkISize size = pic->cullRect().roundOut().size();
- SkAutoTUnref<SkBaseDevice> svgDevice(SkSVGDevice::Create(size, outStream));
- SkCanvas svgCanvas(svgDevice.get());
-
- pic->playback(&svgCanvas);
-
- return kSuccess;
-}
-
-#if !defined SK_BUILD_FOR_IOS
-int main(int argc, char * const argv[]) {
- return tool_main(argc, (char**) argv);
-}
-#endif