| Index: src/doc/SkDocument_XPS.cpp
|
| diff --git a/src/doc/SkDocument_XPS.cpp b/src/doc/SkDocument_XPS.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..db14a708bdeb059943f11c62f7bd1068578e8405
|
| --- /dev/null
|
| +++ b/src/doc/SkDocument_XPS.cpp
|
| @@ -0,0 +1,79 @@
|
| +/*
|
| + * 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 "SkDocument.h"
|
| +#include "SkXPSDevice.h"
|
| +#include "SkStream.h"
|
| +
|
| +class SkDocument_XPS : public SkDocument {
|
| +public:
|
| + SkDocument_XPS(SkWStream* stream,
|
| + void (*doneProc)(SkWStream*, bool),
|
| + SkScalar dpi)
|
| + : SkDocument(stream, doneProc) {
|
| + const SkScalar kPointsPerMeter = SkDoubleToScalar(360000.0 / 127.0);
|
| + fUnitsPerMeter.set(kPointsPerMeter, kPointsPerMeter);
|
| + SkScalar pixelsPerMeterScale = SkDoubleToScalar(dpi * 5000.0 / 127.0);
|
| + fPixelsPerMeter.set(pixelsPerMeterScale, pixelsPerMeterScale);
|
| + fDevice.beginPortfolio(stream);
|
| + }
|
| +
|
| + virtual ~SkDocument_XPS() {
|
| + // subclasses must call close() in their destructors
|
| + this->close();
|
| + }
|
| +
|
| +protected:
|
| + virtual SkCanvas* onBeginPage(SkScalar width,
|
| + SkScalar height,
|
| + const SkRect& trimBox) SK_OVERRIDE {
|
| + fDevice.beginSheet(fUnitsPerMeter, fPixelsPerMeter,
|
| + SkSize::Make(width, height));
|
| + fCanvas.reset(SkNEW_ARGS(SkCanvas, (&fDevice)));
|
| + fCanvas->clipRect(trimBox);
|
| + fCanvas->translate(trimBox.x(), trimBox.y());
|
| + return fCanvas.get();
|
| + }
|
| +
|
| + void onEndPage() SK_OVERRIDE {
|
| + SkASSERT(fCanvas.get());
|
| + fCanvas->flush();
|
| + fCanvas.reset(NULL);
|
| + fDevice.endSheet();
|
| + }
|
| +
|
| + bool onClose(SkWStream*) SK_OVERRIDE {
|
| + SkASSERT(!fCanvas.get());
|
| + return fDevice.endPortfolio();
|
| + }
|
| +
|
| + void onAbort() SK_OVERRIDE {}
|
| +
|
| +private:
|
| + SkXPSDevice fDevice;
|
| + SkAutoTUnref<SkCanvas> fCanvas;
|
| + SkVector fUnitsPerMeter;
|
| + SkVector fPixelsPerMeter;
|
| +};
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +SkDocument* SkDocument::CreateXPS(SkWStream* stream, SkScalar dpi) {
|
| + return stream ? SkNEW_ARGS(SkDocument_XPS, (stream, NULL, dpi)) : NULL;
|
| +}
|
| +
|
| +static void delete_wstream(SkWStream* stream, bool aborted) {
|
| + SkDELETE(stream);
|
| +}
|
| +
|
| +SkDocument* SkDocument::CreateXPS(const char path[], SkScalar dpi) {
|
| + SkAutoTDelete<SkFILEWStream> stream(SkNEW_ARGS(SkFILEWStream, (path)));
|
| + if (!stream->isValid()) {
|
| + return NULL;
|
| + }
|
| + return SkNEW_ARGS(SkDocument_XPS, (stream.detach(), delete_wstream, dpi));
|
| +}
|
|
|