diff options
author | fmalita <fmalita@chromium.org> | 2015-02-06 12:51:10 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-06 12:51:10 -0800 |
commit | 2aafe6f427f6d98aa4d173efc6195fe245add91d (patch) | |
tree | e54ed2c567cafcc6ca76b5d424d0b70eda00fece | |
parent | 23e619cf462b2a8a500f3ca750e099f79601f508 (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
-rw-r--r-- | dm/DMSrcSink.cpp | 11 | ||||
-rw-r--r-- | gyp/dm.gypi | 3 | ||||
-rw-r--r-- | gyp/svg.gyp | 25 | ||||
-rw-r--r-- | gyp/tools.gyp | 6 | ||||
-rw-r--r-- | include/svg/SkSVGCanvas.h | 31 | ||||
-rw-r--r-- | src/svg/SkSVGCanvas.cpp | 17 | ||||
-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; } |