1 /* 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 8 9 #include "SkTypes.h" 10 #if defined(SK_BUILD_FOR_WIN) 11 12 #include "SkXPSDocument.h" 13 #include "SkStream.h" 14 #include "SkHRESULT.h" 15 16 SkXPSDocument::SkXPSDocument(SkWStream* stream, 17 SkScalar dpi, 18 SkTScopedComPtr<IXpsOMObjectFactory> xpsFactory) 19 : SkDocument(stream) 20 , fXpsFactory(std::move(xpsFactory)) 21 , fDevice(SkISize{10000, 10000}) 22 { 23 const SkScalar kPointsPerMeter = SkDoubleToScalar(360000.0 / 127.0); 24 fUnitsPerMeter.set(kPointsPerMeter, kPointsPerMeter); 25 SkScalar pixelsPerMeterScale = SkDoubleToScalar(dpi * 5000.0 / 127.0); 26 fPixelsPerMeter.set(pixelsPerMeterScale, pixelsPerMeterScale); 27 SkASSERT(fXpsFactory); 28 fDevice.beginPortfolio(stream, fXpsFactory.get()); 29 } 30 31 SkXPSDocument::~SkXPSDocument() { 32 // subclasses must call close() in their destructors 33 this->close(); 34 } 35 36 SkCanvas* SkXPSDocument::onBeginPage(SkScalar width, SkScalar height) { 37 fDevice.beginSheet(fUnitsPerMeter, fPixelsPerMeter, {width, height}); 38 fCanvas.reset(new SkCanvas(&fDevice)); 39 return fCanvas.get(); 40 } 41 42 void SkXPSDocument::onEndPage() { 43 SkASSERT(fCanvas.get()); 44 fCanvas->flush(); 45 fCanvas.reset(nullptr); 46 fDevice.endSheet(); 47 } 48 49 void SkXPSDocument::onClose(SkWStream*) { 50 SkASSERT(!fCanvas.get()); 51 (void)fDevice.endPortfolio(); 52 } 53 54 void SkXPSDocument::onAbort() {} 55 56 /////////////////////////////////////////////////////////////////////////////// 57 58 sk_sp<SkDocument> SkDocument::MakeXPS(SkWStream* stream, 59 IXpsOMObjectFactory* factoryPtr, 60 SkScalar dpi) { 61 SkTScopedComPtr<IXpsOMObjectFactory> factory(SkSafeRefComPtr(factoryPtr)); 62 return stream && factory 63 ? sk_make_sp<SkXPSDocument>(stream, dpi, std::move(factory)) 64 : nullptr; 65 } 66 67 #endif//defined(SK_BUILD_FOR_WIN) 68