| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkCanvas_DEFINED | 8 #ifndef SkCanvas_DEFINED |
| 9 #define SkCanvas_DEFINED | 9 #define SkCanvas_DEFINED |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 class SkMetaData; | 30 class SkMetaData; |
| 31 class SkPath; | 31 class SkPath; |
| 32 class SkPicture; | 32 class SkPicture; |
| 33 class SkPixmap; | 33 class SkPixmap; |
| 34 class SkRRect; | 34 class SkRRect; |
| 35 struct SkRSXform; | 35 struct SkRSXform; |
| 36 class SkSurface; | 36 class SkSurface; |
| 37 class SkSurface_Base; | 37 class SkSurface_Base; |
| 38 class SkTextBlob; | 38 class SkTextBlob; |
| 39 | 39 |
| 40 /* |
| 41 * If you want the legacy cliptolayer flag (i.e. android), then you must have t
he new |
| 42 * legacy saveflags. |
| 43 */ |
| 44 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 45 #ifndef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 46 #define SK_SUPPORT_LEGACY_SAVEFLAGS |
| 47 #endif |
| 48 #endif |
| 49 |
| 40 /** \class SkCanvas | 50 /** \class SkCanvas |
| 41 | 51 |
| 42 A Canvas encapsulates all of the state about drawing into a device (bitmap). | 52 A Canvas encapsulates all of the state about drawing into a device (bitmap). |
| 43 This includes a reference to the device itself, and a stack of matrix/clip | 53 This includes a reference to the device itself, and a stack of matrix/clip |
| 44 values. For any given draw call (e.g. drawRect), the geometry of the object | 54 values. For any given draw call (e.g. drawRect), the geometry of the object |
| 45 being drawn is transformed by the concatenation of all the matrices in the | 55 being drawn is transformed by the concatenation of all the matrices in the |
| 46 stack. The transformed geometry is clipped by the intersection of all of | 56 stack. The transformed geometry is clipped by the intersection of all of |
| 47 the clips in the stack. | 57 the clips in the stack. |
| 48 | 58 |
| 49 While the Canvas holds the state of the drawing device, the state (style) | 59 While the Canvas holds the state of the drawing device, the state (style) |
| 50 of the object being drawn is held by the Paint, which is provided as a | 60 of the object being drawn is held by the Paint, which is provided as a |
| 51 parameter to each of the draw() methods. The Paint holds attributes such as | 61 parameter to each of the draw() methods. The Paint holds attributes such as |
| 52 color, typeface, textSize, strokeWidth, shader (e.g. gradients, patterns), | 62 color, typeface, textSize, strokeWidth, shader (e.g. gradients, patterns), |
| 53 etc. | 63 etc. |
| 54 */ | 64 */ |
| 55 class SK_API SkCanvas : public SkRefCnt { | 65 class SK_API SkCanvas : public SkRefCnt { |
| 66 enum PrivateSaveLayerFlags { |
| 67 kDontClipToLayer_PrivateSaveLayerFlag = 1 << 31, |
| 68 }; |
| 69 |
| 56 public: | 70 public: |
| 57 /** | 71 /** |
| 58 * Attempt to allocate raster canvas, matching the ImageInfo, that will dra
w directly into the | 72 * Attempt to allocate raster canvas, matching the ImageInfo, that will dra
w directly into the |
| 59 * specified pixels. To access the pixels after drawing to them, the caller
should call | 73 * specified pixels. To access the pixels after drawing to them, the caller
should call |
| 60 * flush() or call peekPixels(...). | 74 * flush() or call peekPixels(...). |
| 61 * | 75 * |
| 62 * On failure, return NULL. This can fail for several reasons: | 76 * On failure, return NULL. This can fail for several reasons: |
| 63 * 1. invalid ImageInfo (e.g. negative dimensions) | 77 * 1. invalid ImageInfo (e.g. negative dimensions) |
| 64 * 2. unsupported ImageInfo for a canvas | 78 * 2. unsupported ImageInfo for a canvas |
| 65 * - kUnknown_SkColorType, kIndex_8_SkColorType | 79 * - kUnknown_SkColorType, kIndex_8_SkColorType |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 bool writePixels(const SkImageInfo&, const void* pixels, size_t rowBytes, in
t x, int y); | 288 bool writePixels(const SkImageInfo&, const void* pixels, size_t rowBytes, in
t x, int y); |
| 275 | 289 |
| 276 /** | 290 /** |
| 277 * Helper for calling writePixels(info, ...) by passing its pixels and rowb
ytes. If the bitmap | 291 * Helper for calling writePixels(info, ...) by passing its pixels and rowb
ytes. If the bitmap |
| 278 * is just wrapping a texture, returns false and does nothing. | 292 * is just wrapping a texture, returns false and does nothing. |
| 279 */ | 293 */ |
| 280 bool writePixels(const SkBitmap& bitmap, int x, int y); | 294 bool writePixels(const SkBitmap& bitmap, int x, int y); |
| 281 | 295 |
| 282 /////////////////////////////////////////////////////////////////////////// | 296 /////////////////////////////////////////////////////////////////////////// |
| 283 | 297 |
| 298 #ifdef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 284 enum SaveFlags { | 299 enum SaveFlags { |
| 285 /** save the matrix state, restoring it on restore() */ | 300 /** save the matrix state, restoring it on restore() */ |
| 286 // [deprecated] kMatrix_SaveFlag = 0x01, | 301 // [deprecated] kMatrix_SaveFlag = 0x01, |
| 287 kMatrix_SaveFlag = 0x01, | 302 kMatrix_SaveFlag = 0x01, |
| 288 /** save the clip state, restoring it on restore() */ | 303 /** save the clip state, restoring it on restore() */ |
| 289 // [deprecated] kClip_SaveFlag = 0x02, | 304 // [deprecated] kClip_SaveFlag = 0x02, |
| 290 kClip_SaveFlag = 0x02, | 305 kClip_SaveFlag = 0x02, |
| 291 /** the layer needs to support per-pixel alpha */ | 306 /** the layer needs to support per-pixel alpha */ |
| 292 kHasAlphaLayer_SaveFlag = 0x04, | 307 kHasAlphaLayer_SaveFlag = 0x04, |
| 293 /** the layer needs to support 8-bits per color component */ | 308 /** the layer needs to support 8-bits per color component */ |
| 294 kFullColorLayer_SaveFlag = 0x08, | 309 kFullColorLayer_SaveFlag = 0x08, |
| 295 /** | 310 /** |
| 296 * the layer should clip against the bounds argument | 311 * the layer should clip against the bounds argument |
| 297 * | 312 * |
| 298 * if SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG is undefined, this is treated a
s always on. | 313 * if SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG is undefined, this is treated a
s always on. |
| 299 */ | 314 */ |
| 300 kClipToLayer_SaveFlag = 0x10, | 315 kClipToLayer_SaveFlag = 0x10, |
| 301 | 316 |
| 302 // helper masks for common choices | 317 // helper masks for common choices |
| 303 // [deprecated] kMatrixClip_SaveFlag = 0x03, | 318 // [deprecated] kMatrixClip_SaveFlag = 0x03, |
| 304 kMatrixClip_SaveFlag = 0x03, | 319 kMatrixClip_SaveFlag = 0x03, |
| 305 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 320 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 306 kARGB_NoClipLayer_SaveFlag = 0x0F, | 321 kARGB_NoClipLayer_SaveFlag = 0x0F, |
| 307 #endif | 322 #endif |
| 308 kARGB_ClipLayer_SaveFlag = 0x1F | 323 kARGB_ClipLayer_SaveFlag = 0x1F |
| 309 }; | 324 }; |
| 325 #endif |
| 310 | 326 |
| 311 /** This call saves the current matrix, clip, and drawFilter, and pushes a | 327 /** This call saves the current matrix, clip, and drawFilter, and pushes a |
| 312 copy onto a private stack. Subsequent calls to translate, scale, | 328 copy onto a private stack. Subsequent calls to translate, scale, |
| 313 rotate, skew, concat or clipRect, clipPath, and setDrawFilter all | 329 rotate, skew, concat or clipRect, clipPath, and setDrawFilter all |
| 314 operate on this copy. | 330 operate on this copy. |
| 315 When the balancing call to restore() is made, the previous matrix, clip, | 331 When the balancing call to restore() is made, the previous matrix, clip, |
| 316 and drawFilter are restored. | 332 and drawFilter are restored. |
| 317 | 333 |
| 318 @return The value to pass to restoreToCount() to balance this save() | 334 @return The value to pass to restoreToCount() to balance this save() |
| 319 */ | 335 */ |
| (...skipping 16 matching lines...) Expand all Loading... |
| 336 return this->saveLayer(&bounds, paint); | 352 return this->saveLayer(&bounds, paint); |
| 337 } | 353 } |
| 338 | 354 |
| 339 /** | 355 /** |
| 340 * Temporary name. | 356 * Temporary name. |
| 341 * Will allow any requests for LCD text to be respected, so the caller must
be careful to | 357 * Will allow any requests for LCD text to be respected, so the caller must
be careful to |
| 342 * only draw on top of opaque sections of the layer to get good results. | 358 * only draw on top of opaque sections of the layer to get good results. |
| 343 */ | 359 */ |
| 344 int saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* pa
int); | 360 int saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* pa
int); |
| 345 | 361 |
| 362 #ifdef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 346 /** DEPRECATED - use saveLayer(const SkRect*, const SkPaint*) instead. | 363 /** DEPRECATED - use saveLayer(const SkRect*, const SkPaint*) instead. |
| 347 | 364 |
| 348 This behaves the same as saveLayer(const SkRect*, const SkPaint*), | 365 This behaves the same as saveLayer(const SkRect*, const SkPaint*), |
| 349 but it allows fine-grained control of which state bits to be saved | 366 but it allows fine-grained control of which state bits to be saved |
| 350 (and subsequently restored). | 367 (and subsequently restored). |
| 351 | 368 |
| 352 @param bounds (may be null) This rect, if non-null, is used as a hint to | 369 @param bounds (may be null) This rect, if non-null, is used as a hint to |
| 353 limit the size of the offscreen, and thus drawing may be | 370 limit the size of the offscreen, and thus drawing may be |
| 354 clipped to it, though that clipping is not guaranteed to | 371 clipped to it, though that clipping is not guaranteed to |
| 355 happen. If exact clipping is desired, use clipRect(). | 372 happen. If exact clipping is desired, use clipRect(). |
| 356 @param paint (may be null) This is copied, and is applied to the | 373 @param paint (may be null) This is copied, and is applied to the |
| 357 offscreen when restore() is called | 374 offscreen when restore() is called |
| 358 @param flags LayerFlags | 375 @param flags LayerFlags |
| 359 @return The value to pass to restoreToCount() to balance this save() | 376 @return The value to pass to restoreToCount() to balance this save() |
| 360 */ | 377 */ |
| 361 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") | 378 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") |
| 362 int saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags); | 379 int saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags); |
| 380 #endif |
| 363 | 381 |
| 364 /** This behaves the same as save(), but in addition it allocates an | 382 /** This behaves the same as save(), but in addition it allocates an |
| 365 offscreen bitmap. All drawing calls are directed there, and only when | 383 offscreen bitmap. All drawing calls are directed there, and only when |
| 366 the balancing call to restore() is made is that offscreen transfered to | 384 the balancing call to restore() is made is that offscreen transfered to |
| 367 the canvas (or the previous layer). | 385 the canvas (or the previous layer). |
| 368 @param bounds (may be null) This rect, if non-null, is used as a hint to | 386 @param bounds (may be null) This rect, if non-null, is used as a hint to |
| 369 limit the size of the offscreen, and thus drawing may be | 387 limit the size of the offscreen, and thus drawing may be |
| 370 clipped to it, though that clipping is not guaranteed to | 388 clipped to it, though that clipping is not guaranteed to |
| 371 happen. If exact clipping is desired, use clipRect(). | 389 happen. If exact clipping is desired, use clipRect(). |
| 372 @param alpha This is applied to the offscreen when restore() is called. | 390 @param alpha This is applied to the offscreen when restore() is called. |
| 373 @return The value to pass to restoreToCount() to balance this save() | 391 @return The value to pass to restoreToCount() to balance this save() |
| 374 */ | 392 */ |
| 375 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha); | 393 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha); |
| 376 | 394 |
| 395 #ifdef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 377 /** DEPRECATED - use saveLayerAlpha(const SkRect*, U8CPU) instead. | 396 /** DEPRECATED - use saveLayerAlpha(const SkRect*, U8CPU) instead. |
| 378 | 397 |
| 379 This behaves the same as saveLayerAlpha(const SkRect*, U8CPU), | 398 This behaves the same as saveLayerAlpha(const SkRect*, U8CPU), |
| 380 but it allows fine-grained control of which state bits to be saved | 399 but it allows fine-grained control of which state bits to be saved |
| 381 (and subsequently restored). | 400 (and subsequently restored). |
| 382 | 401 |
| 383 @param bounds (may be null) This rect, if non-null, is used as a hint to | 402 @param bounds (may be null) This rect, if non-null, is used as a hint to |
| 384 limit the size of the offscreen, and thus drawing may be | 403 limit the size of the offscreen, and thus drawing may be |
| 385 clipped to it, though that clipping is not guaranteed to | 404 clipped to it, though that clipping is not guaranteed to |
| 386 happen. If exact clipping is desired, use clipRect(). | 405 happen. If exact clipping is desired, use clipRect(). |
| 387 @param alpha This is applied to the offscreen when restore() is called. | 406 @param alpha This is applied to the offscreen when restore() is called. |
| 388 @param flags LayerFlags | 407 @param flags LayerFlags |
| 389 @return The value to pass to restoreToCount() to balance this save() | 408 @return The value to pass to restoreToCount() to balance this save() |
| 390 */ | 409 */ |
| 391 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") | 410 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") |
| 392 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, SaveFlags flags); | 411 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, SaveFlags flags); |
| 412 #endif |
| 393 | 413 |
| 394 enum { | 414 enum { |
| 395 kIsOpaque_SaveLayerFlag = 1 << 0, | 415 kIsOpaque_SaveLayerFlag = 1 << 0, |
| 396 kPreserveLCDText_SaveLayerFlag = 1 << 1, | 416 kPreserveLCDText_SaveLayerFlag = 1 << 1, |
| 417 |
| 418 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 419 kDontClipToLayer_Legacy_SaveLayerFlag = kDontClipToLayer_PrivateSaveLaye
rFlag, |
| 420 #endif |
| 397 }; | 421 }; |
| 398 typedef uint32_t SaveLayerFlags; | 422 typedef uint32_t SaveLayerFlags; |
| 399 | 423 |
| 400 struct SaveLayerRec { | 424 struct SaveLayerRec { |
| 401 SaveLayerRec() : fBounds(nullptr), fPaint(nullptr), fSaveLayerFlags(0) {
} | 425 SaveLayerRec() : fBounds(nullptr), fPaint(nullptr), fSaveLayerFlags(0) {
} |
| 402 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, SaveLayerFlags
saveLayerFlags = 0) | 426 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, SaveLayerFlags
saveLayerFlags = 0) |
| 403 : fBounds(bounds) | 427 : fBounds(bounds) |
| 404 , fPaint(paint) | 428 , fPaint(paint) |
| 405 , fSaveLayerFlags(saveLayerFlags) | 429 , fSaveLayerFlags(saveLayerFlags) |
| 406 {} | 430 {} |
| (...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 virtual SkCanvas* canvasForDrawIter(); | 1347 virtual SkCanvas* canvasForDrawIter(); |
| 1324 | 1348 |
| 1325 // Clip rectangle bounds. Called internally by saveLayer. | 1349 // Clip rectangle bounds. Called internally by saveLayer. |
| 1326 // returns false if the entire rectangle is entirely clipped out | 1350 // returns false if the entire rectangle is entirely clipped out |
| 1327 // If non-NULL, The imageFilter parameter will be used to expand the clip | 1351 // If non-NULL, The imageFilter parameter will be used to expand the clip |
| 1328 // and offscreen bounds for any margin required by the filter DAG. | 1352 // and offscreen bounds for any margin required by the filter DAG. |
| 1329 bool clipRectBounds(const SkRect* bounds, SaveLayerFlags, SkIRect* intersect
ion, | 1353 bool clipRectBounds(const SkRect* bounds, SaveLayerFlags, SkIRect* intersect
ion, |
| 1330 const SkImageFilter* imageFilter = NULL); | 1354 const SkImageFilter* imageFilter = NULL); |
| 1331 | 1355 |
| 1332 private: | 1356 private: |
| 1333 enum PrivateSaveLayerFlags { | |
| 1334 kDontClipToLayer_PrivateSaveLayerFlag = 1 << 31, | |
| 1335 }; | |
| 1336 | |
| 1337 static bool BoundsAffectsClip(SaveLayerFlags); | 1357 static bool BoundsAffectsClip(SaveLayerFlags); |
| 1358 #ifdef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 1338 static uint32_t SaveFlagsToSaveLayerFlags(SaveFlags); | 1359 static uint32_t SaveFlagsToSaveLayerFlags(SaveFlags); |
| 1360 #endif |
| 1361 static SaveLayerFlags LegacySaveFlagsToSaveLayerFlags(uint32_t legacySaveFla
gs); |
| 1339 | 1362 |
| 1340 enum ShaderOverrideOpacity { | 1363 enum ShaderOverrideOpacity { |
| 1341 kNone_ShaderOverrideOpacity, //!< there is no overriding shader (
bitmap or image) | 1364 kNone_ShaderOverrideOpacity, //!< there is no overriding shader (
bitmap or image) |
| 1342 kOpaque_ShaderOverrideOpacity, //!< the overriding shader is opaque | 1365 kOpaque_ShaderOverrideOpacity, //!< the overriding shader is opaque |
| 1343 kNotOpaque_ShaderOverrideOpacity, //!< the overriding shader may not b
e opaque | 1366 kNotOpaque_ShaderOverrideOpacity, //!< the overriding shader may not b
e opaque |
| 1344 }; | 1367 }; |
| 1345 | 1368 |
| 1346 // notify our surface (if we have one) that we are about to draw, so it | 1369 // notify our surface (if we have one) that we are about to draw, so it |
| 1347 // can perform copy-on-write or invalidate any cached images | 1370 // can perform copy-on-write or invalidate any cached images |
| 1348 void predrawNotify(bool willOverwritesEntireSurface = false); | 1371 void predrawNotify(bool willOverwritesEntireSurface = false); |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 // the caller must respect the restrictions associated with peekPixels(). | 1590 // the caller must respect the restrictions associated with peekPixels(). |
| 1568 bool asROBitmap(SkBitmap*) const; | 1591 bool asROBitmap(SkBitmap*) const; |
| 1569 | 1592 |
| 1570 private: | 1593 private: |
| 1571 SkBitmap fBitmap; // used if peekPixels() fails | 1594 SkBitmap fBitmap; // used if peekPixels() fails |
| 1572 const void* fAddr; // NULL on failure | 1595 const void* fAddr; // NULL on failure |
| 1573 SkImageInfo fInfo; | 1596 SkImageInfo fInfo; |
| 1574 size_t fRowBytes; | 1597 size_t fRowBytes; |
| 1575 }; | 1598 }; |
| 1576 | 1599 |
| 1600 #ifdef SK_SUPPORT_LEGACY_SAVEFLAGS |
| 1577 static inline SkCanvas::SaveFlags operator|(const SkCanvas::SaveFlags lhs, | 1601 static inline SkCanvas::SaveFlags operator|(const SkCanvas::SaveFlags lhs, |
| 1578 const SkCanvas::SaveFlags rhs) { | 1602 const SkCanvas::SaveFlags rhs) { |
| 1579 return static_cast<SkCanvas::SaveFlags>(static_cast<int>(lhs) | static_cast<
int>(rhs)); | 1603 return static_cast<SkCanvas::SaveFlags>(static_cast<int>(lhs) | static_cast<
int>(rhs)); |
| 1580 } | 1604 } |
| 1581 | 1605 |
| 1582 static inline SkCanvas::SaveFlags& operator|=(SkCanvas::SaveFlags& lhs, | 1606 static inline SkCanvas::SaveFlags& operator|=(SkCanvas::SaveFlags& lhs, |
| 1583 const SkCanvas::SaveFlags rhs) { | 1607 const SkCanvas::SaveFlags rhs) { |
| 1584 lhs = lhs | rhs; | 1608 lhs = lhs | rhs; |
| 1585 return lhs; | 1609 return lhs; |
| 1586 } | 1610 } |
| 1611 #endif |
| 1587 | 1612 |
| 1588 class SkCanvasClipVisitor { | 1613 class SkCanvasClipVisitor { |
| 1589 public: | 1614 public: |
| 1590 virtual ~SkCanvasClipVisitor(); | 1615 virtual ~SkCanvasClipVisitor(); |
| 1591 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0; | 1616 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0; |
| 1592 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0; | 1617 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0; |
| 1593 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0; | 1618 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0; |
| 1594 }; | 1619 }; |
| 1595 | 1620 |
| 1596 #endif | 1621 #endif |
| OLD | NEW |