Home | History | Annotate | Download | only in xps
      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_WIN32)
     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, nullptr)
     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_WIN32)
     68