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