michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #ifndef SkXPSDevice_DEFINED michael@0: #define SkXPSDevice_DEFINED michael@0: michael@0: #include "SkTypes.h" michael@0: #include michael@0: #include michael@0: michael@0: #include "SkAutoCoInitialize.h" michael@0: #include "SkBitmapDevice.h" michael@0: #include "SkBitSet.h" michael@0: #include "SkCanvas.h" michael@0: #include "SkColor.h" michael@0: #include "SkPaint.h" michael@0: #include "SkPath.h" michael@0: #include "SkPoint.h" michael@0: #include "SkShader.h" michael@0: #include "SkSize.h" michael@0: #include "SkTArray.h" michael@0: #include "SkTScopedComPtr.h" michael@0: #include "SkTypeface.h" michael@0: michael@0: /** \class SkXPSDevice michael@0: michael@0: The drawing context for the XPS backend. michael@0: */ michael@0: class SkXPSDevice : public SkBitmapDevice { michael@0: public: michael@0: SK_API SkXPSDevice(); michael@0: SK_API virtual ~SkXPSDevice(); michael@0: michael@0: virtual bool beginPortfolio(SkWStream* outputStream); michael@0: /** michael@0: @param unitsPerMeter converts geometry units into physical units. michael@0: @param pixelsPerMeter resolution to use when geometry must be rasterized. michael@0: @param trimSize final page size in physical units. michael@0: The top left of the trim is the origin of physical space. michael@0: @param mediaBox The size of the physical media in physical units. michael@0: The top and left must be less than zero. michael@0: The bottom and right must be greater than the trimSize. michael@0: The default is to coincide with the trimSize. michael@0: @param bleedBox The size of the bleed box in physical units. michael@0: Must be contained within the mediaBox. michael@0: The default is to coincide with the mediaBox. michael@0: @param artBox The size of the content box in physical units. michael@0: Must be contained within the trimSize. michael@0: The default is to coincide with the trimSize. michael@0: @param cropBox The size of the recommended view port in physical units. michael@0: Must be contained within the mediaBox. michael@0: The default is to coincide with the mediaBox. michael@0: */ michael@0: virtual bool beginSheet( michael@0: const SkVector& unitsPerMeter, michael@0: const SkVector& pixelsPerMeter, michael@0: const SkSize& trimSize, michael@0: const SkRect* mediaBox = NULL, michael@0: const SkRect* bleedBox = NULL, michael@0: const SkRect* artBox = NULL, michael@0: const SkRect* cropBox = NULL); michael@0: michael@0: virtual bool endSheet(); michael@0: virtual bool endPortfolio(); michael@0: michael@0: protected: michael@0: virtual void clear(SkColor color) SK_OVERRIDE; michael@0: michael@0: virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawPoints( michael@0: const SkDraw&, michael@0: SkCanvas::PointMode mode, michael@0: size_t count, const SkPoint[], michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawRect( michael@0: const SkDraw&, michael@0: const SkRect& r, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawRRect( michael@0: const SkDraw&, michael@0: const SkRRect&, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawPath( michael@0: const SkDraw&, michael@0: const SkPath& platonicPath, michael@0: const SkPaint& paint, michael@0: const SkMatrix* prePathMatrix, michael@0: bool pathIsMutable) SK_OVERRIDE; michael@0: michael@0: virtual void drawBitmap( michael@0: const SkDraw&, michael@0: const SkBitmap& bitmap, michael@0: const SkMatrix& matrix, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawSprite( michael@0: const SkDraw&, michael@0: const SkBitmap& bitmap, michael@0: int x, int y, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawText( michael@0: const SkDraw&, michael@0: const void* text, size_t len, michael@0: SkScalar x, SkScalar y, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawPosText( michael@0: const SkDraw&, michael@0: const void* text, size_t len, michael@0: const SkScalar pos[], SkScalar constY, int scalarsPerPos, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawTextOnPath( michael@0: const SkDraw&, michael@0: const void* text, size_t len, michael@0: const SkPath& path, michael@0: const SkMatrix* matrix, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawVertices( michael@0: const SkDraw&, michael@0: SkCanvas::VertexMode, michael@0: int vertexCount, const SkPoint verts[], michael@0: const SkPoint texs[], const SkColor colors[], michael@0: SkXfermode* xmode, michael@0: const uint16_t indices[], int indexCount, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual void drawDevice( michael@0: const SkDraw&, michael@0: SkBaseDevice* device, michael@0: int x, int y, michael@0: const SkPaint& paint) SK_OVERRIDE; michael@0: michael@0: virtual bool onReadPixels(const SkBitmap& bitmap, michael@0: int x, michael@0: int y, michael@0: SkCanvas::Config8888) SK_OVERRIDE; michael@0: michael@0: virtual bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE; michael@0: michael@0: private: michael@0: class TypefaceUse : ::SkNoncopyable { michael@0: public: michael@0: SkFontID typefaceId; michael@0: int ttcIndex; michael@0: SkStream* fontData; michael@0: IXpsOMFontResource* xpsFont; michael@0: SkBitSet* glyphsUsed; michael@0: michael@0: explicit TypefaceUse(); michael@0: ~TypefaceUse(); michael@0: }; michael@0: friend static HRESULT subset_typeface(TypefaceUse* current); michael@0: michael@0: SkXPSDevice(IXpsOMObjectFactory* xpsFactory); michael@0: michael@0: SkAutoCoInitialize fAutoCo; michael@0: SkTScopedComPtr fXpsFactory; michael@0: SkTScopedComPtr fOutputStream; michael@0: SkTScopedComPtr fPackageWriter; michael@0: michael@0: unsigned int fCurrentPage; michael@0: SkTScopedComPtr fCurrentXpsCanvas; michael@0: SkSize fCurrentCanvasSize; michael@0: SkVector fCurrentUnitsPerMeter; michael@0: SkVector fCurrentPixelsPerMeter; michael@0: michael@0: SkTArray fTypefaces; michael@0: michael@0: HRESULT initXpsDocumentWriter(IXpsOMImageResource* image); michael@0: michael@0: HRESULT createXpsPage( michael@0: const XPS_SIZE& pageSize, michael@0: IXpsOMPage** page); michael@0: michael@0: HRESULT createXpsThumbnail( michael@0: IXpsOMPage* page, const unsigned int pageNumber, michael@0: IXpsOMImageResource** image); michael@0: michael@0: void internalDrawRect( michael@0: const SkDraw&, michael@0: const SkRect& r, michael@0: bool transformRect, michael@0: const SkPaint& paint); michael@0: michael@0: HRESULT createXpsBrush( michael@0: const SkPaint& skPaint, michael@0: IXpsOMBrush** xpsBrush, michael@0: const SkMatrix* parentTransform = NULL); michael@0: michael@0: HRESULT createXpsSolidColorBrush( michael@0: const SkColor skColor, const SkAlpha alpha, michael@0: IXpsOMBrush** xpsBrush); michael@0: michael@0: HRESULT createXpsImageBrush( michael@0: const SkBitmap& bitmap, michael@0: const SkMatrix& localMatrix, michael@0: const SkShader::TileMode (&xy)[2], michael@0: const SkAlpha alpha, michael@0: IXpsOMTileBrush** xpsBrush); michael@0: michael@0: HRESULT createXpsLinearGradient( michael@0: SkShader::GradientInfo info, michael@0: const SkAlpha alpha, michael@0: const SkMatrix& localMatrix, michael@0: IXpsOMMatrixTransform* xpsMatrixToUse, michael@0: IXpsOMBrush** xpsBrush); michael@0: michael@0: HRESULT createXpsRadialGradient( michael@0: SkShader::GradientInfo info, michael@0: const SkAlpha alpha, michael@0: const SkMatrix& localMatrix, michael@0: IXpsOMMatrixTransform* xpsMatrixToUse, michael@0: IXpsOMBrush** xpsBrush); michael@0: michael@0: HRESULT createXpsGradientStop( michael@0: const SkColor skColor, michael@0: const SkScalar offset, michael@0: IXpsOMGradientStop** xpsGradStop); michael@0: michael@0: HRESULT createXpsTransform( michael@0: const SkMatrix& matrix, michael@0: IXpsOMMatrixTransform ** xpsTransform); michael@0: michael@0: HRESULT createXpsRect( michael@0: const SkRect& rect, michael@0: BOOL stroke, BOOL fill, michael@0: IXpsOMGeometryFigure** xpsRect); michael@0: michael@0: HRESULT createXpsQuad( michael@0: const SkPoint (&points)[4], michael@0: BOOL stroke, BOOL fill, michael@0: IXpsOMGeometryFigure** xpsQuad); michael@0: michael@0: HRESULT CreateTypefaceUse( michael@0: const SkPaint& paint, michael@0: TypefaceUse** fontResource); michael@0: michael@0: HRESULT AddGlyphs( michael@0: const SkDraw& d, michael@0: IXpsOMObjectFactory* xpsFactory, michael@0: IXpsOMCanvas* canvas, michael@0: TypefaceUse* font, michael@0: LPCWSTR text, michael@0: XPS_GLYPH_INDEX* xpsGlyphs, michael@0: UINT32 xpsGlyphsLen, michael@0: XPS_POINT *origin, michael@0: FLOAT fontSize, michael@0: XPS_STYLE_SIMULATION sims, michael@0: const SkMatrix& transform, michael@0: const SkPaint& paint); michael@0: michael@0: HRESULT addXpsPathGeometry( michael@0: IXpsOMGeometryFigureCollection* figures, michael@0: BOOL stroke, BOOL fill, const SkPath& path); michael@0: michael@0: HRESULT createPath( michael@0: IXpsOMGeometryFigure* figure, michael@0: IXpsOMVisualCollection* visuals, michael@0: IXpsOMPath** path); michael@0: michael@0: HRESULT sideOfClamp( michael@0: const SkRect& leftPoints, const XPS_RECT& left, michael@0: IXpsOMImageResource* imageResource, michael@0: IXpsOMVisualCollection* visuals); michael@0: michael@0: HRESULT cornerOfClamp( michael@0: const SkRect& tlPoints, michael@0: const SkColor color, michael@0: IXpsOMVisualCollection* visuals); michael@0: michael@0: HRESULT clip( michael@0: IXpsOMVisual* xpsVisual, michael@0: const SkDraw& d); michael@0: HRESULT clipToPath( michael@0: IXpsOMVisual* xpsVisual, michael@0: const SkPath& clipPath, michael@0: XPS_FILL_RULE fillRule); michael@0: michael@0: HRESULT drawInverseWindingPath( michael@0: const SkDraw& d, michael@0: const SkPath& devicePath, michael@0: IXpsOMPath* xpsPath); michael@0: michael@0: HRESULT shadePath( michael@0: IXpsOMPath* shadedPath, michael@0: const SkPaint& shaderPaint, michael@0: const SkMatrix& matrix, michael@0: BOOL* fill, BOOL* stroke); michael@0: michael@0: void convertToPpm( michael@0: const SkMaskFilter* filter, michael@0: SkMatrix* matrix, michael@0: SkVector* ppuScale, michael@0: const SkIRect& clip, SkIRect* clipIRect); michael@0: michael@0: HRESULT applyMask( michael@0: const SkDraw& d, michael@0: const SkMask& mask, michael@0: const SkVector& ppuScale, michael@0: IXpsOMPath* shadedPath); michael@0: michael@0: virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE; michael@0: michael@0: // Disable the default copy and assign implementation. michael@0: SkXPSDevice(const SkXPSDevice&); michael@0: void operator=(const SkXPSDevice&); michael@0: michael@0: typedef SkBitmapDevice INHERITED; michael@0: }; michael@0: michael@0: #endif