OLD | NEW |
1 | |
2 | |
3 /* | 1 /* |
4 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
5 * | 3 * |
6 * 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 |
7 * found in the LICENSE file. | 5 * found in the LICENSE file. |
8 */ | 6 */ |
9 | 7 |
10 | |
11 #ifndef SkPaint_DEFINED | 8 #ifndef SkPaint_DEFINED |
12 #define SkPaint_DEFINED | 9 #define SkPaint_DEFINED |
13 | 10 |
14 #include "SkColor.h" | 11 #include "SkPaintParts.h" |
15 #include "SkDrawLooper.h" | 12 #include "SkDrawLooper.h" |
16 #include "SkMatrix.h" | 13 #include "SkMatrix.h" |
17 #include "SkXfermode.h" | 14 #include "SkXfermode.h" |
| 15 |
18 #ifdef SK_BUILD_FOR_ANDROID | 16 #ifdef SK_BUILD_FOR_ANDROID |
19 #include "SkPaintOptionsAndroid.h" | 17 #include "SkPaintOptionsAndroid.h" |
20 #endif | 18 #endif |
21 | 19 |
22 class SkAnnotation; | |
23 class SkAutoGlyphCache; | |
24 class SkColorFilter; | |
25 class SkDescriptor; | |
26 struct SkDeviceProperties; | |
27 class SkReadBuffer; | |
28 class SkWriteBuffer; | |
29 struct SkGlyph; | |
30 struct SkRect; | |
31 class SkGlyphCache; | |
32 class SkImageFilter; | |
33 class SkMaskFilter; | |
34 class SkPath; | |
35 class SkPathEffect; | |
36 struct SkPoint; | |
37 class SkRasterizer; | |
38 class SkShader; | |
39 class SkTypeface; | |
40 | |
41 typedef const SkGlyph& (*SkDrawCacheProc)(SkGlyphCache*, const char**, | 20 typedef const SkGlyph& (*SkDrawCacheProc)(SkGlyphCache*, const char**, |
42 SkFixed x, SkFixed y); | 21 SkFixed x, SkFixed y); |
43 | 22 |
44 typedef const SkGlyph& (*SkMeasureCacheProc)(SkGlyphCache*, const char**); | 23 typedef const SkGlyph& (*SkMeasureCacheProc)(SkGlyphCache*, const char**); |
45 | 24 |
46 #define kBicubicFilterBitmap_Flag kHighQualityFilterBitmap_Flag | 25 #define kBicubicFilterBitmap_Flag kHighQualityFilterBitmap_Flag |
47 | 26 |
48 /** \class SkPaint | 27 /** \class SkPaint |
49 | 28 |
50 The SkPaint class holds the style and color information about how to draw | 29 The SkPaint class holds the style and color information about how to draw |
51 geometries, text and bitmaps. | 30 geometries, text and bitmaps. |
52 */ | 31 */ |
53 | 32 |
54 class SK_API SkPaint { | 33 class SK_API SkPaint { |
55 public: | 34 public: |
56 SkPaint(); | 35 SkPaint(); |
57 SkPaint(const SkPaint& paint); | 36 SkPaint(const SkPaint& paint); |
58 ~SkPaint(); | 37 ~SkPaint(); |
59 | 38 |
| 39 operator const SkPaintParts& () const { return fParts; } |
| 40 |
60 SkPaint& operator=(const SkPaint&); | 41 SkPaint& operator=(const SkPaint&); |
61 | 42 |
62 SK_API friend bool operator==(const SkPaint& a, const SkPaint& b); | 43 SK_API friend bool operator==(const SkPaint& a, const SkPaint& b); |
63 friend bool operator!=(const SkPaint& a, const SkPaint& b) { | 44 friend bool operator!=(const SkPaint& a, const SkPaint& b) { |
64 return !(a == b); | 45 return !(a == b); |
65 } | 46 } |
66 | 47 |
67 void flatten(SkWriteBuffer&) const; | 48 void flatten(SkWriteBuffer&) const; |
68 void unflatten(SkReadBuffer&); | 49 void unflatten(SkReadBuffer&); |
69 | 50 |
(...skipping 11 matching lines...) Expand all Loading... |
81 subpixel glyphs, in which case TARGET_LCD or | 62 subpixel glyphs, in which case TARGET_LCD or |
82 TARGET_LCD_V is used> | 63 TARGET_LCD_V is used> |
83 */ | 64 */ |
84 enum Hinting { | 65 enum Hinting { |
85 kNo_Hinting = 0, | 66 kNo_Hinting = 0, |
86 kSlight_Hinting = 1, | 67 kSlight_Hinting = 1, |
87 kNormal_Hinting = 2, //!< this is the default | 68 kNormal_Hinting = 2, //!< this is the default |
88 kFull_Hinting = 3 | 69 kFull_Hinting = 3 |
89 }; | 70 }; |
90 | 71 |
91 Hinting getHinting() const { | 72 Hinting getHinting() const { return (Hinting)fParts.getHinting(); } |
92 return static_cast<Hinting>(fHinting); | |
93 } | |
94 | |
95 void setHinting(Hinting hintingLevel); | 73 void setHinting(Hinting hintingLevel); |
96 | 74 |
97 /** Specifies the bit values that are stored in the paint's flags. | 75 /** Specifies the bit values that are stored in the paint's flags. |
98 */ | 76 */ |
99 enum Flags { | 77 enum Flags { |
100 kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing | 78 kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing |
101 kDither_Flag = 0x04, //!< mask to enable dithering | 79 kDither_Flag = 0x04, //!< mask to enable dithering |
102 kUnderlineText_Flag = 0x08, //!< mask to enable underline text | 80 kUnderlineText_Flag = 0x08, //!< mask to enable underline text |
103 kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text | 81 kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text |
104 kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text | 82 kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text |
105 kLinearText_Flag = 0x40, //!< mask to enable linear-text | 83 kLinearText_Flag = 0x40, //!< mask to enable linear-text |
106 kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positi
oning | 84 kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positi
oning |
107 kDevKernText_Flag = 0x100, //!< mask to enable device kerning text | 85 kDevKernText_Flag = 0x100, //!< mask to enable device kerning text |
108 kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph rende
rering | 86 kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph rende
rering |
109 kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap st
rikes | 87 kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap st
rikes |
110 kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter | 88 kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter |
111 kVerticalText_Flag = 0x1000, | 89 kVerticalText_Flag = 0x1000, |
112 kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can
help it | 90 kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can
help it |
113 kDistanceFieldTextTEMP_Flag = 0x4000, //!< TEMPORARY mask to enable dist
ance fields | 91 kDistanceFieldTextTEMP_Flag = 0x4000, //!< TEMPORARY mask to enable dist
ance fields |
114 // currently overrides LCD and sub
pixel rendering | 92 // currently overrides LCD and sub
pixel rendering |
115 // when adding extra flags, note that the fFlags member is specified | 93 // when adding extra flags, note that the fFlags member is specified |
116 // with a bit-width and you'll have to expand it. | 94 // with a bit-width and you'll have to expand it. |
117 | 95 |
118 kAllFlags = 0xFFFF | 96 kAllFlags = 0xFFFF |
119 }; | 97 }; |
120 | 98 |
121 /** Return the paint's flags. Use the Flag enum to test flag values. | 99 /** Return the paint's flags. Use the Flag enum to test flag values. |
122 @return the paint's flags (see enums ending in _Flag for bit masks) | 100 @return the paint's flags (see enums ending in _Flag for bit masks) |
123 */ | 101 */ |
124 uint32_t getFlags() const { return fFlags; } | 102 uint32_t getFlags() const { return fParts.getFlags(); } |
125 | 103 |
126 /** Set the paint's flags. Use the Flag enum to specific flag values. | 104 /** Set the paint's flags. Use the Flag enum to specific flag values. |
127 @param flags The new flag bits for the paint (see Flags enum) | 105 @param flags The new flag bits for the paint (see Flags enum) |
128 */ | 106 */ |
129 void setFlags(uint32_t flags); | 107 void setFlags(uint32_t flags); |
130 | 108 |
131 /** Helper for getFlags(), returning true if kAntiAlias_Flag bit is set | 109 /** Helper for getFlags(), returning true if kAntiAlias_Flag bit is set |
132 @return true if the antialias bit is set in the paint's flags. | 110 @return true if the antialias bit is set in the paint's flags. |
133 */ | 111 */ |
134 bool isAntiAlias() const { | 112 bool isAntiAlias() const { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 kNone_FilterLevel, | 273 kNone_FilterLevel, |
296 kLow_FilterLevel, | 274 kLow_FilterLevel, |
297 kMedium_FilterLevel, | 275 kMedium_FilterLevel, |
298 kHigh_FilterLevel | 276 kHigh_FilterLevel |
299 }; | 277 }; |
300 | 278 |
301 /** | 279 /** |
302 * Return the filter level. This affects the quality (and performance) of | 280 * Return the filter level. This affects the quality (and performance) of |
303 * drawing scaled images. | 281 * drawing scaled images. |
304 */ | 282 */ |
305 FilterLevel getFilterLevel() const { return (FilterLevel)fFilterLevel; } | 283 FilterLevel getFilterLevel() const { return (FilterLevel)fParts.getFilterLev
el(); } |
306 | 284 |
307 /** | 285 /** |
308 * Set the filter level. This affects the quality (and performance) of | 286 * Set the filter level. This affects the quality (and performance) of |
309 * drawing scaled images. | 287 * drawing scaled images. |
310 */ | 288 */ |
311 void setFilterLevel(FilterLevel); | 289 void setFilterLevel(FilterLevel); |
312 | 290 |
313 /** | 291 /** |
314 * If the predicate is true, set the filterLevel to Low, else set it to | 292 * If the predicate is true, set the filterLevel to Low, else set it to |
315 * None. | 293 * None. |
(...skipping 27 matching lines...) Expand all Loading... |
343 }; | 321 }; |
344 enum { | 322 enum { |
345 kStyleCount = kStrokeAndFill_Style + 1 | 323 kStyleCount = kStrokeAndFill_Style + 1 |
346 }; | 324 }; |
347 | 325 |
348 /** Return the paint's style, used for controlling how primitives' | 326 /** Return the paint's style, used for controlling how primitives' |
349 geometries are interpreted (except for drawBitmap, which always assumes | 327 geometries are interpreted (except for drawBitmap, which always assumes |
350 kFill_Style). | 328 kFill_Style). |
351 @return the paint's Style | 329 @return the paint's Style |
352 */ | 330 */ |
353 Style getStyle() const { return (Style)fStyle; } | 331 Style getStyle() const { return (Style)fParts.getStyle(); } |
354 | 332 |
355 /** Set the paint's style, used for controlling how primitives' | 333 /** Set the paint's style, used for controlling how primitives' |
356 geometries are interpreted (except for drawBitmap, which always assumes | 334 geometries are interpreted (except for drawBitmap, which always assumes |
357 Fill). | 335 Fill). |
358 @param style The new style to set in the paint | 336 @param style The new style to set in the paint |
359 */ | 337 */ |
360 void setStyle(Style style); | 338 void setStyle(Style style); |
361 | 339 |
362 /** Return the paint's color. Note that the color is a 32bit value | 340 /** Return the paint's color. Note that the color is a 32bit value |
363 containing alpha as well as r,g,b. This 32bit value is not | 341 containing alpha as well as r,g,b. This 32bit value is not |
364 premultiplied, meaning that its alpha can be any value, regardless of | 342 premultiplied, meaning that its alpha can be any value, regardless of |
365 the values of r,g,b. | 343 the values of r,g,b. |
366 @return the paint's color (and alpha). | 344 @return the paint's color (and alpha). |
367 */ | 345 */ |
368 SkColor getColor() const { return fColor; } | 346 SkColor getColor() const { return fParts.fColor; } |
369 | 347 |
370 /** Set the paint's color. Note that the color is a 32bit value containing | 348 /** Set the paint's color. Note that the color is a 32bit value containing |
371 alpha as well as r,g,b. This 32bit value is not premultiplied, meaning | 349 alpha as well as r,g,b. This 32bit value is not premultiplied, meaning |
372 that its alpha can be any value, regardless of the values of r,g,b. | 350 that its alpha can be any value, regardless of the values of r,g,b. |
373 @param color The new color (including alpha) to set in the paint. | 351 @param color The new color (including alpha) to set in the paint. |
374 */ | 352 */ |
375 void setColor(SkColor color); | 353 void setColor(SkColor color); |
376 | 354 |
377 /** Helper to getColor() that just returns the color's alpha value. | 355 /** Helper to getColor() that just returns the color's alpha value. |
378 @return the alpha component of the paint's color. | 356 @return the alpha component of the paint's color. |
379 */ | 357 */ |
380 uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); } | 358 uint8_t getAlpha() const { return SkToU8(SkColorGetA(this->getColor())); } |
381 | 359 |
382 /** Helper to setColor(), that only assigns the color's alpha value, | 360 /** Helper to setColor(), that only assigns the color's alpha value, |
383 leaving its r,g,b values unchanged. | 361 leaving its r,g,b values unchanged. |
384 @param a set the alpha component (0..255) of the paint's color. | 362 @param a set the alpha component (0..255) of the paint's color. |
385 */ | 363 */ |
386 void setAlpha(U8CPU a); | 364 void setAlpha(U8CPU a); |
387 | 365 |
388 /** Helper to setColor(), that takes a,r,g,b and constructs the color value | 366 /** Helper to setColor(), that takes a,r,g,b and constructs the color value |
389 using SkColorSetARGB() | 367 using SkColorSetARGB() |
390 @param a The new alpha component (0..255) of the paint's color. | 368 @param a The new alpha component (0..255) of the paint's color. |
391 @param r The new red component (0..255) of the paint's color. | 369 @param r The new red component (0..255) of the paint's color. |
392 @param g The new green component (0..255) of the paint's color. | 370 @param g The new green component (0..255) of the paint's color. |
393 @param b The new blue component (0..255) of the paint's color. | 371 @param b The new blue component (0..255) of the paint's color. |
394 */ | 372 */ |
395 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b); | 373 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b); |
396 | 374 |
397 /** Return the width for stroking. | 375 /** Return the width for stroking. |
398 <p /> | 376 <p /> |
399 A value of 0 strokes in hairline mode. | 377 A value of 0 strokes in hairline mode. |
400 Hairlines always draw 1-pixel wide, regardless of the matrix. | 378 Hairlines always draw 1-pixel wide, regardless of the matrix. |
401 @return the paint's stroke width, used whenever the paint's style is | 379 @return the paint's stroke width, used whenever the paint's style is |
402 Stroke or StrokeAndFill. | 380 Stroke or StrokeAndFill. |
403 */ | 381 */ |
404 SkScalar getStrokeWidth() const { return fWidth; } | 382 SkScalar getStrokeWidth() const { return fParts.getStrokeWidth(); } |
405 | 383 |
406 /** Set the width for stroking. | 384 /** Set the width for stroking. |
407 Pass 0 to stroke in hairline mode. | 385 Pass 0 to stroke in hairline mode. |
408 Hairlines always draw 1-pixel wide, regardless of the matrix. | 386 Hairlines always draw 1-pixel wide, regardless of the matrix. |
409 @param width set the paint's stroke width, used whenever the paint's | 387 @param width set the paint's stroke width, used whenever the paint's |
410 style is Stroke or StrokeAndFill. | 388 style is Stroke or StrokeAndFill. |
411 */ | 389 */ |
412 void setStrokeWidth(SkScalar width); | 390 void setStrokeWidth(SkScalar width); |
413 | 391 |
414 /** Return the paint's stroke miter value. This is used to control the | 392 /** Return the paint's stroke miter value. This is used to control the |
415 behavior of miter joins when the joins angle is sharp. | 393 behavior of miter joins when the joins angle is sharp. |
416 @return the paint's miter limit, used whenever the paint's style is | 394 @return the paint's miter limit, used whenever the paint's style is |
417 Stroke or StrokeAndFill. | 395 Stroke or StrokeAndFill. |
418 */ | 396 */ |
419 SkScalar getStrokeMiter() const { return fMiterLimit; } | 397 SkScalar getStrokeMiter() const { return fParts.getStrokeMiter(); } |
420 | 398 |
421 /** Set the paint's stroke miter value. This is used to control the | 399 /** Set the paint's stroke miter value. This is used to control the |
422 behavior of miter joins when the joins angle is sharp. This value must | 400 behavior of miter joins when the joins angle is sharp. This value must |
423 be >= 0. | 401 be >= 0. |
424 @param miter set the miter limit on the paint, used whenever the | 402 @param miter set the miter limit on the paint, used whenever the |
425 paint's style is Stroke or StrokeAndFill. | 403 paint's style is Stroke or StrokeAndFill. |
426 */ | 404 */ |
427 void setStrokeMiter(SkScalar miter); | 405 void setStrokeMiter(SkScalar miter); |
428 | 406 |
429 /** Cap enum specifies the settings for the paint's strokecap. This is the | 407 /** Cap enum specifies the settings for the paint's strokecap. This is the |
(...skipping 19 matching lines...) Expand all Loading... |
449 | 427 |
450 kJoinCount, | 428 kJoinCount, |
451 kDefault_Join = kMiter_Join | 429 kDefault_Join = kMiter_Join |
452 }; | 430 }; |
453 | 431 |
454 /** Return the paint's stroke cap type, controlling how the start and end | 432 /** Return the paint's stroke cap type, controlling how the start and end |
455 of stroked lines and paths are treated. | 433 of stroked lines and paths are treated. |
456 @return the line cap style for the paint, used whenever the paint's | 434 @return the line cap style for the paint, used whenever the paint's |
457 style is Stroke or StrokeAndFill. | 435 style is Stroke or StrokeAndFill. |
458 */ | 436 */ |
459 Cap getStrokeCap() const { return (Cap)fCapType; } | 437 Cap getStrokeCap() const { return (Cap)fParts.getStrokeCap(); } |
460 | 438 |
461 /** Set the paint's stroke cap type. | 439 /** Set the paint's stroke cap type. |
462 @param cap set the paint's line cap style, used whenever the paint's | 440 @param cap set the paint's line cap style, used whenever the paint's |
463 style is Stroke or StrokeAndFill. | 441 style is Stroke or StrokeAndFill. |
464 */ | 442 */ |
465 void setStrokeCap(Cap cap); | 443 void setStrokeCap(Cap cap); |
466 | 444 |
467 /** Return the paint's stroke join type. | 445 /** Return the paint's stroke join type. |
468 @return the paint's line join style, used whenever the paint's style is | 446 @return the paint's line join style, used whenever the paint's style is |
469 Stroke or StrokeAndFill. | 447 Stroke or StrokeAndFill. |
470 */ | 448 */ |
471 Join getStrokeJoin() const { return (Join)fJoinType; } | 449 Join getStrokeJoin() const { return (Join)fParts.getStrokeJoin(); } |
472 | 450 |
473 /** Set the paint's stroke join type. | 451 /** Set the paint's stroke join type. |
474 @param join set the paint's line join style, used whenever the paint's | 452 @param join set the paint's line join style, used whenever the paint's |
475 style is Stroke or StrokeAndFill. | 453 style is Stroke or StrokeAndFill. |
476 */ | 454 */ |
477 void setStrokeJoin(Join join); | 455 void setStrokeJoin(Join join); |
478 | 456 |
479 /** | 457 /** |
480 * Applies any/all effects (patheffect, stroking) to src, returning the | 458 * Applies any/all effects (patheffect, stroking) to src, returning the |
481 * result in dst. The result is that drawing src with this paint will be | 459 * result in dst. The result is that drawing src with this paint will be |
482 * the same as drawing dst with a default paint (at least from the | 460 * the same as drawing dst with a default paint (at least from the |
483 * geometric perspective). | 461 * geometric perspective). |
484 * | 462 * |
485 * @param src input path | 463 * @param src input path |
486 * @param dst output path (may be the same as src) | 464 * @param dst output path (may be the same as src) |
487 * @param cullRect If not null, the dst path may be culled to this rect. | 465 * @param cullRect If not null, the dst path may be culled to this rect. |
488 * @return true if the path should be filled, or false if it should be | 466 * @return true if the path should be filled, or false if it should be |
489 * drawn with a hairline (width == 0) | 467 * drawn with a hairline (width == 0) |
490 */ | 468 */ |
491 bool getFillPath(const SkPath& src, SkPath* dst, | 469 bool getFillPath(const SkPath& src, SkPath* dst, |
492 const SkRect* cullRect = NULL) const; | 470 const SkRect* cullRect = NULL) const; |
493 | 471 |
494 /** Get the paint's shader object. | 472 /** Get the paint's shader object. |
495 <p /> | 473 <p /> |
496 The shader's reference count is not affected. | 474 The shader's reference count is not affected. |
497 @return the paint's shader (or NULL) | 475 @return the paint's shader (or NULL) |
498 */ | 476 */ |
499 SkShader* getShader() const { return fShader; } | 477 SkShader* getShader() const { return fParts.fShader; } |
500 | 478 |
501 /** Set or clear the shader object. | 479 /** Set or clear the shader object. |
502 * Shaders specify the source color(s) for what is being drawn. If a paint | 480 * Shaders specify the source color(s) for what is being drawn. If a paint |
503 * has no shader, then the paint's color is used. If the paint has a | 481 * has no shader, then the paint's color is used. If the paint has a |
504 * shader, then the shader's color(s) are use instead, but they are | 482 * shader, then the shader's color(s) are use instead, but they are |
505 * modulated by the paint's alpha. This makes it easy to create a shader | 483 * modulated by the paint's alpha. This makes it easy to create a shader |
506 * once (e.g. bitmap tiling or gradient) and then change its transparency | 484 * once (e.g. bitmap tiling or gradient) and then change its transparency |
507 * w/o having to modify the original shader... only the paint's alpha needs | 485 * w/o having to modify the original shader... only the paint's alpha needs |
508 * to be modified. | 486 * to be modified. |
509 * | 487 * |
510 * There is an exception to this only-respect-paint's-alpha rule: If the sh
ader only generates | 488 * There is an exception to this only-respect-paint's-alpha rule: If the sh
ader only generates |
511 * alpha (e.g. SkShader::CreateBitmapShader(bitmap, ...) where bitmap's col
ortype is kAlpha_8) | 489 * alpha (e.g. SkShader::CreateBitmapShader(bitmap, ...) where bitmap's col
ortype is kAlpha_8) |
512 * then the shader will use the paint's entire color to "colorize" its outp
ut (modulating the | 490 * then the shader will use the paint's entire color to "colorize" its outp
ut (modulating the |
513 * bitmap's alpha with the paint's color+alpha). | 491 * bitmap's alpha with the paint's color+alpha). |
514 * | 492 * |
515 * Pass NULL to clear any previous shader. | 493 * Pass NULL to clear any previous shader. |
516 * As a convenience, the parameter passed is also returned. | 494 * As a convenience, the parameter passed is also returned. |
517 * If a previous shader exists, its reference count is decremented. | 495 * If a previous shader exists, its reference count is decremented. |
518 * If shader is not NULL, its reference count is incremented. | 496 * If shader is not NULL, its reference count is incremented. |
519 * @param shader May be NULL. The shader to be installed in the paint | 497 * @param shader May be NULL. The shader to be installed in the paint |
520 * @return shader | 498 * @return shader |
521 */ | 499 */ |
522 SkShader* setShader(SkShader* shader); | 500 SkShader* setShader(SkShader* shader); |
523 | 501 |
524 /** Get the paint's colorfilter. If there is a colorfilter, its reference | 502 /** Get the paint's colorfilter. If there is a colorfilter, its reference |
525 count is not changed. | 503 count is not changed. |
526 @return the paint's colorfilter (or NULL) | 504 @return the paint's colorfilter (or NULL) |
527 */ | 505 */ |
528 SkColorFilter* getColorFilter() const { return fColorFilter; } | 506 SkColorFilter* getColorFilter() const { return fParts.fColorFilter; } |
529 | 507 |
530 /** Set or clear the paint's colorfilter, returning the parameter. | 508 /** Set or clear the paint's colorfilter, returning the parameter. |
531 <p /> | 509 <p /> |
532 If the paint already has a filter, its reference count is decremented. | 510 If the paint already has a filter, its reference count is decremented. |
533 If filter is not NULL, its reference count is incremented. | 511 If filter is not NULL, its reference count is incremented. |
534 @param filter May be NULL. The filter to be installed in the paint | 512 @param filter May be NULL. The filter to be installed in the paint |
535 @return filter | 513 @return filter |
536 */ | 514 */ |
537 SkColorFilter* setColorFilter(SkColorFilter* filter); | 515 SkColorFilter* setColorFilter(SkColorFilter* filter); |
538 | 516 |
539 /** Get the paint's xfermode object. | 517 /** Get the paint's xfermode object. |
540 <p /> | 518 <p /> |
541 The xfermode's reference count is not affected. | 519 The xfermode's reference count is not affected. |
542 @return the paint's xfermode (or NULL) | 520 @return the paint's xfermode (or NULL) |
543 */ | 521 */ |
544 SkXfermode* getXfermode() const { return fXfermode; } | 522 SkXfermode* getXfermode() const { return fParts.fXfermode; } |
545 | 523 |
546 /** Set or clear the xfermode object. | 524 /** Set or clear the xfermode object. |
547 <p /> | 525 <p /> |
548 Pass NULL to clear any previous xfermode. | 526 Pass NULL to clear any previous xfermode. |
549 As a convenience, the parameter passed is also returned. | 527 As a convenience, the parameter passed is also returned. |
550 If a previous xfermode exists, its reference count is decremented. | 528 If a previous xfermode exists, its reference count is decremented. |
551 If xfermode is not NULL, its reference count is incremented. | 529 If xfermode is not NULL, its reference count is incremented. |
552 @param xfermode May be NULL. The new xfermode to be installed in the | 530 @param xfermode May be NULL. The new xfermode to be installed in the |
553 paint | 531 paint |
554 @return xfermode | 532 @return xfermode |
555 */ | 533 */ |
556 SkXfermode* setXfermode(SkXfermode* xfermode); | 534 SkXfermode* setXfermode(SkXfermode* xfermode); |
557 | 535 |
558 /** Create an xfermode based on the specified Mode, and assign it into the | 536 /** Create an xfermode based on the specified Mode, and assign it into the |
559 paint, returning the mode that was set. If the Mode is SrcOver, then | 537 paint, returning the mode that was set. If the Mode is SrcOver, then |
560 the paint's xfermode is set to null. | 538 the paint's xfermode is set to null. |
561 */ | 539 */ |
562 SkXfermode* setXfermodeMode(SkXfermode::Mode); | 540 SkXfermode* setXfermodeMode(SkXfermode::Mode); |
563 | 541 |
564 /** Get the paint's patheffect object. | 542 /** Get the paint's patheffect object. |
565 <p /> | 543 <p /> |
566 The patheffect reference count is not affected. | 544 The patheffect reference count is not affected. |
567 @return the paint's patheffect (or NULL) | 545 @return the paint's patheffect (or NULL) |
568 */ | 546 */ |
569 SkPathEffect* getPathEffect() const { return fPathEffect; } | 547 SkPathEffect* getPathEffect() const { return fParts.fPathEffect; } |
570 | 548 |
571 /** Set or clear the patheffect object. | 549 /** Set or clear the patheffect object. |
572 <p /> | 550 <p /> |
573 Pass NULL to clear any previous patheffect. | 551 Pass NULL to clear any previous patheffect. |
574 As a convenience, the parameter passed is also returned. | 552 As a convenience, the parameter passed is also returned. |
575 If a previous patheffect exists, its reference count is decremented. | 553 If a previous patheffect exists, its reference count is decremented. |
576 If patheffect is not NULL, its reference count is incremented. | 554 If patheffect is not NULL, its reference count is incremented. |
577 @param effect May be NULL. The new patheffect to be installed in the | 555 @param effect May be NULL. The new patheffect to be installed in the |
578 paint | 556 paint |
579 @return effect | 557 @return effect |
580 */ | 558 */ |
581 SkPathEffect* setPathEffect(SkPathEffect* effect); | 559 SkPathEffect* setPathEffect(SkPathEffect* effect); |
582 | 560 |
583 /** Get the paint's maskfilter object. | 561 /** Get the paint's maskfilter object. |
584 <p /> | 562 <p /> |
585 The maskfilter reference count is not affected. | 563 The maskfilter reference count is not affected. |
586 @return the paint's maskfilter (or NULL) | 564 @return the paint's maskfilter (or NULL) |
587 */ | 565 */ |
588 SkMaskFilter* getMaskFilter() const { return fMaskFilter; } | 566 SkMaskFilter* getMaskFilter() const { return fParts.fMaskFilter; } |
589 | 567 |
590 /** Set or clear the maskfilter object. | 568 /** Set or clear the maskfilter object. |
591 <p /> | 569 <p /> |
592 Pass NULL to clear any previous maskfilter. | 570 Pass NULL to clear any previous maskfilter. |
593 As a convenience, the parameter passed is also returned. | 571 As a convenience, the parameter passed is also returned. |
594 If a previous maskfilter exists, its reference count is decremented. | 572 If a previous maskfilter exists, its reference count is decremented. |
595 If maskfilter is not NULL, its reference count is incremented. | 573 If maskfilter is not NULL, its reference count is incremented. |
596 @param maskfilter May be NULL. The new maskfilter to be installed in | 574 @param maskfilter May be NULL. The new maskfilter to be installed in |
597 the paint | 575 the paint |
598 @return maskfilter | 576 @return maskfilter |
599 */ | 577 */ |
600 SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter); | 578 SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter); |
601 | 579 |
602 // These attributes are for text/fonts | 580 // These attributes are for text/fonts |
603 | 581 |
604 /** Get the paint's typeface object. | 582 /** Get the paint's typeface object. |
605 <p /> | 583 <p /> |
606 The typeface object identifies which font to use when drawing or | 584 The typeface object identifies which font to use when drawing or |
607 measuring text. The typeface reference count is not affected. | 585 measuring text. The typeface reference count is not affected. |
608 @return the paint's typeface (or NULL) | 586 @return the paint's typeface (or NULL) |
609 */ | 587 */ |
610 SkTypeface* getTypeface() const { return fTypeface; } | 588 SkTypeface* getTypeface() const { return fParts.fTypeface; } |
611 | 589 |
612 /** Set or clear the typeface object. | 590 /** Set or clear the typeface object. |
613 <p /> | 591 <p /> |
614 Pass NULL to clear any previous typeface. | 592 Pass NULL to clear any previous typeface. |
615 As a convenience, the parameter passed is also returned. | 593 As a convenience, the parameter passed is also returned. |
616 If a previous typeface exists, its reference count is decremented. | 594 If a previous typeface exists, its reference count is decremented. |
617 If typeface is not NULL, its reference count is incremented. | 595 If typeface is not NULL, its reference count is incremented. |
618 @param typeface May be NULL. The new typeface to be installed in the | 596 @param typeface May be NULL. The new typeface to be installed in the |
619 paint | 597 paint |
620 @return typeface | 598 @return typeface |
621 */ | 599 */ |
622 SkTypeface* setTypeface(SkTypeface* typeface); | 600 SkTypeface* setTypeface(SkTypeface* typeface); |
623 | 601 |
624 /** Get the paint's rasterizer (or NULL). | 602 /** Get the paint's rasterizer (or NULL). |
625 <p /> | 603 <p /> |
626 The raster controls how paths/text are turned into alpha masks. | 604 The raster controls how paths/text are turned into alpha masks. |
627 @return the paint's rasterizer (or NULL) | 605 @return the paint's rasterizer (or NULL) |
628 */ | 606 */ |
629 SkRasterizer* getRasterizer() const { return fRasterizer; } | 607 SkRasterizer* getRasterizer() const { return fParts.fRasterizer; } |
630 | 608 |
631 /** Set or clear the rasterizer object. | 609 /** Set or clear the rasterizer object. |
632 <p /> | 610 <p /> |
633 Pass NULL to clear any previous rasterizer. | 611 Pass NULL to clear any previous rasterizer. |
634 As a convenience, the parameter passed is also returned. | 612 As a convenience, the parameter passed is also returned. |
635 If a previous rasterizer exists in the paint, its reference count is | 613 If a previous rasterizer exists in the paint, its reference count is |
636 decremented. If rasterizer is not NULL, its reference count is | 614 decremented. If rasterizer is not NULL, its reference count is |
637 incremented. | 615 incremented. |
638 @param rasterizer May be NULL. The new rasterizer to be installed in | 616 @param rasterizer May be NULL. The new rasterizer to be installed in |
639 the paint. | 617 the paint. |
640 @return rasterizer | 618 @return rasterizer |
641 */ | 619 */ |
642 SkRasterizer* setRasterizer(SkRasterizer* rasterizer); | 620 SkRasterizer* setRasterizer(SkRasterizer* rasterizer); |
643 | 621 |
644 SkImageFilter* getImageFilter() const { return fImageFilter; } | 622 SkImageFilter* getImageFilter() const { return fParts.fImageFilter; } |
645 SkImageFilter* setImageFilter(SkImageFilter*); | 623 SkImageFilter* setImageFilter(SkImageFilter*); |
646 | 624 |
647 SkAnnotation* getAnnotation() const { return fAnnotation; } | 625 SkAnnotation* getAnnotation() const { return fParts.fAnnotation; } |
648 SkAnnotation* setAnnotation(SkAnnotation*); | 626 SkAnnotation* setAnnotation(SkAnnotation*); |
649 | 627 |
650 /** | 628 /** |
651 * Returns true if there is an annotation installed on this paint, and | 629 * Returns true if there is an annotation installed on this paint, and |
652 * the annotation specifics no-drawing. | 630 * the annotation specifics no-drawing. |
653 */ | 631 */ |
654 SK_ATTR_DEPRECATED("use getAnnotation and check for non-null") | 632 SK_ATTR_DEPRECATED("use getAnnotation and check for non-null") |
655 bool isNoDrawAnnotation() const { return this->getAnnotation() != NULL; } | 633 bool isNoDrawAnnotation() const { return this->getAnnotation() != NULL; } |
656 | 634 |
657 /** | 635 /** |
658 * Return the paint's SkDrawLooper (if any). Does not affect the looper's | 636 * Return the paint's SkDrawLooper (if any). Does not affect the looper's |
659 * reference count. | 637 * reference count. |
660 */ | 638 */ |
661 SkDrawLooper* getLooper() const { return fLooper; } | 639 SkDrawLooper* getLooper() const { return fParts.fLooper; } |
662 | 640 |
663 /** | 641 /** |
664 * Set or clear the looper object. | 642 * Set or clear the looper object. |
665 * <p /> | 643 * <p /> |
666 * Pass NULL to clear any previous looper. | 644 * Pass NULL to clear any previous looper. |
667 * As a convenience, the parameter passed is also returned. | 645 * As a convenience, the parameter passed is also returned. |
668 * If a previous looper exists in the paint, its reference count is | 646 * If a previous looper exists in the paint, its reference count is |
669 * decremented. If looper is not NULL, its reference count is | 647 * decremented. If looper is not NULL, its reference count is |
670 * incremented. | 648 * incremented. |
671 * @param looper May be NULL. The new looper to be installed in the paint. | 649 * @param looper May be NULL. The new looper to be installed in the paint. |
672 * @return looper | 650 * @return looper |
673 */ | 651 */ |
674 SkDrawLooper* setLooper(SkDrawLooper* looper); | 652 SkDrawLooper* setLooper(SkDrawLooper* looper); |
675 | 653 |
676 enum Align { | 654 enum Align { |
677 kLeft_Align, | 655 kLeft_Align, |
678 kCenter_Align, | 656 kCenter_Align, |
679 kRight_Align, | 657 kRight_Align, |
680 }; | 658 }; |
681 enum { | 659 enum { |
682 kAlignCount = 3 | 660 kAlignCount = 3 |
683 }; | 661 }; |
684 | 662 |
685 /** Return the paint's Align value for drawing text. | 663 /** Return the paint's Align value for drawing text. |
686 @return the paint's Align value for drawing text. | 664 @return the paint's Align value for drawing text. |
687 */ | 665 */ |
688 Align getTextAlign() const { return (Align)fTextAlign; } | 666 Align getTextAlign() const { return (Align)fParts.getTextAlign(); } |
689 | 667 |
690 /** Set the paint's text alignment. | 668 /** Set the paint's text alignment. |
691 @param align set the paint's Align value for drawing text. | 669 @param align set the paint's Align value for drawing text. |
692 */ | 670 */ |
693 void setTextAlign(Align align); | 671 void setTextAlign(Align align); |
694 | 672 |
695 /** Return the paint's text size. | 673 /** Return the paint's text size. |
696 @return the paint's text size. | 674 @return the paint's text size. |
697 */ | 675 */ |
698 SkScalar getTextSize() const { return fTextSize; } | 676 SkScalar getTextSize() const { return fParts.getTextSize(); } |
699 | 677 |
700 /** Set the paint's text size. This value must be > 0 | 678 /** Set the paint's text size. This value must be > 0 |
701 @param textSize set the paint's text size. | 679 @param textSize set the paint's text size. |
702 */ | 680 */ |
703 void setTextSize(SkScalar textSize); | 681 void setTextSize(SkScalar textSize); |
704 | 682 |
705 /** Return the paint's horizontal scale factor for text. The default value | 683 /** Return the paint's horizontal scale factor for text. The default value |
706 is 1.0. | 684 is 1.0. |
707 @return the paint's scale factor in X for drawing/measuring text | 685 @return the paint's scale factor in X for drawing/measuring text |
708 */ | 686 */ |
709 SkScalar getTextScaleX() const { return fTextScaleX; } | 687 SkScalar getTextScaleX() const { return fParts.getTextScaleX(); } |
710 | 688 |
711 /** Set the paint's horizontal scale factor for text. The default value | 689 /** Set the paint's horizontal scale factor for text. The default value |
712 is 1.0. Values > 1.0 will stretch the text wider. Values < 1.0 will | 690 is 1.0. Values > 1.0 will stretch the text wider. Values < 1.0 will |
713 stretch the text narrower. | 691 stretch the text narrower. |
714 @param scaleX set the paint's scale factor in X for drawing/measuring | 692 @param scaleX set the paint's scale factor in X for drawing/measuring |
715 text. | 693 text. |
716 */ | 694 */ |
717 void setTextScaleX(SkScalar scaleX); | 695 void setTextScaleX(SkScalar scaleX); |
718 | 696 |
719 /** Return the paint's horizontal skew factor for text. The default value | 697 /** Return the paint's horizontal skew factor for text. The default value |
720 is 0. | 698 is 0. |
721 @return the paint's skew factor in X for drawing text. | 699 @return the paint's skew factor in X for drawing text. |
722 */ | 700 */ |
723 SkScalar getTextSkewX() const { return fTextSkewX; } | 701 SkScalar getTextSkewX() const { return fParts.getTextSkewX(); } |
724 | 702 |
725 /** Set the paint's horizontal skew factor for text. The default value | 703 /** Set the paint's horizontal skew factor for text. The default value |
726 is 0. For approximating oblique text, use values around -0.25. | 704 is 0. For approximating oblique text, use values around -0.25. |
727 @param skewX set the paint's skew factor in X for drawing text. | 705 @param skewX set the paint's skew factor in X for drawing text. |
728 */ | 706 */ |
729 void setTextSkewX(SkScalar skewX); | 707 void setTextSkewX(SkScalar skewX); |
730 | 708 |
731 /** Describes how to interpret the text parameters that are passed to paint | 709 /** Describes how to interpret the text parameters that are passed to paint |
732 methods like measureText() and getTextWidths(). | 710 methods like measureText() and getTextWidths(). |
733 */ | 711 */ |
734 enum TextEncoding { | 712 enum TextEncoding { |
735 kUTF8_TextEncoding, //!< the text parameters are UTF8 | 713 kUTF8_TextEncoding, //!< the text parameters are UTF8 |
736 kUTF16_TextEncoding, //!< the text parameters are UTF16 | 714 kUTF16_TextEncoding, //!< the text parameters are UTF16 |
737 kUTF32_TextEncoding, //!< the text parameters are UTF32 | 715 kUTF32_TextEncoding, //!< the text parameters are UTF32 |
738 kGlyphID_TextEncoding //!< the text parameters are glyph indices | 716 kGlyphID_TextEncoding //!< the text parameters are glyph indices |
739 }; | 717 }; |
740 | 718 |
741 TextEncoding getTextEncoding() const { return (TextEncoding)fTextEncoding; } | 719 TextEncoding getTextEncoding() const { return (TextEncoding)fParts.getTextEn
coding(); } |
742 | 720 |
743 void setTextEncoding(TextEncoding encoding); | 721 void setTextEncoding(TextEncoding encoding); |
744 | 722 |
745 struct FontMetrics { | 723 struct FontMetrics { |
746 /** Flags which indicate the confidence level of various metrics. | 724 /** Flags which indicate the confidence level of various metrics. |
747 A set flag indicates that the metric may be trusted. | 725 A set flag indicates that the metric may be trusted. |
748 */ | 726 */ |
749 enum FontMetricsFlags { | 727 enum FontMetricsFlags { |
750 kUnderlineThinknessIsValid_Flag = 1 << 0, | 728 kUnderlineThinknessIsValid_Flag = 1 << 0, |
751 kUnderlinePositionIsValid_Flag = 1 << 1, | 729 kUnderlinePositionIsValid_Flag = 1 << 1, |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 static SkMatrix* SetTextMatrix(SkMatrix* matrix, SkScalar size, | 997 static SkMatrix* SetTextMatrix(SkMatrix* matrix, SkScalar size, |
1020 SkScalar scaleX, SkScalar skewX) { | 998 SkScalar scaleX, SkScalar skewX) { |
1021 matrix->setScale(size * scaleX, size); | 999 matrix->setScale(size * scaleX, size); |
1022 if (skewX) { | 1000 if (skewX) { |
1023 matrix->postSkew(skewX, 0); | 1001 matrix->postSkew(skewX, 0); |
1024 } | 1002 } |
1025 return matrix; | 1003 return matrix; |
1026 } | 1004 } |
1027 | 1005 |
1028 SkMatrix* setTextMatrix(SkMatrix* matrix) const { | 1006 SkMatrix* setTextMatrix(SkMatrix* matrix) const { |
1029 return SetTextMatrix(matrix, fTextSize, fTextScaleX, fTextSkewX); | 1007 return SetTextMatrix(matrix, fParts.fTextSize, fParts.fTextScaleX, fPart
s.fTextSkewX); |
1030 } | 1008 } |
1031 | 1009 |
1032 SK_TO_STRING_NONVIRT() | 1010 SK_TO_STRING_NONVIRT() |
1033 | 1011 |
1034 struct FlatteningTraits { | 1012 struct FlatteningTraits { |
1035 static void Flatten(SkWriteBuffer& buffer, const SkPaint& paint); | 1013 static void Flatten(SkWriteBuffer& buffer, const SkPaint& paint); |
1036 static void Unflatten(SkReadBuffer& buffer, SkPaint* paint); | 1014 static void Unflatten(SkReadBuffer& buffer, SkPaint* paint); |
1037 }; | 1015 }; |
1038 | 1016 |
1039 private: | 1017 private: |
1040 SkTypeface* fTypeface; | 1018 SkPaintParts fParts; |
1041 SkPathEffect* fPathEffect; | 1019 uint32_t fDirtyBits; |
1042 SkShader* fShader; | 1020 |
1043 SkXfermode* fXfermode; | 1021 #ifdef SK_BUILD_FOR_ANDROID |
1044 SkMaskFilter* fMaskFilter; | 1022 SkPaintOptionsAndroid fPaintOptionsAndroid; |
1045 SkColorFilter* fColorFilter; | 1023 // In order for the == operator to work properly this must be the last field |
1046 SkRasterizer* fRasterizer; | 1024 // in the struct so that we can do a memcmp to this field's offset. |
1047 SkDrawLooper* fLooper; | 1025 uint32_t fGenerationID; |
1048 SkImageFilter* fImageFilter; | 1026 #endif |
1049 SkAnnotation* fAnnotation; | |
1050 | 1027 |
1051 SkScalar fTextSize; | 1028 uint32_t getBitfields() const { return fParts.fBitfields; } |
1052 SkScalar fTextScaleX; | |
1053 SkScalar fTextSkewX; | |
1054 SkColor fColor; | |
1055 SkScalar fWidth; | |
1056 SkScalar fMiterLimit; | |
1057 union { | |
1058 struct { | |
1059 // all of these bitfields should add up to 32 | |
1060 unsigned fFlags : 16; | |
1061 unsigned fTextAlign : 2; | |
1062 unsigned fCapType : 2; | |
1063 unsigned fJoinType : 2; | |
1064 unsigned fStyle : 2; | |
1065 unsigned fTextEncoding : 2; // 3 values | |
1066 unsigned fHinting : 2; | |
1067 unsigned fFilterLevel : 2; | |
1068 //unsigned fFreeBits : 2; | |
1069 }; | |
1070 uint32_t fBitfields; | |
1071 }; | |
1072 uint32_t fDirtyBits; | |
1073 | |
1074 uint32_t getBitfields() const { return fBitfields; } | |
1075 void setBitfields(uint32_t bitfields); | 1029 void setBitfields(uint32_t bitfields); |
1076 | 1030 |
1077 SkDrawCacheProc getDrawCacheProc() const; | 1031 SkDrawCacheProc getDrawCacheProc() const; |
1078 SkMeasureCacheProc getMeasureCacheProc(TextBufferDirection dir, | 1032 SkMeasureCacheProc getMeasureCacheProc(TextBufferDirection dir, |
1079 bool needFullMetrics) const; | 1033 bool needFullMetrics) const; |
1080 | 1034 |
1081 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length, | 1035 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length, |
1082 int* count, SkRect* bounds) const; | 1036 int* count, SkRect* bounds) const; |
1083 | 1037 |
1084 SkGlyphCache* detachCache(const SkDeviceProperties* deviceProperties, const
SkMatrix*) const; | 1038 SkGlyphCache* detachCache(const SkDeviceProperties* deviceProperties, const
SkMatrix*) const; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 | 1086 |
1133 friend class SkAutoGlyphCache; | 1087 friend class SkAutoGlyphCache; |
1134 friend class SkCanvas; | 1088 friend class SkCanvas; |
1135 friend class SkDraw; | 1089 friend class SkDraw; |
1136 friend class SkGraphics; // So Term() can be called. | 1090 friend class SkGraphics; // So Term() can be called. |
1137 friend class SkPDFDevice; | 1091 friend class SkPDFDevice; |
1138 friend class GrBitmapTextContext; | 1092 friend class GrBitmapTextContext; |
1139 friend class GrDistanceFieldTextContext; | 1093 friend class GrDistanceFieldTextContext; |
1140 friend class SkTextToPathIter; | 1094 friend class SkTextToPathIter; |
1141 friend class SkCanonicalizePaint; | 1095 friend class SkCanonicalizePaint; |
1142 | |
1143 #ifdef SK_BUILD_FOR_ANDROID | |
1144 SkPaintOptionsAndroid fPaintOptionsAndroid; | |
1145 | |
1146 // In order for the == operator to work properly this must be the last field | |
1147 // in the struct so that we can do a memcmp to this field's offset. | |
1148 uint32_t fGenerationID; | |
1149 #endif | |
1150 }; | 1096 }; |
1151 | 1097 |
1152 #endif | 1098 #endif |
OLD | NEW |