blob: 4a977aeaeeb01f7ae5cfcfbddfed9ed42d017964 [file] [log] [blame]
halcanary47ef4d52015-03-03 09:13:09 -08001/*
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
mtklein1ee76512015-11-02 10:20:27 -08008#include "SkTypes.h"
9#if defined(SK_BUILD_FOR_WIN32)
10
halcanary47ef4d52015-03-03 09:13:09 -080011#include "SkDocument.h"
12#include "SkXPSDevice.h"
13#include "SkStream.h"
14
15class SkDocument_XPS : public SkDocument {
16public:
17 SkDocument_XPS(SkWStream* stream,
18 void (*doneProc)(SkWStream*, bool),
19 SkScalar dpi)
20 : SkDocument(stream, doneProc) {
21 const SkScalar kPointsPerMeter = SkDoubleToScalar(360000.0 / 127.0);
22 fUnitsPerMeter.set(kPointsPerMeter, kPointsPerMeter);
23 SkScalar pixelsPerMeterScale = SkDoubleToScalar(dpi * 5000.0 / 127.0);
24 fPixelsPerMeter.set(pixelsPerMeterScale, pixelsPerMeterScale);
25 fDevice.beginPortfolio(stream);
26 }
27
28 virtual ~SkDocument_XPS() {
29 // subclasses must call close() in their destructors
30 this->close();
31 }
32
33protected:
tfarinaf4219dd2015-04-27 17:18:28 -070034 SkCanvas* onBeginPage(SkScalar width,
35 SkScalar height,
36 const SkRect& trimBox) override {
halcanary47ef4d52015-03-03 09:13:09 -080037 fDevice.beginSheet(fUnitsPerMeter, fPixelsPerMeter,
38 SkSize::Make(width, height));
halcanary385fe4d2015-08-26 13:07:48 -070039 fCanvas.reset(new SkCanvas(&fDevice));
halcanary47ef4d52015-03-03 09:13:09 -080040 fCanvas->clipRect(trimBox);
41 fCanvas->translate(trimBox.x(), trimBox.y());
42 return fCanvas.get();
43 }
44
mtklein36352bf2015-03-25 18:17:31 -070045 void onEndPage() override {
halcanary47ef4d52015-03-03 09:13:09 -080046 SkASSERT(fCanvas.get());
47 fCanvas->flush();
halcanary96fcdcc2015-08-27 07:41:13 -070048 fCanvas.reset(nullptr);
halcanary47ef4d52015-03-03 09:13:09 -080049 fDevice.endSheet();
50 }
51
reedd14df7c2016-09-22 14:12:46 -070052 void onClose(SkWStream*) override {
halcanary47ef4d52015-03-03 09:13:09 -080053 SkASSERT(!fCanvas.get());
reedd14df7c2016-09-22 14:12:46 -070054 (void)fDevice.endPortfolio();
halcanary47ef4d52015-03-03 09:13:09 -080055 }
56
mtklein36352bf2015-03-25 18:17:31 -070057 void onAbort() override {}
halcanary47ef4d52015-03-03 09:13:09 -080058
59private:
60 SkXPSDevice fDevice;
61 SkAutoTUnref<SkCanvas> fCanvas;
62 SkVector fUnitsPerMeter;
63 SkVector fPixelsPerMeter;
64};
65
66///////////////////////////////////////////////////////////////////////////////
67
halcanary4b656662016-04-27 07:45:18 -070068sk_sp<SkDocument> SkDocument::MakeXPS(SkWStream* stream, SkScalar dpi) {
69 return stream ? sk_make_sp<SkDocument_XPS>(stream, nullptr, dpi) : nullptr;
halcanary47ef4d52015-03-03 09:13:09 -080070}
71
halcanary385fe4d2015-08-26 13:07:48 -070072static void delete_wstream(SkWStream* stream, bool aborted) { delete stream; }
halcanary47ef4d52015-03-03 09:13:09 -080073
halcanary4b656662016-04-27 07:45:18 -070074sk_sp<SkDocument> SkDocument::MakeXPS(const char path[], SkScalar dpi) {
halcanary385fe4d2015-08-26 13:07:48 -070075 SkAutoTDelete<SkFILEWStream> stream(new SkFILEWStream(path));
halcanary47ef4d52015-03-03 09:13:09 -080076 if (!stream->isValid()) {
halcanary96fcdcc2015-08-27 07:41:13 -070077 return nullptr;
halcanary47ef4d52015-03-03 09:13:09 -080078 }
halcanary4b656662016-04-27 07:45:18 -070079 return sk_make_sp<SkDocument_XPS>(stream.release(), delete_wstream, dpi);
halcanary47ef4d52015-03-03 09:13:09 -080080}
mtklein1ee76512015-11-02 10:20:27 -080081
82#endif//defined(SK_BUILD_FOR_WIN32)