SkXPS: new document API.
Now requires a IXpsOMObjectFactory pointer. This will allow sandboxing
to be used in Chromium. (Chrome will create a IXpsOMObjectFactory, then
go into sandbox mode, then call SkDocumenent::MakeXPS().)
Change-Id: Ic4b48d4b148c44e188d12a9481fb74735546528a
Reviewed-on: https://skia-review.googlesource.com/8052
Reviewed-by: Ben Wagner <bungeman@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 75f5973..88b1963 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -45,6 +45,9 @@
#if defined(SK_BUILD_FOR_WIN)
#include "SkAutoCoInitialize.h"
+ #include "SkHRESULT.h"
+ #include "SkTScopedComPtr.h"
+ #include <XpsObjectModel.h>
#endif
#if defined(SK_XML)
@@ -1332,19 +1335,36 @@
XPSSink::XPSSink() {}
-Error XPSSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
#ifdef SK_BUILD_FOR_WIN
+static SkTScopedComPtr<IXpsOMObjectFactory> make_xps_factory() {
+ IXpsOMObjectFactory* factory;
+ HRN(CoCreateInstance(CLSID_XpsOMObjectFactory,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_PPV_ARGS(&factory)));
+ return SkTScopedComPtr<IXpsOMObjectFactory>(factory);
+}
+
+Error XPSSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
SkAutoCoInitialize com;
if (!com.succeeded()) {
return "Could not initialize COM.";
}
-#endif
- sk_sp<SkDocument> doc(SkDocument::MakeXPS(dst));
+ SkTScopedComPtr<IXpsOMObjectFactory> factory = make_xps_factory();
+ if (!factory) {
+ return "Failed to create XPS Factory.";
+ }
+ sk_sp<SkDocument> doc(SkDocument::MakeXPS(dst, factory.get()));
if (!doc) {
return "SkDocument::MakeXPS() returned nullptr";
}
return draw_skdocument(src, doc.get(), dst);
}
+#else
+Error XPSSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const {
+ return "XPS not supported on this platform.";
+}
+#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/