aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DMSrcSink.cpp11
-rw-r--r--gyp/dm.gypi3
-rw-r--r--gyp/svg.gyp25
-rw-r--r--gyp/tools.gyp6
-rw-r--r--include/svg/SkSVGCanvas.h31
-rw-r--r--src/svg/SkSVGCanvas.cpp17
-rw-r--r--src/svg/SkSVGDevice.cpp (renamed from experimental/svg/SkSVGDevice.cpp)11
-rw-r--r--src/svg/SkSVGDevice.h (renamed from experimental/svg/SkSVGDevice.h)7
-rw-r--r--src/svg/skp2svg.cpp (renamed from experimental/svg/skp2svg.cpp)10
9 files changed, 98 insertions, 23 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 83705733b8..b0df70b124 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -6,8 +6,9 @@
#include "SkOSFile.h"
#include "SkPictureRecorder.h"
#include "SkRandom.h"
-#include "SkSVGDevice.h"
+#include "SkSVGCanvas.h"
#include "SkStream.h"
+#include "SkXMLWriter.h"
namespace DM {
@@ -237,9 +238,11 @@ Error SKPSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const
SVGSink::SVGSink() {}
Error SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
- SkAutoTUnref<SkBaseDevice> device(SkSVGDevice::Create(src.size(), dst));
- SkCanvas canvas(device);
- return src.draw(&canvas);
+ SkAutoTDelete<SkXMLWriter> xmlWriter(SkNEW_ARGS(SkXMLStreamWriter, (dst)));
+ SkAutoTUnref<SkCanvas> canvas(SkSVGCanvas::Create(
+ SkRect::MakeWH(SkIntToScalar(src.size().width()), SkIntToScalar(src.size().height())),
+ xmlWriter));
+ return src.draw(canvas);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
diff --git a/gyp/dm.gypi b/gyp/dm.gypi
index 9ace2ac5eb..3912beca20 100644
--- a/gyp/dm.gypi
+++ b/gyp/dm.gypi
@@ -2,7 +2,6 @@
{
'include_dirs': [
'../dm',
- '../experimental/svg',
'../gm',
'../src/core',
'../src/effects',
@@ -19,6 +18,7 @@
'flags.gyp:flags',
'jsoncpp.gyp:jsoncpp',
'skia_lib.gyp:skia_lib',
+ 'svg.gyp:svg',
'tools.gyp:crash_handler',
'tools.gyp:proc_stats',
'tools.gyp:sk_tool_utils',
@@ -36,7 +36,6 @@
'../dm/DMJsonWriter.cpp',
'../gm/gm.cpp',
- '../experimental/svg/SkSVGDevice.cpp',
'../src/pipe/utils/SamplePipeControllers.cpp',
'../src/utils/debugger/SkDebugCanvas.cpp',
'../src/utils/debugger/SkDrawCommand.cpp',
diff --git a/gyp/svg.gyp b/gyp/svg.gyp
index 4c0822ec38..d681bda219 100644
--- a/gyp/svg.gyp
+++ b/gyp/svg.gyp
@@ -10,6 +10,31 @@
'xml.gyp:*',
],
'include_dirs': [
+ '../include/svg',
+ ],
+ 'sources': [
+ '<(skia_include_path)/svg/SkSVGCanvas.h',
+
+ '<(skia_src_path)/svg/SkSVGCanvas.cpp',
+ '<(skia_src_path)/svg/SkSVGDevice.cpp',
+ '<(skia_src_path)/svg/SkSVGDevice.h',
+ ],
+ 'direct_dependent_settings': {
+ 'include_dirs': [
+ '../include/svg',
+ ],
+ },
+ },
+ {
+ 'target_name': 'svg_parser',
+ 'product_name': 'skia_svg_parser',
+ 'type': 'static_library',
+ 'standalone_static_library': 1,
+ 'dependencies': [
+ 'skia_lib.gyp:skia_lib',
+ 'xml.gyp:*',
+ ],
+ 'include_dirs': [
'../include/svg/parser',
],
'sources': [
diff --git a/gyp/tools.gyp b/gyp/tools.gyp
index c844ebefcf..a83522c0db 100644
--- a/gyp/tools.gyp
+++ b/gyp/tools.gyp
@@ -265,12 +265,11 @@
],
},
{
+ # Superseded by dm, should be removed.
'target_name': 'skp2svg',
'type': 'executable',
'sources': [
- '../experimental/svg/skp2svg.cpp',
- '../experimental/svg/SkSVGDevice.cpp',
- '../experimental/svg/SkSVGDevice.h',
+ '../src/svg/skp2svg.cpp',
'../tools/LazyDecodeBitmap.cpp',
],
'include_dirs': [
@@ -281,6 +280,7 @@
'dependencies': [
'flags.gyp:flags',
'skia_lib.gyp:skia_lib',
+ 'svg.gyp:svg',
'xml.gyp:xml',
],
},
diff --git a/include/svg/SkSVGCanvas.h b/include/svg/SkSVGCanvas.h
new file mode 100644
index 0000000000..e285faa459
--- /dev/null
+++ b/include/svg/SkSVGCanvas.h
@@ -0,0 +1,31 @@
+/*
+ * 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 SkSVGCanvas_DEFINED
+#define SkSVGCanvas_DEFINED
+
+#include "SkCanvas.h"
+
+class SkXMLWriter;
+
+class SK_API SkSVGCanvas {
+public:
+ /**
+ * Returns a new canvas that will generate SVG commands from its draw calls, and send
+ * them to the provided xmlwriter. Ownership of the xmlwriter is not transfered to the canvas,
+ * but it must stay valid during the lifetime of the returned canvas.
+ *
+ * The canvas may buffer some drawing calls, so the output is not guaranteed to be valid
+ * or complete until the canvas instance is deleted.
+ *
+ * The 'bounds' parameter defines an initial SVG viewport (viewBox attribute on the root
+ * SVG element).
+ */
+ static SkCanvas* Create(const SkRect& bounds, SkXMLWriter*);
+};
+
+#endif
diff --git a/src/svg/SkSVGCanvas.cpp b/src/svg/SkSVGCanvas.cpp
new file mode 100644
index 0000000000..22a6e0bd9c
--- /dev/null
+++ b/src/svg/SkSVGCanvas.cpp
@@ -0,0 +1,17 @@
+/*
+ * 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 "SkSVGCanvas.h"
+#include "SkSVGDevice.h"
+
+SkCanvas* SkSVGCanvas::Create(const SkRect& bounds, SkXMLWriter* writer) {
+ // TODO: pass full bounds to the device
+ SkISize size = bounds.roundOut().size();
+ SkAutoTUnref<SkBaseDevice> device(SkSVGDevice::Create(size, writer));
+
+ return SkNEW_ARGS(SkCanvas, (device));
+}
diff --git a/experimental/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp
index 8d4ee4c05a..bf19a81a1d 100644
--- a/experimental/svg/SkSVGDevice.cpp
+++ b/src/svg/SkSVGDevice.cpp
@@ -471,17 +471,18 @@ void SkSVGDevice::AutoElement::addTextAttributes(const SkPaint& paint) {
}
}
-SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkWStream* wstream) {
- if (!SkToBool(wstream)) {
+SkBaseDevice* SkSVGDevice::Create(const SkISize& size, SkXMLWriter* writer) {
+ if (!writer) {
return NULL;
}
- return SkNEW_ARGS(SkSVGDevice, (size, wstream));
+ return SkNEW_ARGS(SkSVGDevice, (size, writer));
}
-SkSVGDevice::SkSVGDevice(const SkISize& size, SkWStream* wstream)
- : fWriter(SkNEW_ARGS(SkXMLStreamWriter, (wstream)))
+SkSVGDevice::SkSVGDevice(const SkISize& size, SkXMLWriter* writer)
+ : fWriter(writer)
, fResourceBucket(SkNEW(ResourceBucket)) {
+ SkASSERT(writer);
fLegacyBitmap.setInfo(SkImageInfo::MakeUnknown(size.width(), size.height()));
diff --git a/experimental/svg/SkSVGDevice.h b/src/svg/SkSVGDevice.h
index 0ea9e19bfc..fdfc8c3e03 100644
--- a/experimental/svg/SkSVGDevice.h
+++ b/src/svg/SkSVGDevice.h
@@ -10,12 +10,11 @@
#include "SkDevice.h"
-class SkWStream;
class SkXMLWriter;
class SkSVGDevice : public SkBaseDevice {
public:
- static SkBaseDevice* Create(const SkISize& size, SkWStream* wstream);
+ static SkBaseDevice* Create(const SkISize& size, SkXMLWriter* writer);
virtual SkImageInfo imageInfo() const SK_OVERRIDE;
@@ -59,13 +58,13 @@ protected:
virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE;
private:
- SkSVGDevice(const SkISize& size, SkWStream* wstream);
+ SkSVGDevice(const SkISize& size, SkXMLWriter* writer);
virtual ~SkSVGDevice();
class AutoElement;
class ResourceBucket;
- SkAutoTDelete<SkXMLWriter> fWriter;
+ SkXMLWriter* fWriter;
SkAutoTDelete<AutoElement> fRootElement;
SkAutoTDelete<ResourceBucket> fResourceBucket;
SkBitmap fLegacyBitmap;
diff --git a/experimental/svg/skp2svg.cpp b/src/svg/skp2svg.cpp
index 95bb04a061..ae6e54c885 100644
--- a/experimental/svg/skp2svg.cpp
+++ b/src/svg/skp2svg.cpp
@@ -9,7 +9,8 @@
#include "SkCommandLineFlags.h"
#include "SkPicture.h"
#include "SkStream.h"
-#include "SkSVGDevice.h"
+#include "SkSVGCanvas.h"
+#include "SkXMLWriter.h"
DEFINE_string2(input, i, "", "input skp file");
DEFINE_string2(output, o, "", "output svg file (optional)");
@@ -54,11 +55,10 @@ int tool_main(int argc, char** argv) {
outStream.reset(SkNEW(SkDebugWStream));
}
- SkISize size = pic->cullRect().roundOut().size();
- SkAutoTUnref<SkBaseDevice> svgDevice(SkSVGDevice::Create(size, outStream));
- SkCanvas svgCanvas(svgDevice.get());
+ SkAutoTDelete<SkXMLWriter> xmlWriter(SkNEW_ARGS(SkXMLStreamWriter, (outStream.get())));
+ SkAutoTUnref<SkCanvas> svgCanvas(SkSVGCanvas::Create(pic->cullRect(), xmlWriter.get()));
- pic->playback(&svgCanvas);
+ pic->playback(svgCanvas);
return kSuccess;
}