Home | History | Annotate | Download | only in xps
      1 /*
      2  * Copyright 2011 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 #ifndef SkXPSDevice_DEFINED
      9 #define SkXPSDevice_DEFINED
     10 
     11 #include "SkTypes.h"
     12 #include <ObjBase.h>
     13 #include <XpsObjectModel.h>
     14 
     15 #include "SkAutoCoInitialize.h"
     16 #include "SkBitSet.h"
     17 #include "SkCanvas.h"
     18 #include "SkColor.h"
     19 #include "SkDevice.h"
     20 #include "SkPaint.h"
     21 #include "SkPath.h"
     22 #include "SkPoint.h"
     23 #include "SkShader.h"
     24 #include "SkSize.h"
     25 #include "SkTArray.h"
     26 #include "SkTScopedComPtr.h"
     27 #include "SkTypeface.h"
     28 
     29 /** \class SkXPSDevice
     30 
     31     The drawing context for the XPS backend.
     32 */
     33 class SkXPSDevice : public SkDevice {
     34 public:
     35     SK_API SkXPSDevice();
     36     SK_API virtual ~SkXPSDevice();
     37 
     38     virtual bool beginPortfolio(SkWStream* outputStream);
     39     /**
     40       @param unitsPerMeter converts geometry units into physical units.
     41       @param pixelsPerMeter resolution to use when geometry must be rasterized.
     42       @param trimSize final page size in physical units.
     43                       The top left of the trim is the origin of physical space.
     44       @param mediaBox The size of the physical media in physical units.
     45                       The top and left must be less than zero.
     46                       The bottom and right must be greater than the trimSize.
     47                       The default is to coincide with the trimSize.
     48       @param bleedBox The size of the bleed box in physical units.
     49                       Must be contained within the mediaBox.
     50                       The default is to coincide with the mediaBox.
     51       @param artBox The size of the content box in physical units.
     52                     Must be contained within the trimSize.
     53                     The default is to coincide with the trimSize.
     54       @param cropBox The size of the recommended view port in physical units.
     55                      Must be contained within the mediaBox.
     56                      The default is to coincide with the mediaBox.
     57      */
     58     virtual bool beginSheet(
     59         const SkVector& unitsPerMeter,
     60         const SkVector& pixelsPerMeter,
     61         const SkSize& trimSize,
     62         const SkRect* mediaBox = NULL,
     63         const SkRect* bleedBox = NULL,
     64         const SkRect* artBox = NULL,
     65         const SkRect* cropBox = NULL);
     66 
     67     virtual bool endSheet();
     68     virtual bool endPortfolio();
     69 
     70     virtual uint32_t getDeviceCapabilities() SK_OVERRIDE;
     71 
     72 protected:
     73     virtual void clear(SkColor color) SK_OVERRIDE;
     74 
     75     virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE;
     76 
     77     virtual void drawPoints(
     78         const SkDraw&,
     79         SkCanvas::PointMode mode,
     80         size_t count, const SkPoint[],
     81         const SkPaint& paint) SK_OVERRIDE;
     82 
     83     virtual void drawRect(
     84         const SkDraw&,
     85         const SkRect& r,
     86         const SkPaint& paint) SK_OVERRIDE;
     87 
     88     virtual void drawPath(
     89         const SkDraw&,
     90         const SkPath& platonicPath,
     91         const SkPaint& paint,
     92         const SkMatrix* prePathMatrix,
     93         bool pathIsMutable) SK_OVERRIDE;
     94 
     95     virtual void drawBitmap(
     96         const SkDraw&,
     97         const SkBitmap& bitmap,
     98         const SkIRect* srcRectOrNull,
     99         const SkMatrix& matrix,
    100         const SkPaint& paint) SK_OVERRIDE;
    101 
    102     virtual void drawSprite(
    103         const SkDraw&,
    104         const SkBitmap& bitmap,
    105         int x, int y,
    106         const SkPaint& paint) SK_OVERRIDE;
    107 
    108     virtual void drawText(
    109         const SkDraw&,
    110         const void* text, size_t len,
    111         SkScalar x, SkScalar y,
    112         const SkPaint& paint) SK_OVERRIDE;
    113 
    114     virtual void drawPosText(
    115         const SkDraw&,
    116         const void* text, size_t len,
    117         const SkScalar pos[], SkScalar constY, int scalarsPerPos,
    118         const SkPaint& paint) SK_OVERRIDE;
    119 
    120     virtual void drawTextOnPath(
    121         const SkDraw&,
    122         const void* text, size_t len,
    123         const SkPath& path,
    124         const SkMatrix* matrix,
    125         const SkPaint& paint) SK_OVERRIDE;
    126 
    127     virtual void drawVertices(
    128         const SkDraw&,
    129         SkCanvas::VertexMode,
    130         int vertexCount, const SkPoint verts[],
    131         const SkPoint texs[], const SkColor colors[],
    132         SkXfermode* xmode,
    133         const uint16_t indices[], int indexCount,
    134         const SkPaint& paint) SK_OVERRIDE;
    135 
    136     virtual void drawDevice(
    137         const SkDraw&,
    138         SkDevice* device,
    139         int x, int y,
    140         const SkPaint& paint) SK_OVERRIDE;
    141 
    142     virtual bool onReadPixels(const SkBitmap& bitmap,
    143                               int x,
    144                               int y,
    145                               SkCanvas::Config8888) SK_OVERRIDE;
    146 
    147     virtual bool allowImageFilter(SkImageFilter*) SK_OVERRIDE;
    148 
    149 private:
    150     class TypefaceUse : ::SkNoncopyable {
    151     public:
    152         SkFontID typefaceId;
    153         SkStream* fontData;
    154         IXpsOMFontResource* xpsFont;
    155         SkBitSet* glyphsUsed;
    156 
    157         explicit TypefaceUse();
    158         ~TypefaceUse();
    159     };
    160     friend static HRESULT subset_typeface(TypefaceUse* current);
    161 
    162     SkXPSDevice(IXpsOMObjectFactory* xpsFactory);
    163 
    164     SkAutoCoInitialize fAutoCo;
    165     SkTScopedComPtr<IXpsOMObjectFactory> fXpsFactory;
    166     SkTScopedComPtr<IStream> fOutputStream;
    167     SkTScopedComPtr<IXpsOMPackageWriter> fPackageWriter;
    168 
    169     unsigned int fCurrentPage;
    170     SkTScopedComPtr<IXpsOMCanvas> fCurrentXpsCanvas;
    171     SkSize fCurrentCanvasSize;
    172     SkVector fCurrentUnitsPerMeter;
    173     SkVector fCurrentPixelsPerMeter;
    174 
    175     SkTArray<TypefaceUse, true> fTypefaces;
    176 
    177     HRESULT initXpsDocumentWriter(IXpsOMImageResource* image);
    178 
    179     HRESULT createXpsPage(
    180         const XPS_SIZE& pageSize,
    181         IXpsOMPage** page);
    182 
    183     HRESULT createXpsThumbnail(
    184         IXpsOMPage* page, const unsigned int pageNumber,
    185         IXpsOMImageResource** image);
    186 
    187     void internalDrawRect(
    188         const SkDraw&,
    189         const SkRect& r,
    190         bool transformRect,
    191         const SkPaint& paint);
    192 
    193     HRESULT createXpsBrush(
    194         const SkPaint& skPaint,
    195         IXpsOMBrush** xpsBrush,
    196         const SkMatrix* parentTransform = NULL);
    197 
    198     HRESULT createXpsSolidColorBrush(
    199         const SkColor skColor, const SkAlpha alpha,
    200         IXpsOMBrush** xpsBrush);
    201 
    202     HRESULT createXpsImageBrush(
    203         const SkBitmap& bitmap,
    204         const SkMatrix& localMatrix,
    205         const SkShader::TileMode (&xy)[2],
    206         const SkAlpha alpha,
    207         IXpsOMTileBrush** xpsBrush);
    208 
    209     HRESULT createXpsLinearGradient(
    210         SkShader::GradientInfo info,
    211         const SkAlpha alpha,
    212         const SkMatrix& localMatrix,
    213         IXpsOMMatrixTransform* xpsMatrixToUse,
    214         IXpsOMBrush** xpsBrush);
    215 
    216     HRESULT createXpsRadialGradient(
    217         SkShader::GradientInfo info,
    218         const SkAlpha alpha,
    219         const SkMatrix& localMatrix,
    220         IXpsOMMatrixTransform* xpsMatrixToUse,
    221         IXpsOMBrush** xpsBrush);
    222 
    223     HRESULT createXpsGradientStop(
    224         const SkColor skColor,
    225         const SkScalar offset,
    226         IXpsOMGradientStop** xpsGradStop);
    227 
    228     HRESULT createXpsTransform(
    229         const SkMatrix& matrix,
    230         IXpsOMMatrixTransform ** xpsTransform);
    231 
    232     HRESULT createXpsRect(
    233         const SkRect& rect,
    234         BOOL stroke, BOOL fill,
    235         IXpsOMGeometryFigure** xpsRect);
    236 
    237     HRESULT createXpsQuad(
    238         const SkPoint (&points)[4],
    239         BOOL stroke, BOOL fill,
    240         IXpsOMGeometryFigure** xpsQuad);
    241 
    242     HRESULT CreateTypefaceUse(
    243         const SkPaint& paint,
    244         TypefaceUse** fontResource);
    245 
    246     HRESULT AddGlyphs(
    247         const SkDraw& d,
    248         IXpsOMObjectFactory* xpsFactory,
    249         IXpsOMCanvas* canvas,
    250         IXpsOMFontResource* font,
    251         LPCWSTR text,
    252         XPS_GLYPH_INDEX* xpsGlyphs,
    253         UINT32 xpsGlyphsLen,
    254         XPS_POINT *origin,
    255         FLOAT fontSize,
    256         XPS_STYLE_SIMULATION sims,
    257         const SkMatrix& transform,
    258         const SkPaint& paint);
    259 
    260     HRESULT addXpsPathGeometry(
    261         IXpsOMGeometryFigureCollection* figures,
    262         BOOL stroke, BOOL fill, const SkPath& path);
    263 
    264     HRESULT createPath(
    265         IXpsOMGeometryFigure* figure,
    266         IXpsOMVisualCollection* visuals,
    267         IXpsOMPath** path);
    268 
    269     HRESULT sideOfClamp(
    270         const SkRect& leftPoints, const XPS_RECT& left,
    271         IXpsOMImageResource* imageResource,
    272         IXpsOMVisualCollection* visuals);
    273 
    274     HRESULT cornerOfClamp(
    275         const SkRect& tlPoints,
    276         const SkColor color,
    277         IXpsOMVisualCollection* visuals);
    278 
    279     HRESULT clip(
    280         IXpsOMVisual* xpsVisual,
    281         const SkDraw& d);
    282     HRESULT clipToPath(
    283         IXpsOMVisual* xpsVisual,
    284         const SkPath& clipPath,
    285         XPS_FILL_RULE fillRule);
    286 
    287     HRESULT drawInverseWindingPath(
    288         const SkDraw& d,
    289         const SkPath& devicePath,
    290         IXpsOMPath* xpsPath);
    291 
    292     HRESULT shadePath(
    293         IXpsOMPath* shadedPath,
    294         const SkPaint& shaderPaint,
    295         const SkMatrix& matrix,
    296         BOOL* fill, BOOL* stroke);
    297 
    298     void convertToPpm(
    299         const SkMaskFilter* filter,
    300         SkMatrix* matrix,
    301         SkVector* ppuScale,
    302         const SkIRect& clip, SkIRect* clipIRect);
    303 
    304     HRESULT applyMask(
    305         const SkDraw& d,
    306         const SkMask& mask,
    307         const SkVector& ppuScale,
    308         IXpsOMPath* shadedPath);
    309 
    310     // override from SkDevice
    311     virtual SkDevice* onCreateCompatibleDevice(
    312         SkBitmap::Config config,
    313         int width, int height,
    314         bool isOpaque,
    315         Usage usage) SK_OVERRIDE;
    316 
    317     // Disable the default copy and assign implementation.
    318     SkXPSDevice(const SkXPSDevice&);
    319     void operator=(const SkXPSDevice&);
    320 
    321     typedef SkDevice INHERITED;
    322 };
    323 
    324 #endif
    325