1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 9cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_WIN) 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/docs/SkXPSDocument.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 14cb93a386Sopenharmony_ci#include "src/utils/win/SkHRESULT.h" 15cb93a386Sopenharmony_ci#include "src/utils/win/SkTScopedComPtr.h" 16cb93a386Sopenharmony_ci#include "src/xps/SkXPSDevice.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci// #include <XpsObjectModel.h> 19cb93a386Sopenharmony_ci#include <xpsobjectmodel.h> 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cinamespace { 22cb93a386Sopenharmony_cistruct SkXPSDocument final : public SkDocument { 23cb93a386Sopenharmony_ci SkTScopedComPtr<IXpsOMObjectFactory> fXpsFactory; 24cb93a386Sopenharmony_ci SkXPSDevice fDevice; 25cb93a386Sopenharmony_ci std::unique_ptr<SkCanvas> fCanvas; 26cb93a386Sopenharmony_ci SkVector fUnitsPerMeter; 27cb93a386Sopenharmony_ci SkVector fPixelsPerMeter; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci SkXPSDocument(SkWStream*, SkScalar dpi, SkTScopedComPtr<IXpsOMObjectFactory>); 30cb93a386Sopenharmony_ci ~SkXPSDocument() override; 31cb93a386Sopenharmony_ci SkCanvas* onBeginPage(SkScalar w, SkScalar h) override; 32cb93a386Sopenharmony_ci void onEndPage() override; 33cb93a386Sopenharmony_ci void onClose(SkWStream*) override; 34cb93a386Sopenharmony_ci void onAbort() override; 35cb93a386Sopenharmony_ci}; 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ciSkXPSDocument::SkXPSDocument(SkWStream* stream, 39cb93a386Sopenharmony_ci SkScalar dpi, 40cb93a386Sopenharmony_ci SkTScopedComPtr<IXpsOMObjectFactory> xpsFactory) 41cb93a386Sopenharmony_ci : SkDocument(stream) 42cb93a386Sopenharmony_ci , fXpsFactory(std::move(xpsFactory)) 43cb93a386Sopenharmony_ci , fDevice(SkISize{10000, 10000}) 44cb93a386Sopenharmony_ci{ 45cb93a386Sopenharmony_ci const SkScalar kPointsPerMeter = SkDoubleToScalar(360000.0 / 127.0); 46cb93a386Sopenharmony_ci fUnitsPerMeter.set(kPointsPerMeter, kPointsPerMeter); 47cb93a386Sopenharmony_ci SkScalar pixelsPerMeterScale = SkDoubleToScalar(dpi * 5000.0 / 127.0); 48cb93a386Sopenharmony_ci fPixelsPerMeter.set(pixelsPerMeterScale, pixelsPerMeterScale); 49cb93a386Sopenharmony_ci SkASSERT(fXpsFactory); 50cb93a386Sopenharmony_ci fDevice.beginPortfolio(stream, fXpsFactory.get()); 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ciSkXPSDocument::~SkXPSDocument() { 54cb93a386Sopenharmony_ci // subclasses must call close() in their destructors 55cb93a386Sopenharmony_ci this->close(); 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciSkCanvas* SkXPSDocument::onBeginPage(SkScalar width, SkScalar height) { 59cb93a386Sopenharmony_ci fDevice.beginSheet(fUnitsPerMeter, fPixelsPerMeter, {width, height}); 60cb93a386Sopenharmony_ci fCanvas.reset(new SkCanvas(sk_ref_sp(&fDevice))); 61cb93a386Sopenharmony_ci return fCanvas.get(); 62cb93a386Sopenharmony_ci} 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_civoid SkXPSDocument::onEndPage() { 65cb93a386Sopenharmony_ci SkASSERT(fCanvas.get()); 66cb93a386Sopenharmony_ci fCanvas.reset(nullptr); 67cb93a386Sopenharmony_ci fDevice.endSheet(); 68cb93a386Sopenharmony_ci} 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_civoid SkXPSDocument::onClose(SkWStream*) { 71cb93a386Sopenharmony_ci SkASSERT(!fCanvas.get()); 72cb93a386Sopenharmony_ci (void)fDevice.endPortfolio(); 73cb93a386Sopenharmony_ci} 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_civoid SkXPSDocument::onAbort() {} 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_cisk_sp<SkDocument> SkXPS::MakeDocument(SkWStream* stream, 80cb93a386Sopenharmony_ci IXpsOMObjectFactory* factoryPtr, 81cb93a386Sopenharmony_ci SkScalar dpi) { 82cb93a386Sopenharmony_ci SkTScopedComPtr<IXpsOMObjectFactory> factory(SkSafeRefComPtr(factoryPtr)); 83cb93a386Sopenharmony_ci return stream && factory 84cb93a386Sopenharmony_ci ? sk_make_sp<SkXPSDocument>(stream, dpi, std::move(factory)) 85cb93a386Sopenharmony_ci : nullptr; 86cb93a386Sopenharmony_ci} 87cb93a386Sopenharmony_ci#endif // defined(SK_BUILD_FOR_WIN) 88