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