From 47ef4d5d934bba86848aa238efab21f54a160c1a Mon Sep 17 00:00:00 2001 From: halcanary Date: Tue, 3 Mar 2015 09:13:09 -0800 Subject: XPS, DM: add SkDocument::CreateXPS - SkDocument::CreateXPS() function added, returns NULL on non-Windows OS. - DM: (Windows only) an XPSSink is added, fails on non-Windows OS - DM: Common code for PDFSink::draw and XPSSink::draw are factored into draw_skdocument static function. - SkDocument_XPS (Windows only) implementation of SkDocument via SkXPSDevice. - SkDocument_XPS_None (non-Windows) returns NULL for SkDocument::CreateXPS(). - gyp/xps.gyp refactored. - SkXPSDevice::drawTextOnPath removed (see http://crrev.com/925343003 ) - SkXPSDevice::drawPath supports conics via SkAutoConicToQuads. Review URL: https://codereview.chromium.org/963953002 --- src/device/xps/SkXPSDevice.cpp | 26 +++++++++----- src/doc/SkDocument_XPS.cpp | 79 +++++++++++++++++++++++++++++++++++++++++ src/doc/SkDocument_XPS_None.cpp | 3 ++ 3 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 src/doc/SkDocument_XPS.cpp create mode 100644 src/doc/SkDocument_XPS_None.cpp (limited to 'src') diff --git a/src/device/xps/SkXPSDevice.cpp b/src/device/xps/SkXPSDevice.cpp index c1105a2e94..3bb87b32a3 100644 --- a/src/device/xps/SkXPSDevice.cpp +++ b/src/device/xps/SkXPSDevice.cpp @@ -5,13 +5,14 @@ * found in the LICENSE file. */ +#include "SkTypes.h" + #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif -#include "SkTypes.h" #include #include #include @@ -23,6 +24,7 @@ #include "SkDraw.h" #include "SkDrawProcs.h" #include "SkEndian.h" +#include "SkGeometry.h" #include "SkGlyphCache.h" #include "SkHRESULT.h" #include "SkImageEncoder.h" @@ -1363,6 +1365,21 @@ HRESULT SkXPSDevice::addXpsPathGeometry( segmentData.push(SkScalarToFLOAT(points[3].fX)); segmentData.push(SkScalarToFLOAT(points[3].fY)); break; + case SkPath::kConic_Verb: { + const SkScalar tol = SK_Scalar1 / 4; + SkAutoConicToQuads converter; + const SkPoint* quads = + converter.computeQuads(points, iter.conicWeight(), tol); + for (int i = 0; i < converter.countQuads(); ++i) { + segmentTypes.push(XPS_SEGMENT_TYPE_QUADRATIC_BEZIER); + segmentStrokes.push(stroke); + segmentData.push(SkScalarToFLOAT(quads[2 * i + 1].fX)); + segmentData.push(SkScalarToFLOAT(quads[2 * i + 1].fY)); + segmentData.push(SkScalarToFLOAT(quads[2 * i + 2].fX)); + segmentData.push(SkScalarToFLOAT(quads[2 * i + 2].fY)); + } + break; + } case SkPath::kClose_Verb: // we ignore these, and just get the whole segment from // the corresponding line/quad/cubic verbs @@ -2207,13 +2224,6 @@ void SkXPSDevice::drawPosText(const SkDraw& d, paint)); } -void SkXPSDevice::drawTextOnPath(const SkDraw& d, const void* text, size_t len, - const SkPath& path, const SkMatrix* matrix, - const SkPaint& paint) { - //This will call back into the device to do the drawing. - d.drawTextOnPath((const char*)text, len, path, matrix, paint); -} - void SkXPSDevice::drawDevice(const SkDraw& d, SkBaseDevice* dev, int x, int y, const SkPaint&) { diff --git a/src/doc/SkDocument_XPS.cpp b/src/doc/SkDocument_XPS.cpp new file mode 100644 index 0000000000..db14a708bd --- /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 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 stream(SkNEW_ARGS(SkFILEWStream, (path))); + if (!stream->isValid()) { + return NULL; + } + return SkNEW_ARGS(SkDocument_XPS, (stream.detach(), delete_wstream, dpi)); +} diff --git a/src/doc/SkDocument_XPS_None.cpp b/src/doc/SkDocument_XPS_None.cpp new file mode 100644 index 0000000000..01055e5cf0 --- /dev/null +++ b/src/doc/SkDocument_XPS_None.cpp @@ -0,0 +1,3 @@ +#include "SkDocument.h" +SkDocument* SkDocument::CreateXPS(SkWStream*, SkScalar) { return NULL; } +SkDocument* SkDocument::CreateXPS(const char path[], SkScalar) { return NULL; } -- cgit v1.2.3