aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar Bryce Thomas <bryct@amazon.com>2018-03-02 13:54:21 -0800
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-03-02 22:20:19 +0000
commit95a7b76a44edd2f25423a4d395df553b80fe06d7 (patch)
tree6a5e66c6b2026e985248f092d928b39c19f677e1 /dm
parent419abf335af36cc9928019bbd9c075944ae59a0a (diff)
dm: support printing specific page of mskp to SVG
Currently with dm, it's possible to convert an .mskp to a multi-page PDF as follows: out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \ --config pdf --verbose The SVG equivalent partially works, although only outputs the first page: out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \ --config svg --verbose This CL adds support for passing extended options to SVG. Specifically, the 'page' option , which now determines which page of the source mskp gets converted to the SVG output. The new syntax is as follows: out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \ --config svg[page=2] --verbose The `[key=value]` syntax is the same extended options syntax currently used by dm with --config gpu, e.g. `gpu[api=gl,color=8888]`. BUG=skia:7601 Change-Id: I3523d79b1cdbbba9e80fd46501331877091bdead Reviewed-on: https://skia-review.googlesource.com/105404 Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Mike Klein <mtklein@google.com> Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'dm')
-rw-r--r--dm/DM.cpp4
-rw-r--r--dm/DMSrcSink.cpp15
-rw-r--r--dm/DMSrcSink.h5
3 files changed, 20 insertions, 4 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 1d3d815647..972c70d484 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -899,6 +899,10 @@ static Sink* create_sink(const GrContextOptions& grCtxOptions, const SkCommandLi
}
}
#endif
+ if (const SkCommandLineConfigSvg* svgConfig = config->asConfigSvg()) {
+ int pageIndex = svgConfig->getPageIndex();
+ return new SVGSink(pageIndex);
+ }
#define SINK(t, sink, ...) if (config->getBackend().equals(t)) { return new sink(__VA_ARGS__); }
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 2229b9c26d..149138d832 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1838,14 +1838,23 @@ Error DebugSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) cons
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-SVGSink::SVGSink() {}
+SVGSink::SVGSink(int pageIndex) : fPageIndex(pageIndex) {}
Error SVGSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
#if defined(SK_XML)
+ if (src.pageCount() > 1) {
+ int pageCount = src.pageCount();
+ if (fPageIndex > pageCount - 1) {
+ return Error(SkStringPrintf("Page index %d too high for document with only %d pages.",
+ fPageIndex, pageCount));
+ }
+ }
std::unique_ptr<SkXMLWriter> xmlWriter(new SkXMLStreamWriter(dst));
- return src.draw(SkSVGCanvas::Make(SkRect::MakeWH(SkIntToScalar(src.size().width()),
+ return src.draw(fPageIndex,
+ SkSVGCanvas::Make(SkRect::MakeWH(SkIntToScalar(src.size().width()),
SkIntToScalar(src.size().height())),
- xmlWriter.get()).get());
+ xmlWriter.get())
+ .get());
#else
return Error("SVG sink is disabled.");
#endif // SK_XML
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index 6cc5df690f..227ef5341a 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -458,11 +458,14 @@ public:
class SVGSink : public Sink {
public:
- SVGSink();
+ SVGSink(int pageIndex = 0);
Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
const char* fileExtension() const override { return "svg"; }
SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; }
+
+private:
+ int fPageIndex;
};