1 2 3 /* 4 * Copyright 2006 The Android Open Source Project 5 * 6 * Use of this source code is governed by a BSD-style license that can be 7 * found in the LICENSE file. 8 */ 9 10 11 #ifndef SkPaint_DEFINED 12 #define SkPaint_DEFINED 13 14 #include "SkColor.h" 15 #include "SkDrawLooper.h" 16 #include "SkMatrix.h" 17 #include "SkXfermode.h" 18 19 class SkAnnotation; 20 class SkAutoGlyphCache; 21 class SkColorFilter; 22 class SkDescriptor; 23 struct SkDeviceProperties; 24 class SkReadBuffer; 25 class SkWriteBuffer; 26 struct SkGlyph; 27 struct SkRect; 28 class SkGlyphCache; 29 class SkImageFilter; 30 class SkMaskFilter; 31 class SkPath; 32 class SkPathEffect; 33 struct SkPoint; 34 class SkRasterizer; 35 class SkShader; 36 class SkTypeface; 37 38 typedef const SkGlyph& (*SkDrawCacheProc)(SkGlyphCache*, const char**, 39 SkFixed x, SkFixed y); 40 41 typedef const SkGlyph& (*SkMeasureCacheProc)(SkGlyphCache*, const char**); 42 43 #define kBicubicFilterBitmap_Flag kHighQualityFilterBitmap_Flag 44 45 /** \class SkPaint 46 47 The SkPaint class holds the style and color information about how to draw 48 geometries, text and bitmaps. 49 */ 50 51 class SK_API SkPaint { 52 public: 53 SkPaint(); 54 SkPaint(const SkPaint& paint); 55 ~SkPaint(); 56 57 SkPaint& operator=(const SkPaint&); 58 59 /** operator== may give false negatives: two paints that draw equivalently 60 may return false. It will never give false positives: two paints that 61 are not equivalent always return false. 62 */ 63 SK_API friend bool operator==(const SkPaint& a, const SkPaint& b); 64 friend bool operator!=(const SkPaint& a, const SkPaint& b) { 65 return !(a == b); 66 } 67 68 void flatten(SkWriteBuffer&) const; 69 void unflatten(SkReadBuffer&); 70 71 /** Restores the paint to its initial settings. 72 */ 73 void reset(); 74 75 /** Specifies the level of hinting to be performed. These names are taken 76 from the Gnome/Cairo names for the same. They are translated into 77 Freetype concepts the same as in cairo-ft-font.c: 78 kNo_Hinting -> FT_LOAD_NO_HINTING 79 kSlight_Hinting -> FT_LOAD_TARGET_LIGHT 80 kNormal_Hinting -> <default, no option> 81 kFull_Hinting -> <same as kNormalHinting, unless we are rendering 82 subpixel glyphs, in which case TARGET_LCD or 83 TARGET_LCD_V is used> 84 */ 85 enum Hinting { 86 kNo_Hinting = 0, 87 kSlight_Hinting = 1, 88 kNormal_Hinting = 2, //!< this is the default 89 kFull_Hinting = 3 90 }; 91 92 Hinting getHinting() const { 93 return static_cast<Hinting>(fBitfields.fHinting); 94 } 95 96 void setHinting(Hinting hintingLevel); 97 98 /** Specifies the bit values that are stored in the paint's flags. 99 */ 100 enum Flags { 101 kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing 102 kDither_Flag = 0x04, //!< mask to enable dithering 103 kUnderlineText_Flag = 0x08, //!< mask to enable underline text 104 kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text 105 kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text 106 kLinearText_Flag = 0x40, //!< mask to enable linear-text 107 kSubpixelText_Flag = 0x80, //!< mask to enable subpixel text positioning 108 kDevKernText_Flag = 0x100, //!< mask to enable device kerning text 109 kLCDRenderText_Flag = 0x200, //!< mask to enable subpixel glyph renderering 110 kEmbeddedBitmapText_Flag = 0x400, //!< mask to enable embedded bitmap strikes 111 kAutoHinting_Flag = 0x800, //!< mask to force Freetype's autohinter 112 kVerticalText_Flag = 0x1000, 113 kGenA8FromLCD_Flag = 0x2000, // hack for GDI -- do not use if you can help it 114 kDistanceFieldTextTEMP_Flag = 0x4000, //!< TEMPORARY mask to enable distance fields 115 // currently overrides LCD and subpixel rendering 116 // when adding extra flags, note that the fFlags member is specified 117 // with a bit-width and you'll have to expand it. 118 119 kAllFlags = 0xFFFF 120 }; 121 122 /** Return the paint's flags. Use the Flag enum to test flag values. 123 @return the paint's flags (see enums ending in _Flag for bit masks) 124 */ 125 uint32_t getFlags() const { return fBitfields.fFlags; } 126 127 /** Set the paint's flags. Use the Flag enum to specific flag values. 128 @param flags The new flag bits for the paint (see Flags enum) 129 */ 130 void setFlags(uint32_t flags); 131 132 /** Helper for getFlags(), returning true if kAntiAlias_Flag bit is set 133 @return true if the antialias bit is set in the paint's flags. 134 */ 135 bool isAntiAlias() const { 136 return SkToBool(this->getFlags() & kAntiAlias_Flag); 137 } 138 139 /** Helper for setFlags(), setting or clearing the kAntiAlias_Flag bit 140 @param aa true to enable antialiasing, false to disable it 141 */ 142 void setAntiAlias(bool aa); 143 144 /** Helper for getFlags(), returning true if kDither_Flag bit is set 145 @return true if the dithering bit is set in the paint's flags. 146 */ 147 bool isDither() const { 148 return SkToBool(this->getFlags() & kDither_Flag); 149 } 150 151 /** Helper for setFlags(), setting or clearing the kDither_Flag bit 152 @param dither true to enable dithering, false to disable it 153 */ 154 void setDither(bool dither); 155 156 /** Helper for getFlags(), returning true if kLinearText_Flag bit is set 157 @return true if the lineartext bit is set in the paint's flags 158 */ 159 bool isLinearText() const { 160 return SkToBool(this->getFlags() & kLinearText_Flag); 161 } 162 163 /** Helper for setFlags(), setting or clearing the kLinearText_Flag bit 164 @param linearText true to set the linearText bit in the paint's flags, 165 false to clear it. 166 */ 167 void setLinearText(bool linearText); 168 169 /** Helper for getFlags(), returning true if kSubpixelText_Flag bit is set 170 @return true if the lineartext bit is set in the paint's flags 171 */ 172 bool isSubpixelText() const { 173 return SkToBool(this->getFlags() & kSubpixelText_Flag); 174 } 175 176 /** 177 * Helper for setFlags(), setting or clearing the kSubpixelText_Flag. 178 * @param subpixelText true to set the subpixelText bit in the paint's 179 * flags, false to clear it. 180 */ 181 void setSubpixelText(bool subpixelText); 182 183 bool isLCDRenderText() const { 184 return SkToBool(this->getFlags() & kLCDRenderText_Flag); 185 } 186 187 /** 188 * Helper for setFlags(), setting or clearing the kLCDRenderText_Flag. 189 * Note: antialiasing must also be on for lcd rendering 190 * @param lcdText true to set the LCDRenderText bit in the paint's flags, 191 * false to clear it. 192 */ 193 void setLCDRenderText(bool lcdText); 194 195 bool isEmbeddedBitmapText() const { 196 return SkToBool(this->getFlags() & kEmbeddedBitmapText_Flag); 197 } 198 199 /** Helper for setFlags(), setting or clearing the kEmbeddedBitmapText_Flag bit 200 @param useEmbeddedBitmapText true to set the kEmbeddedBitmapText bit in the paint's flags, 201 false to clear it. 202 */ 203 void setEmbeddedBitmapText(bool useEmbeddedBitmapText); 204 205 bool isAutohinted() const { 206 return SkToBool(this->getFlags() & kAutoHinting_Flag); 207 } 208 209 /** Helper for setFlags(), setting or clearing the kAutoHinting_Flag bit 210 @param useAutohinter true to set the kEmbeddedBitmapText bit in the 211 paint's flags, 212 false to clear it. 213 */ 214 void setAutohinted(bool useAutohinter); 215 216 bool isVerticalText() const { 217 return SkToBool(this->getFlags() & kVerticalText_Flag); 218 } 219 220 /** 221 * Helper for setting or clearing the kVerticalText_Flag bit in 222 * setFlags(...). 223 * 224 * If this bit is set, then advances are treated as Y values rather than 225 * X values, and drawText will places its glyphs vertically rather than 226 * horizontally. 227 */ 228 void setVerticalText(bool); 229 230 /** Helper for getFlags(), returning true if kUnderlineText_Flag bit is set 231 @return true if the underlineText bit is set in the paint's flags. 232 */ 233 bool isUnderlineText() const { 234 return SkToBool(this->getFlags() & kUnderlineText_Flag); 235 } 236 237 /** Helper for setFlags(), setting or clearing the kUnderlineText_Flag bit 238 @param underlineText true to set the underlineText bit in the paint's 239 flags, false to clear it. 240 */ 241 void setUnderlineText(bool underlineText); 242 243 /** Helper for getFlags(), returns true if kStrikeThruText_Flag bit is set 244 @return true if the strikeThruText bit is set in the paint's flags. 245 */ 246 bool isStrikeThruText() const { 247 return SkToBool(this->getFlags() & kStrikeThruText_Flag); 248 } 249 250 /** Helper for setFlags(), setting or clearing the kStrikeThruText_Flag bit 251 @param strikeThruText true to set the strikeThruText bit in the 252 paint's flags, false to clear it. 253 */ 254 void setStrikeThruText(bool strikeThruText); 255 256 /** Helper for getFlags(), returns true if kFakeBoldText_Flag bit is set 257 @return true if the kFakeBoldText_Flag bit is set in the paint's flags. 258 */ 259 bool isFakeBoldText() const { 260 return SkToBool(this->getFlags() & kFakeBoldText_Flag); 261 } 262 263 /** Helper for setFlags(), setting or clearing the kFakeBoldText_Flag bit 264 @param fakeBoldText true to set the kFakeBoldText_Flag bit in the paint's 265 flags, false to clear it. 266 */ 267 void setFakeBoldText(bool fakeBoldText); 268 269 /** Helper for getFlags(), returns true if kDevKernText_Flag bit is set 270 @return true if the kernText bit is set in the paint's flags. 271 */ 272 bool isDevKernText() const { 273 return SkToBool(this->getFlags() & kDevKernText_Flag); 274 } 275 276 /** Helper for setFlags(), setting or clearing the kKernText_Flag bit 277 @param kernText true to set the kKernText_Flag bit in the paint's 278 flags, false to clear it. 279 */ 280 void setDevKernText(bool devKernText); 281 282 /** Helper for getFlags(), returns true if kDistanceFieldTextTEMP_Flag bit is set 283 @return true if the distanceFieldText bit is set in the paint's flags. 284 */ 285 bool isDistanceFieldTextTEMP() const { 286 return SkToBool(this->getFlags() & kDistanceFieldTextTEMP_Flag); 287 } 288 289 /** Helper for setFlags(), setting or clearing the kDistanceFieldTextTEMP_Flag bit 290 @param distanceFieldText true to set the kDistanceFieldTextTEMP_Flag bit in the paint's 291 flags, false to clear it. 292 */ 293 void setDistanceFieldTextTEMP(bool distanceFieldText); 294 295 enum FilterLevel { 296 kNone_FilterLevel, 297 kLow_FilterLevel, 298 kMedium_FilterLevel, 299 kHigh_FilterLevel 300 }; 301 302 /** 303 * Return the filter level. This affects the quality (and performance) of 304 * drawing scaled images. 305 */ 306 FilterLevel getFilterLevel() const { 307 return (FilterLevel)fBitfields.fFilterLevel; 308 } 309 310 /** 311 * Set the filter level. This affects the quality (and performance) of 312 * drawing scaled images. 313 */ 314 void setFilterLevel(FilterLevel); 315 316 /** 317 * If the predicate is true, set the filterLevel to Low, else set it to 318 * None. 319 */ 320 SK_ATTR_DEPRECATED("use setFilterLevel") 321 void setFilterBitmap(bool doFilter) { 322 this->setFilterLevel(doFilter ? kLow_FilterLevel : kNone_FilterLevel); 323 } 324 325 /** 326 * Returns true if getFilterLevel() returns anything other than None. 327 */ 328 SK_ATTR_DEPRECATED("use getFilterLevel") 329 bool isFilterBitmap() const { 330 return kNone_FilterLevel != this->getFilterLevel(); 331 } 332 333 /** Styles apply to rect, oval, path, and text. 334 Bitmaps are always drawn in "fill", and lines are always drawn in 335 "stroke". 336 337 Note: strokeandfill implicitly draws the result with 338 SkPath::kWinding_FillType, so if the original path is even-odd, the 339 results may not appear the same as if it was drawn twice, filled and 340 then stroked. 341 */ 342 enum Style { 343 kFill_Style, //!< fill the geometry 344 kStroke_Style, //!< stroke the geometry 345 kStrokeAndFill_Style, //!< fill and stroke the geometry 346 }; 347 enum { 348 kStyleCount = kStrokeAndFill_Style + 1 349 }; 350 351 /** Return the paint's style, used for controlling how primitives' 352 geometries are interpreted (except for drawBitmap, which always assumes 353 kFill_Style). 354 @return the paint's Style 355 */ 356 Style getStyle() const { return (Style)fBitfields.fStyle; } 357 358 /** Set the paint's style, used for controlling how primitives' 359 geometries are interpreted (except for drawBitmap, which always assumes 360 Fill). 361 @param style The new style to set in the paint 362 */ 363 void setStyle(Style style); 364 365 /** Return the paint's color. Note that the color is a 32bit value 366 containing alpha as well as r,g,b. This 32bit value is not 367 premultiplied, meaning that its alpha can be any value, regardless of 368 the values of r,g,b. 369 @return the paint's color (and alpha). 370 */ 371 SkColor getColor() const { return fColor; } 372 373 /** Set the paint's color. Note that the color is a 32bit value containing 374 alpha as well as r,g,b. This 32bit value is not premultiplied, meaning 375 that its alpha can be any value, regardless of the values of r,g,b. 376 @param color The new color (including alpha) to set in the paint. 377 */ 378 void setColor(SkColor color); 379 380 /** Helper to getColor() that just returns the color's alpha value. 381 @return the alpha component of the paint's color. 382 */ 383 uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); } 384 385 /** Helper to setColor(), that only assigns the color's alpha value, 386 leaving its r,g,b values unchanged. 387 @param a set the alpha component (0..255) of the paint's color. 388 */ 389 void setAlpha(U8CPU a); 390 391 /** Helper to setColor(), that takes a,r,g,b and constructs the color value 392 using SkColorSetARGB() 393 @param a The new alpha component (0..255) of the paint's color. 394 @param r The new red component (0..255) of the paint's color. 395 @param g The new green component (0..255) of the paint's color. 396 @param b The new blue component (0..255) of the paint's color. 397 */ 398 void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b); 399 400 /** Return the width for stroking. 401 <p /> 402 A value of 0 strokes in hairline mode. 403 Hairlines always draw 1-pixel wide, regardless of the matrix. 404 @return the paint's stroke width, used whenever the paint's style is 405 Stroke or StrokeAndFill. 406 */ 407 SkScalar getStrokeWidth() const { return fWidth; } 408 409 /** Set the width for stroking. 410 Pass 0 to stroke in hairline mode. 411 Hairlines always draw 1-pixel wide, regardless of the matrix. 412 @param width set the paint's stroke width, used whenever the paint's 413 style is Stroke or StrokeAndFill. 414 */ 415 void setStrokeWidth(SkScalar width); 416 417 /** Return the paint's stroke miter value. This is used to control the 418 behavior of miter joins when the joins angle is sharp. 419 @return the paint's miter limit, used whenever the paint's style is 420 Stroke or StrokeAndFill. 421 */ 422 SkScalar getStrokeMiter() const { return fMiterLimit; } 423 424 /** Set the paint's stroke miter value. This is used to control the 425 behavior of miter joins when the joins angle is sharp. This value must 426 be >= 0. 427 @param miter set the miter limit on the paint, used whenever the 428 paint's style is Stroke or StrokeAndFill. 429 */ 430 void setStrokeMiter(SkScalar miter); 431 432 /** Cap enum specifies the settings for the paint's strokecap. This is the 433 treatment that is applied to the beginning and end of each non-closed 434 contour (e.g. lines). 435 */ 436 enum Cap { 437 kButt_Cap, //!< begin/end contours with no extension 438 kRound_Cap, //!< begin/end contours with a semi-circle extension 439 kSquare_Cap, //!< begin/end contours with a half square extension 440 441 kCapCount, 442 kDefault_Cap = kButt_Cap 443 }; 444 445 /** Join enum specifies the settings for the paint's strokejoin. This is 446 the treatment that is applied to corners in paths and rectangles. 447 */ 448 enum Join { 449 kMiter_Join, //!< connect path segments with a sharp join 450 kRound_Join, //!< connect path segments with a round join 451 kBevel_Join, //!< connect path segments with a flat bevel join 452 453 kJoinCount, 454 kDefault_Join = kMiter_Join 455 }; 456 457 /** Return the paint's stroke cap type, controlling how the start and end 458 of stroked lines and paths are treated. 459 @return the line cap style for the paint, used whenever the paint's 460 style is Stroke or StrokeAndFill. 461 */ 462 Cap getStrokeCap() const { return (Cap)fBitfields.fCapType; } 463 464 /** Set the paint's stroke cap type. 465 @param cap set the paint's line cap style, used whenever the paint's 466 style is Stroke or StrokeAndFill. 467 */ 468 void setStrokeCap(Cap cap); 469 470 /** Return the paint's stroke join type. 471 @return the paint's line join style, used whenever the paint's style is 472 Stroke or StrokeAndFill. 473 */ 474 Join getStrokeJoin() const { return (Join)fBitfields.fJoinType; } 475 476 /** Set the paint's stroke join type. 477 @param join set the paint's line join style, used whenever the paint's 478 style is Stroke or StrokeAndFill. 479 */ 480 void setStrokeJoin(Join join); 481 482 /** 483 * Applies any/all effects (patheffect, stroking) to src, returning the 484 * result in dst. The result is that drawing src with this paint will be 485 * the same as drawing dst with a default paint (at least from the 486 * geometric perspective). 487 * 488 * @param src input path 489 * @param dst output path (may be the same as src) 490 * @param cullRect If not null, the dst path may be culled to this rect. 491 * @return true if the path should be filled, or false if it should be 492 * drawn with a hairline (width == 0) 493 */ 494 bool getFillPath(const SkPath& src, SkPath* dst, 495 const SkRect* cullRect = NULL) const; 496 497 /** Get the paint's shader object. 498 <p /> 499 The shader's reference count is not affected. 500 @return the paint's shader (or NULL) 501 */ 502 SkShader* getShader() const { return fShader; } 503 504 /** Set or clear the shader object. 505 * Shaders specify the source color(s) for what is being drawn. If a paint 506 * has no shader, then the paint's color is used. If the paint has a 507 * shader, then the shader's color(s) are use instead, but they are 508 * modulated by the paint's alpha. This makes it easy to create a shader 509 * once (e.g. bitmap tiling or gradient) and then change its transparency 510 * w/o having to modify the original shader... only the paint's alpha needs 511 * to be modified. 512 * 513 * There is an exception to this only-respect-paint's-alpha rule: If the shader only generates 514 * alpha (e.g. SkShader::CreateBitmapShader(bitmap, ...) where bitmap's colortype is kAlpha_8) 515 * then the shader will use the paint's entire color to "colorize" its output (modulating the 516 * bitmap's alpha with the paint's color+alpha). 517 * 518 * Pass NULL to clear any previous shader. 519 * As a convenience, the parameter passed is also returned. 520 * If a previous shader exists, its reference count is decremented. 521 * If shader is not NULL, its reference count is incremented. 522 * @param shader May be NULL. The shader to be installed in the paint 523 * @return shader 524 */ 525 SkShader* setShader(SkShader* shader); 526 527 /** Get the paint's colorfilter. If there is a colorfilter, its reference 528 count is not changed. 529 @return the paint's colorfilter (or NULL) 530 */ 531 SkColorFilter* getColorFilter() const { return fColorFilter; } 532 533 /** Set or clear the paint's colorfilter, returning the parameter. 534 <p /> 535 If the paint already has a filter, its reference count is decremented. 536 If filter is not NULL, its reference count is incremented. 537 @param filter May be NULL. The filter to be installed in the paint 538 @return filter 539 */ 540 SkColorFilter* setColorFilter(SkColorFilter* filter); 541 542 /** Get the paint's xfermode object. 543 <p /> 544 The xfermode's reference count is not affected. 545 @return the paint's xfermode (or NULL) 546 */ 547 SkXfermode* getXfermode() const { return fXfermode; } 548 549 /** Set or clear the xfermode object. 550 <p /> 551 Pass NULL to clear any previous xfermode. 552 As a convenience, the parameter passed is also returned. 553 If a previous xfermode exists, its reference count is decremented. 554 If xfermode is not NULL, its reference count is incremented. 555 @param xfermode May be NULL. The new xfermode to be installed in the 556 paint 557 @return xfermode 558 */ 559 SkXfermode* setXfermode(SkXfermode* xfermode); 560 561 /** Create an xfermode based on the specified Mode, and assign it into the 562 paint, returning the mode that was set. If the Mode is SrcOver, then 563 the paint's xfermode is set to null. 564 */ 565 SkXfermode* setXfermodeMode(SkXfermode::Mode); 566 567 /** Get the paint's patheffect object. 568 <p /> 569 The patheffect reference count is not affected. 570 @return the paint's patheffect (or NULL) 571 */ 572 SkPathEffect* getPathEffect() const { return fPathEffect; } 573 574 /** Set or clear the patheffect object. 575 <p /> 576 Pass NULL to clear any previous patheffect. 577 As a convenience, the parameter passed is also returned. 578 If a previous patheffect exists, its reference count is decremented. 579 If patheffect is not NULL, its reference count is incremented. 580 @param effect May be NULL. The new patheffect to be installed in the 581 paint 582 @return effect 583 */ 584 SkPathEffect* setPathEffect(SkPathEffect* effect); 585 586 /** Get the paint's maskfilter object. 587 <p /> 588 The maskfilter reference count is not affected. 589 @return the paint's maskfilter (or NULL) 590 */ 591 SkMaskFilter* getMaskFilter() const { return fMaskFilter; } 592 593 /** Set or clear the maskfilter object. 594 <p /> 595 Pass NULL to clear any previous maskfilter. 596 As a convenience, the parameter passed is also returned. 597 If a previous maskfilter exists, its reference count is decremented. 598 If maskfilter is not NULL, its reference count is incremented. 599 @param maskfilter May be NULL. The new maskfilter to be installed in 600 the paint 601 @return maskfilter 602 */ 603 SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter); 604 605 // These attributes are for text/fonts 606 607 /** Get the paint's typeface object. 608 <p /> 609 The typeface object identifies which font to use when drawing or 610 measuring text. The typeface reference count is not affected. 611 @return the paint's typeface (or NULL) 612 */ 613 SkTypeface* getTypeface() const { return fTypeface; } 614 615 /** Set or clear the typeface object. 616 <p /> 617 Pass NULL to clear any previous typeface. 618 As a convenience, the parameter passed is also returned. 619 If a previous typeface exists, its reference count is decremented. 620 If typeface is not NULL, its reference count is incremented. 621 @param typeface May be NULL. The new typeface to be installed in the 622 paint 623 @return typeface 624 */ 625 SkTypeface* setTypeface(SkTypeface* typeface); 626 627 /** Get the paint's rasterizer (or NULL). 628 <p /> 629 The raster controls how paths/text are turned into alpha masks. 630 @return the paint's rasterizer (or NULL) 631 */ 632 SkRasterizer* getRasterizer() const { return fRasterizer; } 633 634 /** Set or clear the rasterizer object. 635 <p /> 636 Pass NULL to clear any previous rasterizer. 637 As a convenience, the parameter passed is also returned. 638 If a previous rasterizer exists in the paint, its reference count is 639 decremented. If rasterizer is not NULL, its reference count is 640 incremented. 641 @param rasterizer May be NULL. The new rasterizer to be installed in 642 the paint. 643 @return rasterizer 644 */ 645 SkRasterizer* setRasterizer(SkRasterizer* rasterizer); 646 647 SkImageFilter* getImageFilter() const { return fImageFilter; } 648 SkImageFilter* setImageFilter(SkImageFilter*); 649 650 SkAnnotation* getAnnotation() const { return fAnnotation; } 651 SkAnnotation* setAnnotation(SkAnnotation*); 652 653 /** 654 * Returns true if there is an annotation installed on this paint, and 655 * the annotation specifics no-drawing. 656 */ 657 SK_ATTR_DEPRECATED("use getAnnotation and check for non-null") 658 bool isNoDrawAnnotation() const { return this->getAnnotation() != NULL; } 659 660 /** 661 * Return the paint's SkDrawLooper (if any). Does not affect the looper's 662 * reference count. 663 */ 664 SkDrawLooper* getLooper() const { return fLooper; } 665 666 /** 667 * Set or clear the looper object. 668 * <p /> 669 * Pass NULL to clear any previous looper. 670 * As a convenience, the parameter passed is also returned. 671 * If a previous looper exists in the paint, its reference count is 672 * decremented. If looper is not NULL, its reference count is 673 * incremented. 674 * @param looper May be NULL. The new looper to be installed in the paint. 675 * @return looper 676 */ 677 SkDrawLooper* setLooper(SkDrawLooper* looper); 678 679 enum Align { 680 kLeft_Align, 681 kCenter_Align, 682 kRight_Align, 683 }; 684 enum { 685 kAlignCount = 3 686 }; 687 688 /** Return the paint's Align value for drawing text. 689 @return the paint's Align value for drawing text. 690 */ 691 Align getTextAlign() const { return (Align)fBitfields.fTextAlign; } 692 693 /** Set the paint's text alignment. 694 @param align set the paint's Align value for drawing text. 695 */ 696 void setTextAlign(Align align); 697 698 /** Return the paint's text size. 699 @return the paint's text size. 700 */ 701 SkScalar getTextSize() const { return fTextSize; } 702 703 /** Set the paint's text size. This value must be > 0 704 @param textSize set the paint's text size. 705 */ 706 void setTextSize(SkScalar textSize); 707 708 /** Return the paint's horizontal scale factor for text. The default value 709 is 1.0. 710 @return the paint's scale factor in X for drawing/measuring text 711 */ 712 SkScalar getTextScaleX() const { return fTextScaleX; } 713 714 /** Set the paint's horizontal scale factor for text. The default value 715 is 1.0. Values > 1.0 will stretch the text wider. Values < 1.0 will 716 stretch the text narrower. 717 @param scaleX set the paint's scale factor in X for drawing/measuring 718 text. 719 */ 720 void setTextScaleX(SkScalar scaleX); 721 722 /** Return the paint's horizontal skew factor for text. The default value 723 is 0. 724 @return the paint's skew factor in X for drawing text. 725 */ 726 SkScalar getTextSkewX() const { return fTextSkewX; } 727 728 /** Set the paint's horizontal skew factor for text. The default value 729 is 0. For approximating oblique text, use values around -0.25. 730 @param skewX set the paint's skew factor in X for drawing text. 731 */ 732 void setTextSkewX(SkScalar skewX); 733 734 /** Describes how to interpret the text parameters that are passed to paint 735 methods like measureText() and getTextWidths(). 736 */ 737 enum TextEncoding { 738 kUTF8_TextEncoding, //!< the text parameters are UTF8 739 kUTF16_TextEncoding, //!< the text parameters are UTF16 740 kUTF32_TextEncoding, //!< the text parameters are UTF32 741 kGlyphID_TextEncoding //!< the text parameters are glyph indices 742 }; 743 744 TextEncoding getTextEncoding() const { 745 return (TextEncoding)fBitfields.fTextEncoding; 746 } 747 748 void setTextEncoding(TextEncoding encoding); 749 750 struct FontMetrics { 751 /** Flags which indicate the confidence level of various metrics. 752 A set flag indicates that the metric may be trusted. 753 */ 754 enum FontMetricsFlags { 755 kUnderlineThinknessIsValid_Flag = 1 << 0, 756 kUnderlinePositionIsValid_Flag = 1 << 1, 757 }; 758 759 uint32_t fFlags; //!< Bit field to identify which values are unknown 760 SkScalar fTop; //!< The greatest distance above the baseline for any glyph (will be <= 0) 761 SkScalar fAscent; //!< The recommended distance above the baseline (will be <= 0) 762 SkScalar fDescent; //!< The recommended distance below the baseline (will be >= 0) 763 SkScalar fBottom; //!< The greatest distance below the baseline for any glyph (will be >= 0) 764 SkScalar fLeading; //!< The recommended distance to add between lines of text (will be >= 0) 765 SkScalar fAvgCharWidth; //!< the average character width (>= 0) 766 SkScalar fMaxCharWidth; //!< the max character width (>= 0) 767 SkScalar fXMin; //!< The minimum bounding box x value for all glyphs 768 SkScalar fXMax; //!< The maximum bounding box x value for all glyphs 769 SkScalar fXHeight; //!< The height of an 'x' in px, or 0 if no 'x' in face 770 SkScalar fCapHeight; //!< The cap height (> 0), or 0 if cannot be determined. 771 SkScalar fUnderlineThickness; //!< underline thickness, or 0 if cannot be determined 772 773 /** Underline Position - position of the top of the Underline stroke 774 relative to the baseline, this can have following values 775 - Negative - means underline should be drawn above baseline. 776 - Positive - means below baseline. 777 - Zero - mean underline should be drawn on baseline. 778 */ 779 SkScalar fUnderlinePosition; //!< underline position, or 0 if cannot be determined 780 781 /** If the fontmetrics has a valid underlinethickness, return true, and set the 782 thickness param to that value. If it doesn't return false and ignore the 783 thickness param. 784 */ 785 bool hasUnderlineThickness(SkScalar* thickness) const { 786 if (SkToBool(fFlags & kUnderlineThinknessIsValid_Flag)) { 787 *thickness = fUnderlineThickness; 788 return true; 789 } 790 return false; 791 } 792 793 /** If the fontmetrics has a valid underlineposition, return true, and set the 794 thickness param to that value. If it doesn't return false and ignore the 795 thickness param. 796 */ 797 bool hasUnderlinePosition(SkScalar* position) const { 798 if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) { 799 *position = fUnderlinePosition; 800 return true; 801 } 802 return false; 803 } 804 805 }; 806 807 /** Return the recommend spacing between lines (which will be 808 fDescent - fAscent + fLeading). 809 If metrics is not null, return in it the font metrics for the 810 typeface/pointsize/etc. currently set in the paint. 811 @param metrics If not null, returns the font metrics for the 812 current typeface/pointsize/etc setting in this 813 paint. 814 @param scale If not 0, return width as if the canvas were scaled 815 by this value 816 @param return the recommended spacing between lines 817 */ 818 SkScalar getFontMetrics(FontMetrics* metrics, SkScalar scale = 0) const; 819 820 /** Return the recommend line spacing. This will be 821 fDescent - fAscent + fLeading 822 */ 823 SkScalar getFontSpacing() const { return this->getFontMetrics(NULL, 0); } 824 825 /** Convert the specified text into glyph IDs, returning the number of 826 glyphs ID written. If glyphs is NULL, it is ignore and only the count 827 is returned. 828 */ 829 int textToGlyphs(const void* text, size_t byteLength, 830 uint16_t glyphs[]) const; 831 832 /** Return true if all of the specified text has a corresponding non-zero 833 glyph ID. If any of the code-points in the text are not supported in 834 the typeface (i.e. the glyph ID would be zero), then return false. 835 836 If the text encoding for the paint is kGlyph_TextEncoding, then this 837 returns true if all of the specified glyph IDs are non-zero. 838 */ 839 bool containsText(const void* text, size_t byteLength) const; 840 841 /** Convert the glyph array into Unichars. Unconvertable glyphs are mapped 842 to zero. Note: this does not look at the text-encoding setting in the 843 paint, only at the typeface. 844 */ 845 void glyphsToUnichars(const uint16_t glyphs[], int count, 846 SkUnichar text[]) const; 847 848 /** Return the number of drawable units in the specified text buffer. 849 This looks at the current TextEncoding field of the paint. If you also 850 want to have the text converted into glyph IDs, call textToGlyphs 851 instead. 852 */ 853 int countText(const void* text, size_t byteLength) const { 854 return this->textToGlyphs(text, byteLength, NULL); 855 } 856 857 /** Return the width of the text. This will return the vertical measure 858 * if isVerticalText() is true, in which case the returned value should 859 * be treated has a height instead of a width. 860 * 861 * @param text The text to be measured 862 * @param length Number of bytes of text to measure 863 * @param bounds If not NULL, returns the bounds of the text, 864 * relative to (0, 0). 865 * @return The advance width of the text 866 */ 867 SkScalar measureText(const void* text, size_t length, SkRect* bounds) const; 868 869 /** Return the width of the text. This will return the vertical measure 870 * if isVerticalText() is true, in which case the returned value should 871 * be treated has a height instead of a width. 872 * 873 * @param text Address of the text 874 * @param length Number of bytes of text to measure 875 * @return The advance width of the text 876 */ 877 SkScalar measureText(const void* text, size_t length) const { 878 return this->measureText(text, length, NULL); 879 } 880 881 /** Specify the direction the text buffer should be processed in breakText() 882 */ 883 enum TextBufferDirection { 884 /** When measuring text for breakText(), begin at the start of the text 885 buffer and proceed forward through the data. This is the default. 886 */ 887 kForward_TextBufferDirection, 888 /** When measuring text for breakText(), begin at the end of the text 889 buffer and proceed backwards through the data. 890 */ 891 kBackward_TextBufferDirection 892 }; 893 894 /** Return the number of bytes of text that were measured. If 895 * isVerticalText() is true, then the vertical advances are used for 896 * the measurement. 897 * 898 * @param text The text to be measured 899 * @param length Number of bytes of text to measure 900 * @param maxWidth Maximum width. Only the subset of text whose accumulated 901 * widths are <= maxWidth are measured. 902 * @param measuredWidth Optional. If non-null, this returns the actual 903 * width of the measured text. 904 * @param tbd Optional. The direction the text buffer should be 905 * traversed during measuring. 906 * @return The number of bytes of text that were measured. Will be 907 * <= length. 908 */ 909 size_t breakText(const void* text, size_t length, SkScalar maxWidth, 910 SkScalar* measuredWidth = NULL, 911 TextBufferDirection tbd = kForward_TextBufferDirection) 912 const; 913 914 /** Return the advances for the text. These will be vertical advances if 915 * isVerticalText() returns true. 916 * 917 * @param text the text 918 * @param byteLength number of bytes to of text 919 * @param widths If not null, returns the array of advances for 920 * the glyphs. If not NULL, must be at least a large 921 * as the number of unichars in the specified text. 922 * @param bounds If not null, returns the bounds for each of 923 * character, relative to (0, 0) 924 * @return the number of unichars in the specified text. 925 */ 926 int getTextWidths(const void* text, size_t byteLength, SkScalar widths[], 927 SkRect bounds[] = NULL) const; 928 929 /** Return the path (outline) for the specified text. 930 Note: just like SkCanvas::drawText, this will respect the Align setting 931 in the paint. 932 */ 933 void getTextPath(const void* text, size_t length, SkScalar x, SkScalar y, 934 SkPath* path) const; 935 936 void getPosTextPath(const void* text, size_t length, 937 const SkPoint pos[], SkPath* path) const; 938 939 #ifdef SK_BUILD_FOR_ANDROID 940 uint32_t getGenerationID() const; 941 void setGenerationID(uint32_t generationID); 942 #endif 943 944 // returns true if the paint's settings (e.g. xfermode + alpha) resolve to 945 // mean that we need not draw at all (e.g. SrcOver + 0-alpha) 946 bool nothingToDraw() const; 947 948 /////////////////////////////////////////////////////////////////////////// 949 // would prefer to make these private... 950 951 /** Returns true if the current paint settings allow for fast computation of 952 bounds (i.e. there is nothing complex like a patheffect that would make 953 the bounds computation expensive. 954 */ 955 bool canComputeFastBounds() const { 956 if (this->getLooper()) { 957 return this->getLooper()->canComputeFastBounds(*this); 958 } 959 return !this->getRasterizer(); 960 } 961 962 /** Only call this if canComputeFastBounds() returned true. This takes a 963 raw rectangle (the raw bounds of a shape), and adjusts it for stylistic 964 effects in the paint (e.g. stroking). If needed, it uses the storage 965 rect parameter. It returns the adjusted bounds that can then be used 966 for quickReject tests. 967 968 The returned rect will either be orig or storage, thus the caller 969 should not rely on storage being set to the result, but should always 970 use the retured value. It is legal for orig and storage to be the same 971 rect. 972 973 e.g. 974 if (paint.canComputeFastBounds()) { 975 SkRect r, storage; 976 path.computeBounds(&r, SkPath::kFast_BoundsType); 977 const SkRect& fastR = paint.computeFastBounds(r, &storage); 978 if (canvas->quickReject(fastR, ...)) { 979 // don't draw the path 980 } 981 } 982 */ 983 const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const { 984 SkPaint::Style style = this->getStyle(); 985 // ultra fast-case: filling with no effects that affect geometry 986 if (kFill_Style == style) { 987 uintptr_t effects = reinterpret_cast<uintptr_t>(this->getLooper()); 988 effects |= reinterpret_cast<uintptr_t>(this->getMaskFilter()); 989 effects |= reinterpret_cast<uintptr_t>(this->getPathEffect()); 990 effects |= reinterpret_cast<uintptr_t>(this->getImageFilter()); 991 if (!effects) { 992 return orig; 993 } 994 } 995 996 return this->doComputeFastBounds(orig, storage, style); 997 } 998 999 const SkRect& computeFastStrokeBounds(const SkRect& orig, 1000 SkRect* storage) const { 1001 return this->doComputeFastBounds(orig, storage, kStroke_Style); 1002 } 1003 1004 // Take the style explicitly, so the caller can force us to be stroked 1005 // without having to make a copy of the paint just to change that field. 1006 const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage, 1007 Style) const; 1008 1009 /** 1010 * Return a matrix that applies the paint's text values: size, scale, skew 1011 */ 1012 static SkMatrix* SetTextMatrix(SkMatrix* matrix, SkScalar size, 1013 SkScalar scaleX, SkScalar skewX) { 1014 matrix->setScale(size * scaleX, size); 1015 if (skewX) { 1016 matrix->postSkew(skewX, 0); 1017 } 1018 return matrix; 1019 } 1020 1021 SkMatrix* setTextMatrix(SkMatrix* matrix) const { 1022 return SetTextMatrix(matrix, fTextSize, fTextScaleX, fTextSkewX); 1023 } 1024 1025 SK_TO_STRING_NONVIRT() 1026 1027 struct FlatteningTraits { 1028 static void Flatten(SkWriteBuffer& buffer, const SkPaint& paint); 1029 static void Unflatten(SkReadBuffer& buffer, SkPaint* paint); 1030 }; 1031 1032 private: 1033 SkTypeface* fTypeface; 1034 SkPathEffect* fPathEffect; 1035 SkShader* fShader; 1036 SkXfermode* fXfermode; 1037 SkMaskFilter* fMaskFilter; 1038 SkColorFilter* fColorFilter; 1039 SkRasterizer* fRasterizer; 1040 SkDrawLooper* fLooper; 1041 SkImageFilter* fImageFilter; 1042 SkAnnotation* fAnnotation; 1043 1044 SkScalar fTextSize; 1045 SkScalar fTextScaleX; 1046 SkScalar fTextSkewX; 1047 SkColor fColor; 1048 SkScalar fWidth; 1049 SkScalar fMiterLimit; 1050 union { 1051 struct { 1052 // all of these bitfields should add up to 32 1053 unsigned fFlags : 16; 1054 unsigned fTextAlign : 2; 1055 unsigned fCapType : 2; 1056 unsigned fJoinType : 2; 1057 unsigned fStyle : 2; 1058 unsigned fTextEncoding : 2; // 3 values 1059 unsigned fHinting : 2; 1060 unsigned fFilterLevel : 2; 1061 //unsigned fFreeBits : 2; 1062 } fBitfields; 1063 uint32_t fBitfieldsUInt; 1064 }; 1065 uint32_t fDirtyBits; 1066 1067 SkDrawCacheProc getDrawCacheProc() const; 1068 SkMeasureCacheProc getMeasureCacheProc(TextBufferDirection dir, 1069 bool needFullMetrics) const; 1070 1071 SkScalar measure_text(SkGlyphCache*, const char* text, size_t length, 1072 int* count, SkRect* bounds) const; 1073 1074 SkGlyphCache* detachCache(const SkDeviceProperties* deviceProperties, const SkMatrix*, 1075 bool ignoreGamma) const; 1076 1077 void descriptorProc(const SkDeviceProperties* deviceProperties, const SkMatrix* deviceMatrix, 1078 void (*proc)(SkTypeface*, const SkDescriptor*, void*), 1079 void* context, bool ignoreGamma = false) const; 1080 1081 static void Term(); 1082 1083 enum { 1084 /* This is the size we use when we ask for a glyph's path. We then 1085 * post-transform it as we draw to match the request. 1086 * This is done to try to re-use cache entries for the path. 1087 * 1088 * This value is somewhat arbitrary. In theory, it could be 1, since 1089 * we store paths as floats. However, we get the path from the font 1090 * scaler, and it may represent its paths as fixed-point (or 26.6), 1091 * so we shouldn't ask for something too big (might overflow 16.16) 1092 * or too small (underflow 26.6). 1093 * 1094 * This value could track kMaxSizeForGlyphCache, assuming the above 1095 * constraints, but since we ask for unhinted paths, the two values 1096 * need not match per-se. 1097 */ 1098 kCanonicalTextSizeForPaths = 64, 1099 1100 /* 1101 * Above this size (taking into account CTM and textSize), we never use 1102 * the cache for bits or metrics (we might overflow), so we just ask 1103 * for a caononical size and post-transform that. 1104 */ 1105 kMaxSizeForGlyphCache = 256, 1106 }; 1107 1108 static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM); 1109 1110 // Set flags/hinting/textSize up to use for drawing text as paths. 1111 // Returns scale factor to restore the original textSize, since will will 1112 // have change it to kCanonicalTextSizeForPaths. 1113 SkScalar setupForAsPaths(); 1114 1115 static SkScalar MaxCacheSize2() { 1116 static const SkScalar kMaxSize = SkIntToScalar(kMaxSizeForGlyphCache); 1117 static const SkScalar kMag2Max = kMaxSize * kMaxSize; 1118 return kMag2Max; 1119 } 1120 1121 friend class SkAutoGlyphCache; 1122 friend class SkAutoGlyphCacheNoGamma; 1123 friend class SkCanvas; 1124 friend class SkDraw; 1125 friend class SkGraphics; // So Term() can be called. 1126 friend class SkPDFDevice; 1127 friend class GrBitmapTextContext; 1128 friend class GrDistanceFieldTextContext; 1129 friend class GrStencilAndCoverTextContext; 1130 friend class GrPathRendering; 1131 friend class GrGLPathRendering; 1132 friend class SkTextToPathIter; 1133 friend class SkCanonicalizePaint; 1134 1135 #ifdef SK_BUILD_FOR_ANDROID 1136 // In order for the == operator to work properly this must be the last field 1137 // in the struct so that we can do a memcmp to this field's offset. 1138 uint32_t fGenerationID; 1139 #endif 1140 }; 1141 1142 #endif 1143