blob: a8785a0a2a5f39831148e89e314884f5d1417c56 [file] [log] [blame]
Hal Canaryabc88d22017-02-06 09:26:49 -05001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Hal Canaryabc88d22017-02-06 09:26:49 -05008#include "SkTypes.h"
Mike Klein8f11d4d2018-01-24 12:42:55 -05009#if defined(SK_BUILD_FOR_WIN)
Hal Canaryabc88d22017-02-06 09:26:49 -050010
11#include "SkXPSDocument.h"
Hal Canary23564b92018-09-07 14:33:14 -040012
Hal Canaryabc88d22017-02-06 09:26:49 -050013#include "SkHRESULT.h"
Hal Canary23564b92018-09-07 14:33:14 -040014#include "SkStream.h"
15#include "SkTScopedComPtr.h"
16#include "SkXPSDevice.h"
17
18#include <XpsObjectModel.h>
19
20namespace {
21struct SkXPSDocument final : public SkDocument {
22 SkTScopedComPtr<IXpsOMObjectFactory> fXpsFactory;
23 SkXPSDevice fDevice;
24 std::unique_ptr<SkCanvas> fCanvas;
25 SkVector fUnitsPerMeter;
26 SkVector fPixelsPerMeter;
27
28 SkXPSDocument(SkWStream*, SkScalar dpi, SkTScopedComPtr<IXpsOMObjectFactory>);
29 ~SkXPSDocument() override;
30 SkCanvas* onBeginPage(SkScalar w, SkScalar h) override;
31 void onEndPage() override;
32 void onClose(SkWStream*) override;
33 void onAbort() override;
34};
35}
Hal Canaryabc88d22017-02-06 09:26:49 -050036
37SkXPSDocument::SkXPSDocument(SkWStream* stream,
Hal Canaryabc88d22017-02-06 09:26:49 -050038 SkScalar dpi,
39 SkTScopedComPtr<IXpsOMObjectFactory> xpsFactory)
Hal Canaryc5980d02018-01-08 15:02:36 -050040 : SkDocument(stream)
Hal Canaryabc88d22017-02-06 09:26:49 -050041 , fXpsFactory(std::move(xpsFactory))
42 , fDevice(SkISize{10000, 10000})
43{
44 const SkScalar kPointsPerMeter = SkDoubleToScalar(360000.0 / 127.0);
45 fUnitsPerMeter.set(kPointsPerMeter, kPointsPerMeter);
46 SkScalar pixelsPerMeterScale = SkDoubleToScalar(dpi * 5000.0 / 127.0);
47 fPixelsPerMeter.set(pixelsPerMeterScale, pixelsPerMeterScale);
48 SkASSERT(fXpsFactory);
49 fDevice.beginPortfolio(stream, fXpsFactory.get());
50}
51
52SkXPSDocument::~SkXPSDocument() {
53 // subclasses must call close() in their destructors
54 this->close();
55}
56
Hal Canaryb1de5f92017-07-01 22:17:15 -040057SkCanvas* SkXPSDocument::onBeginPage(SkScalar width, SkScalar height) {
Hal Canaryfafe1352017-04-11 12:12:02 -040058 fDevice.beginSheet(fUnitsPerMeter, fPixelsPerMeter, {width, height});
Herb Derbyefe39bc2018-05-01 17:06:20 -040059 fCanvas.reset(new SkCanvas(sk_ref_sp(&fDevice)));
Hal Canaryabc88d22017-02-06 09:26:49 -050060 return fCanvas.get();
61}
62
63void SkXPSDocument::onEndPage() {
64 SkASSERT(fCanvas.get());
65 fCanvas->flush();
66 fCanvas.reset(nullptr);
67 fDevice.endSheet();
68}
69
70void SkXPSDocument::onClose(SkWStream*) {
71 SkASSERT(!fCanvas.get());
72 (void)fDevice.endPortfolio();
73}
74
75void SkXPSDocument::onAbort() {}
76
Hal Canaryabc88d22017-02-06 09:26:49 -050077///////////////////////////////////////////////////////////////////////////////
78
Hal Canary23564b92018-09-07 14:33:14 -040079sk_sp<SkDocument> SkXPS::MakeDocument(SkWStream* stream,
Hal Canaryabc88d22017-02-06 09:26:49 -050080 IXpsOMObjectFactory* factoryPtr,
81 SkScalar dpi) {
82 SkTScopedComPtr<IXpsOMObjectFactory> factory(SkSafeRefComPtr(factoryPtr));
83 return stream && factory
Hal Canary5e221e72017-02-06 09:51:42 -050084 ? sk_make_sp<SkXPSDocument>(stream, dpi, std::move(factory))
Hal Canaryabc88d22017-02-06 09:26:49 -050085 : nullptr;
86}
Hal Canary23564b92018-09-07 14:33:14 -040087#endif // defined(SK_BUILD_FOR_WIN)