1#Topic Rect 2#Alias Rects 3#Alias Rect_Reference 4 5#Subtopic Overview 6 #Subtopic Subtopic 7 #Populate 8 ## 9## 10 11#Struct SkRect 12 13SkRect holds four SkScalar coordinates describing the upper and 14lower bounds of a rectangle. SkRect may be created from outer bounds or 15from position, width, and height. SkRect describes an area; if its right 16is less than or equal to its left, or if its bottom is less than or equal to 17its top, it is considered empty. 18 19# move to topic about MakeIWH and friends 20SkRect can be constructed from int values to avoid compiler warnings that 21integer input cannot convert to SkScalar without loss of precision. 22 23#Subtopic Related_Function 24#Populate 25#Subtopic ## 26 27#Subtopic Member_Function 28#Populate 29## 30 31#Subtopic Member 32#Populate 33 34#Member SkScalar fLeft 35#Line # smaller x-axis bounds ## 36May contain any value, including infinities and NaN. The smaller of the 37horizontal values when sorted. When equal to or greater than fRight, Rect is empty. 38## 39 40#Member SkScalar fTop 41#Line # smaller y-axis bounds ## 42May contain any value, including infinities and NaN. The smaller of the 43vertical values when sorted. When equal to or greater than fBottom, Rect is empty. 44## 45 46#Member SkScalar fRight 47#Line # larger x-axis bounds ## 48May contain any value, including infinities and NaN. The larger of the 49horizontal values when sorted. When equal to or less than fLeft, Rect is empty. 50## 51 52#Member SkScalar fBottom 53#Line # larger y-axis bounds ## 54May contain any value, including infinities and NaN. The larger of the 55vertical values when sorted. When equal to or less than fTop, Rect is empty. 56## 57 58#Subtopic Member ## 59 60#Subtopic Constructor 61#Populate 62 63# ------------------------------------------------------------------------------ 64 65#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeEmpty() 66 67#In Constructor 68#Line # constructs from bounds of (0, 0, 0, 0) ## 69Returns constructed Rect set to (0, 0, 0, 0). 70Many other rectangles are empty; if left is equal to or greater than right, 71or if top is equal to or greater than bottom. Setting all members to zero 72is a convenience, but does not designate a special empty rectangle. 73 74#Return bounds (0, 0, 0, 0) ## 75 76#Example 77 SkRect rect = SkRect::MakeEmpty(); 78 SkDebugf("MakeEmpty isEmpty: %s\n", rect.isEmpty() ? "true" : "false"); 79 rect.offset(10, 10); 80 SkDebugf("offset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false"); 81 rect.inset(10, 10); 82 SkDebugf("inset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false"); 83 rect.outset(20, 20); 84 SkDebugf("outset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false"); 85#StdOut 86MakeEmpty isEmpty: true 87offset rect isEmpty: true 88inset rect isEmpty: true 89outset rect isEmpty: false 90## 91## 92 93#SeeAlso isEmpty setEmpty SkIRect::MakeEmpty 94 95## 96 97# ------------------------------------------------------------------------------ 98 99#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeWH(SkScalar w, SkScalar h) 100 101#In Constructor 102#Line # constructs from SkScalar input returning (0, 0, width, height) ## 103Returns constructed Rect set to SkScalar values (0, 0, w, h). Does not 104validate input; w or h may be negative. 105 106Passing integer values may generate a compiler warning since Rect cannot 107represent 32-bit integers exactly. Use SkIRect for an exact integer rectangle. 108 109#Param w SkScalar width of constructed Rect ## 110#Param h SkScalar height of constructed Rect ## 111 112#Return bounds (0, 0, w, h) ## 113 114#Example 115 SkRect rect1 = SkRect::MakeWH(25, 35); 116 SkRect rect2 = SkRect::MakeIWH(25, 35); 117 SkRect rect3 = SkRect::MakeXYWH(0, 0, 25, 35); 118 SkRect rect4 = SkRect::MakeLTRB(0, 0, 25, 35); 119 SkDebugf("all %s" "equal\n", rect1 == rect2 && rect2 == rect3 && rect3 == rect4 ? 120 "" : "not "); 121#StdOut 122all equal 123## 124## 125 126#SeeAlso MakeSize MakeXYWH MakeIWH setWH SkIRect::MakeWH 127 128## 129 130# ------------------------------------------------------------------------------ 131 132#Method static SkRect SK_WARN_UNUSED_RESULT MakeIWH(int w, int h) 133 134#In Constructor 135#Line # constructs from int input returning (0, 0, width, height) ## 136Returns constructed Rect set to integer values (0, 0, w, h). Does not validate 137input; w or h may be negative. 138 139Use to avoid a compiler warning that input may lose precision when stored. 140Use SkIRect for an exact integer rectangle. 141 142#Param w integer width of constructed Rect ## 143#Param h integer height of constructed Rect ## 144 145#Return bounds (0, 0, w, h) ## 146 147#Example 148 SkIRect i_rect = SkIRect::MakeWH(25, 35); 149 SkRect f_rect = SkRect::MakeIWH(25, 35); 150 SkDebugf("i_rect width: %d f_rect width:%g\n", i_rect.width(), f_rect.width()); 151 i_rect = SkIRect::MakeWH(125000111, 0); 152 f_rect = SkRect::MakeIWH(125000111, 0); 153 SkDebugf("i_rect width: %d f_rect width:%.0f\n", i_rect.width(), f_rect.width()); 154#StdOut 155i_rect width: 25 f_rect width:25 156i_rect width: 125000111 f_rect width:125000112 157## 158## 159 160#SeeAlso MakeXYWH MakeWH isetWH SkIRect::MakeWH 161 162## 163 164# ------------------------------------------------------------------------------ 165 166#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeSize(const SkSize& size) 167 168#In Constructor 169#Line # constructs from Size returning (0, 0, width, height) ## 170Returns constructed Rect set to (0, 0, size.width(), size.height()). Does not 171validate input; size.width() or size.height() may be negative. 172 173#Param size SkScalar values for Rect width and height ## 174 175#Return bounds (0, 0, size.width(), size.height()) ## 176 177#Example 178 SkSize size = {25.5f, 35.5f}; 179 SkRect rect = SkRect::MakeSize(size); 180 SkDebugf("rect width: %g height: %g\n", rect.width(), rect.height()); 181 SkISize floor = size.toFloor(); 182 rect = SkRect::MakeSize(SkSize::Make(floor)); 183 SkDebugf("floor width: %g height: %g\n", rect.width(), rect.height()); 184#StdOut 185rect width: 25.5 height: 35.5 186floor width: 25 height: 35 187## 188## 189 190#SeeAlso MakeWH MakeXYWH MakeIWH setWH SkIRect::MakeWH 191 192## 193 194# ------------------------------------------------------------------------------ 195 196#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeLTRB(SkScalar l, SkScalar t, SkScalar r, 197 SkScalar b) 198#In Constructor 199#Line # constructs from SkScalar left, top, right, bottom ## 200 201Returns constructed Rect set to (l, t, r, b). Does not sort input; Rect may 202result in fLeft greater than fRight, or fTop greater than fBottom. 203 204#Param l SkScalar stored in fLeft ## 205#Param t SkScalar stored in fTop ## 206#Param r SkScalar stored in fRight ## 207#Param b SkScalar stored in fBottom ## 208 209#Return bounds (l, t, r, b) ## 210 211#Example 212 SkRect rect = SkRect::MakeLTRB(5, 35, 15, 25); 213 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 214 rect.bottom(), rect.isEmpty() ? "true" : "false"); 215 rect.sort(); 216 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 217 rect.bottom(), rect.isEmpty() ? "true" : "false"); 218#StdOut 219rect: 5, 35, 15, 25 isEmpty: true 220rect: 5, 25, 15, 35 isEmpty: false 221## 222## 223 224#SeeAlso MakeXYWH SkIRect::MakeLTRB 225 226## 227 228# ------------------------------------------------------------------------------ 229 230#Method static constexpr SkRect SK_WARN_UNUSED_RESULT MakeXYWH(SkScalar x, SkScalar y, SkScalar w, SkScalar h) 231 232#In Constructor 233#Line # constructs from SkScalar input returning (x, y, width, height) ## 234Returns constructed Rect set to 235#Formula 236(x, y, x + w, y + h) 237## 238. Does not validate input; 239w or h may be negative. 240 241#Param x stored in fLeft ## 242#Param y stored in fTop ## 243#Param w added to x and stored in fRight ## 244#Param h added to y and stored in fBottom ## 245 246#Return bounds at (x, y) with width w and height h ## 247 248#Example 249 SkRect rect = SkRect::MakeXYWH(5, 35, -15, 25); 250 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 251 rect.bottom(), rect.isEmpty() ? "true" : "false"); 252 rect.sort(); 253 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 254 rect.bottom(), rect.isEmpty() ? "true" : "false"); 255#StdOut 256rect: 5, 35, -10, 60 isEmpty: true 257rect: -10, 35, 5, 60 isEmpty: false 258## 259## 260 261#SeeAlso MakeLTRB SkIRect::MakeXYWH 262 263## 264 265# ------------------------------------------------------------------------------ 266 267#Method static SkRect SK_WARN_UNUSED_RESULT MakeFromIRect(const SkIRect& irect) 268#Deprecated 269## 270 271# ------------------------------------------------------------------------------ 272 273#Method static SkRect Make(const SkISize& size) 274 275#In Constructor 276#Line # constructs from ISize returning (0, 0, width, height) ## 277Returns constructed IRect set to (0, 0, size.width(), size.height()). 278Does not validate input; size.width() or size.height() may be negative. 279 280#Param size integer values for Rect width and height ## 281 282#Return bounds (0, 0, size.width(), size.height()) ## 283 284#Example 285 SkRect rect1 = SkRect::MakeSize({2, 35}); 286 SkRect rect2 = SkRect::MakeIWH(2, 35); 287 SkDebugf("rect1 %c= rect2\n", rect1 == rect2 ? '=' : '!'); 288#StdOut 289rect1 == rect2 290## 291## 292 293#SeeAlso MakeWH MakeXYWH SkRect::MakeIWH SkIRect::MakeSize 294 295## 296 297# ------------------------------------------------------------------------------ 298 299#Method static SkRect SK_WARN_UNUSED_RESULT Make(const SkIRect& irect) 300 301#In Constructor 302Returns constructed IRect set to irect, promoting integers to Scalar. 303Does not validate input; fLeft may be greater than fRight, fTop may be greater 304than fBottom. 305 306#Param irect integer unsorted bounds ## 307 308#Return irect members converted to SkScalar ## 309 310#Example 311 SkIRect i_rect1 = {2, 35, 22, 53}; 312 SkRect f_rect = SkRect::Make(i_rect1); 313 f_rect.offset(0.49f, 0.49f); 314 SkIRect i_rect2; 315 f_rect.round(&i_rect2); 316 SkDebugf("i_rect1 %c= i_rect2\n", i_rect1 == i_rect2? '=' : '!'); 317## 318 319#SeeAlso MakeLTRB 320 321## 322 323#Subtopic Constructor ## 324 325#Subtopic Property 326#Line # member values, center, validity ## 327#Populate 328 329# ------------------------------------------------------------------------------ 330 331#Method bool isEmpty() const 332 333#In Property 334#Line # returns true if width or height are zero or negative ## 335Returns true if fLeft is equal to or greater than fRight, or if fTop is equal 336to or greater than fBottom. Call sort() to reverse rectangles with negative 337width() or height(). 338 339#Return true if width() or height() are zero or negative ## 340 341#Example 342 SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}}; 343 for (auto rect : tests) { 344 SkDebugf("rect: {%g, %g, %g, %g} is" "%s empty\n", rect.left(), rect.top(), rect.right(), 345 rect.bottom(), rect.isEmpty() ? "" : " not"); 346 rect.sort(); 347 SkDebugf("sorted: {%g, %g, %g, %g} is" "%s empty\n", rect.left(), rect.top(), rect.right(), 348 rect.bottom(), rect.isEmpty() ? "" : " not"); 349 } 350#StdOut 351rect: {20, 40, 10, 50} is empty 352sorted: {10, 40, 20, 50} is not empty 353rect: {20, 40, 20, 50} is empty 354sorted: {20, 40, 20, 50} is empty 355## 356## 357 358#SeeAlso MakeEmpty sort SkIRect::isEmpty 359 360## 361 362# ------------------------------------------------------------------------------ 363 364#Method bool isSorted() const 365 366#In Property 367#Line # returns true if width or height are zero or positive ## 368Returns true if fLeft is equal to or less than fRight, or if fTop is equal 369to or less than fBottom. Call sort() to reverse rectangles with negative 370width() or height(). 371 372#Return true if width() or height() are zero or positive ## 373 374#Example 375 SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}}; 376 for (auto rect : tests) { 377 SkDebugf("rect: {%g, %g, %g, %g} is" "%s sorted\n", rect.left(), rect.top(), rect.right(), 378 rect.bottom(), rect.isSorted() ? "" : " not"); 379 rect.sort(); 380 SkDebugf("sorted: {%g, %g, %g, %g} is" "%s sorted\n", rect.left(), rect.top(), rect.right(), 381 rect.bottom(), rect.isSorted() ? "" : " not"); 382 } 383#StdOut 384rect: {20, 40, 10, 50} is not sorted 385sorted: {10, 40, 20, 50} is sorted 386rect: {20, 40, 20, 50} is sorted 387sorted: {20, 40, 20, 50} is sorted 388## 389## 390 391#SeeAlso sort makeSorted isEmpty 392 393## 394 395# ------------------------------------------------------------------------------ 396 397#Method bool isFinite() const 398 399#In Property 400#Line # returns true if no member is infinite or NaN ## 401Returns true if all values in the rectangle are finite: SK_ScalarMin or larger, 402and SK_ScalarMax or smaller. 403 404#Return true if no member is infinite or NaN ## 405 406#Example 407SkRect largest = { SK_ScalarMin, SK_ScalarMin, SK_ScalarMax, SK_ScalarMax }; 408 SkDebugf("largest is finite: %s\n", largest.isFinite() ? "true" : "false"); 409 SkDebugf("large width %g\n", largest.width()); 410 SkRect widest = SkRect::MakeWH(largest.width(), largest.height()); 411 SkDebugf("widest is finite: %s\n", widest.isFinite() ? "true" : "false"); 412#StdOut 413largest is finite: true 414large width inf 415widest is finite: false 416## 417## 418 419#SeeAlso SkScalarIsFinite SkScalarIsNaN 420 421## 422 423# ------------------------------------------------------------------------------ 424 425#Method SkScalar x() const 426 427#In Property 428#Line # returns bounds left ## 429Returns left edge of Rect, if sorted. Call isSorted to see if Rect is valid. 430Call sort() to reverse fLeft and fRight if needed. 431 432#Return fLeft ## 433 434#Example 435 SkRect unsorted = { 15, 5, 10, 25 }; 436 SkDebugf("unsorted.fLeft: %g unsorted.x(): %g\n", unsorted.fLeft, unsorted.x()); 437 SkRect sorted = unsorted.makeSorted(); 438 SkDebugf("sorted.fLeft: %g sorted.x(): %g\n", sorted.fLeft, sorted.x()); 439#StdOut 440unsorted.fLeft: 15 unsorted.x(): 15 441sorted.fLeft: 10 sorted.x(): 10 442## 443## 444 445#SeeAlso fLeft left() y() SkIRect::x() 446 447## 448 449# ------------------------------------------------------------------------------ 450 451#Method SkScalar y() const 452 453#In Property 454#Line # returns bounds top ## 455Returns top edge of Rect, if sorted. Call isEmpty to see if Rect may be invalid, 456and sort() to reverse fTop and fBottom if needed. 457 458#Return fTop ## 459 460#Example 461 SkRect unsorted = { 15, 25, 10, 5 }; 462 SkDebugf("unsorted.fTop: %g unsorted.y(): %g\n", unsorted.fTop, unsorted.y()); 463 SkRect sorted = unsorted.makeSorted(); 464 SkDebugf("sorted.fTop: %g sorted.y(): %g\n", sorted.fTop, sorted.y()); 465#StdOut 466unsorted.fTop: 25 unsorted.y(): 25 467sorted.fTop: 5 sorted.y(): 5 468## 469## 470 471#SeeAlso fTop top() x() SkIRect::y() 472 473## 474 475# ------------------------------------------------------------------------------ 476 477#Method SkScalar left() const 478 479#In Property 480#Line # returns smaller bounds in x, if sorted ## 481Returns left edge of Rect, if sorted. Call isSorted to see if Rect is valid. 482Call sort() to reverse fLeft and fRight if needed. 483 484#Return fLeft ## 485 486#Example 487 SkRect unsorted = { 15, 5, 10, 25 }; 488 SkDebugf("unsorted.fLeft: %g unsorted.left(): %g\n", unsorted.fLeft, unsorted.left()); 489 SkRect sorted = unsorted.makeSorted(); 490 SkDebugf("sorted.fLeft: %g sorted.left(): %g\n", sorted.fLeft, sorted.left()); 491#StdOut 492unsorted.fLeft: 15 unsorted.left(): 15 493sorted.fLeft: 10 sorted.left(): 10 494## 495## 496 497#SeeAlso fLeft x() SkIRect::left() 498 499## 500 501# ------------------------------------------------------------------------------ 502 503#Method SkScalar top() const 504 505#In Property 506#Line # returns smaller bounds in y, if sorted ## 507Returns top edge of Rect, if sorted. Call isEmpty to see if Rect may be invalid, 508and sort() to reverse fTop and fBottom if needed. 509 510#Return fTop ## 511 512#Example 513 SkRect unsorted = { 15, 25, 10, 5 }; 514 SkDebugf("unsorted.fTop: %g unsorted.top(): %g\n", unsorted.fTop, unsorted.top()); 515 SkRect sorted = unsorted.makeSorted(); 516 SkDebugf("sorted.fTop: %g sorted.top(): %g\n", sorted.fTop, sorted.top()); 517#StdOut 518unsorted.fTop: 25 unsorted.top(): 25 519sorted.fTop: 5 sorted.top(): 5 520## 521## 522 523#SeeAlso fTop y() SkIRect::top() 524 525## 526 527# ------------------------------------------------------------------------------ 528 529#Method SkScalar right() const 530 531#In Property 532#Line # returns larger bounds in x, if sorted ## 533Returns right edge of Rect, if sorted. Call isSorted to see if Rect is valid. 534Call sort() to reverse fLeft and fRight if needed. 535 536#Return fRight ## 537 538#Example 539 SkRect unsorted = { 15, 25, 10, 5 }; 540 SkDebugf("unsorted.fRight: %g unsorted.right(): %g\n", unsorted.fRight, unsorted.right()); 541 SkRect sorted = unsorted.makeSorted(); 542 SkDebugf("sorted.fRight: %g sorted.right(): %g\n", sorted.fRight, sorted.right()); 543#StdOut 544unsorted.fRight: 10 unsorted.right(): 10 545sorted.fRight: 15 sorted.right(): 15 546## 547## 548 549#SeeAlso fRight SkIRect::right() 550 551## 552 553# ------------------------------------------------------------------------------ 554 555#Method SkScalar bottom() const 556 557#In Property 558#Line # returns larger bounds in y, if sorted ## 559Returns bottom edge of Rect, if sorted. Call isEmpty to see if Rect may be invalid, 560and sort() to reverse fTop and fBottom if needed. 561 562#Return fBottom ## 563 564#Example 565 SkRect unsorted = { 15, 25, 10, 5 }; 566 SkDebugf("unsorted.fBottom: %g unsorted.bottom(): %g\n", unsorted.fBottom, unsorted.bottom()); 567 SkRect sorted = unsorted.makeSorted(); 568 SkDebugf("sorted.fBottom: %g sorted.bottom(): %g\n", sorted.fBottom, sorted.bottom()); 569#StdOut 570unsorted.fBottom: 5 unsorted.bottom(): 5 571sorted.fBottom: 25 sorted.bottom(): 25 572## 573## 574 575#SeeAlso fBottom SkIRect::bottom() 576 577## 578 579# ------------------------------------------------------------------------------ 580 581#Method SkScalar width() const 582 583#In Property 584#Line # returns span in x ## 585Returns span on the x-axis. This does not check if Rect is sorted, or if 586result fits in 32-bit float; result may be negative or infinity. 587 588#Return fRight minus fLeft ## 589 590#Example 591#Description 592Compare with SkIRect::width() example. 593## 594 SkRect unsorted = { 15, 25, 10, 5 }; 595 SkDebugf("unsorted width: %g\n", unsorted.width()); 596 SkRect large = { -2147483647.f, 1, 2147483644.f, 2 }; 597 SkDebugf("large width: %.0f\n", large.width()); 598#StdOut 599unsorted width: -5 600large width: 4294967296 601## 602## 603 604#SeeAlso height() SkIRect::width() 605 606## 607 608# ------------------------------------------------------------------------------ 609 610#Method SkScalar height() const 611 612#In Property 613#Line # returns span in y ## 614Returns span on the y-axis. This does not check if IRect is sorted, or if 615result fits in 32-bit float; result may be negative or infinity. 616 617#Return fBottom minus fTop ## 618 619#Example 620#Description 621Compare with SkIRect::height() example. 622## 623 SkRect unsorted = { 15, 25, 10, 20 }; 624 SkDebugf("unsorted height: %g\n", unsorted.height()); 625 SkRect large = { 1, -2147483647.f, 2, 2147483644.f }; 626 SkDebugf("large height: %.0f\n", large.height()); 627#StdOut 628unsorted height: -5 629large height: 4294967296 630## 631## 632 633#SeeAlso width() SkIRect::height() 634 635## 636 637# ------------------------------------------------------------------------------ 638 639#Method SkScalar centerX() const 640 641#In Property 642#Line # returns midpoint in x ## 643Returns average of left edge and right edge. Result does not change if Rect 644is sorted. Result may overflow to infinity if Rect is far from the origin. 645 646#Return midpoint in x ## 647 648#Example 649 SkRect tests[] = {{20, 30, 41, 51}, {-20, -30, -41, -51}}; 650 for (auto rect : tests) { 651 SkDebugf("left: %3g right: %3g centerX: %3g\n", rect.left(), rect.right(), rect.centerX()); 652 rect.sort(); 653 SkDebugf("left: %3g right: %3g centerX: %3g\n", rect.left(), rect.right(), rect.centerX()); 654 } 655#StdOut 656left: 20 right: 41 centerX: 30.5 657left: 20 right: 41 centerX: 30.5 658left: -20 right: -41 centerX: -30.5 659left: -41 right: -20 centerX: -30.5 660## 661## 662 663#SeeAlso centerY SkIRect::centerX 664 665## 666 667# ------------------------------------------------------------------------------ 668 669#Method SkScalar centerY() const 670 671#In Property 672#Line # returns midpoint in y ## 673Returns average of top edge and bottom edge. Result does not change if Rect 674is sorted. Result may overflow to infinity if Rect is far from the origin. 675 676#Return midpoint in y ## 677 678#Example 679 SkRect rect = { 2e+38, 2e+38, 3e+38, 3e+38 }; 680 SkDebugf("left: %g right: %g centerX: %g ", rect.left(), rect.right(), rect.centerX()); 681 SkDebugf("safe mid x: %g\n", rect.left() / 2 + rect.right() / 2); 682#StdOut 683left: 2e+38 right: 3e+38 centerX: inf safe mid x: 2.5e+38 684## 685## 686 687#SeeAlso centerX SkIRect::centerY 688 689## 690 691#Subtopic Property ## 692 693#Subtopic Operator 694 695#Populate 696 697# ------------------------------------------------------------------------------ 698 699#Method bool operator==(const SkRect& a, const SkRect& b) 700 701#In Operator 702#Line # returns true if members are equal ## 703Returns true if all members in a: fLeft, fTop, fRight, and fBottom; are 704equal to the corresponding members in b. 705 706a and b are not equal if either contain NaN. a and b are equal if members 707contain zeroes width different signs. 708 709#Param a Rect to compare ## 710#Param b Rect to compare ## 711 712#Return true if members are equal ## 713 714#Example 715 auto debugster = [](const SkRect& test) -> void { 716 SkRect negZero = {-0.0f, -0.0f, 2, 2}; 717 SkDebugf("{%g, %g, %g, %g} %c= {%g, %g, %g, %g} %s numerically equal\n", 718 test.fLeft, test.fTop, test.fRight, test.fBottom, 719 negZero.fLeft, negZero.fTop, negZero.fRight, negZero.fBottom, 720 test == negZero ? '=' : '!', 721 test.fLeft == negZero.fLeft && test.fTop == negZero.fTop && 722 test.fRight == negZero.fRight && test.fBottom == negZero.fBottom ? 723 "and are" : "yet are not"); 724 }; 725 SkRect tests[] = {{0, 0, 2, 2}, {-0, -0, 2, 2}, {0.0f, 0.0f, 2, 2}}; 726 SkDebugf("tests are %s" "equal\n", tests[0] == tests[1] && tests[1] == tests[2] ? "" : "not "); 727 for (auto rect : tests) { 728 debugster(rect); 729 } 730#StdOut 731tests are equal 732{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal 733{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal 734{0, 0, 2, 2} == {-0, -0, 2, 2} and are numerically equal 735## 736## 737 738#SeeAlso operator!=(const SkRect& a, const SkRect& b) 739 740## 741 742# ------------------------------------------------------------------------------ 743 744#Method bool operator!=(const SkRect& a, const SkRect& b) 745 746#In Operator 747#Line # returns true if members are unequal ## 748Returns true if any in a: fLeft, fTop, fRight, and fBottom; does not 749equal the corresponding members in b. 750 751a and b are not equal if either contain NaN. a and b are equal if members 752contain zeroes width different signs. 753 754#Param a Rect to compare ## 755#Param b Rect to compare ## 756 757#Return true if members are not equal ## 758 759#Example 760 SkRect test = {0, 0, 2, SK_ScalarNaN}; 761 SkDebugf("test with NaN is %s" "equal to itself\n", test == test ? "" : "not "); 762#StdOut 763test with NaN is not equal to itself 764## 765## 766 767#SeeAlso operator==(const SkRect& a, const SkRect& b) 768 769## 770 771#Subtopic Operator ## 772 773#Subtopic As_Points 774#Line # conversion to and from Points ## 775 776#Populate 777 778# ------------------------------------------------------------------------------ 779 780#Method void toQuad(SkPoint quad[4]) const 781 782#In As_Points 783#Line # returns four corners as Point ## 784Returns four points in quad that enclose Rect ordered as: top-left, top-right, 785bottom-right, bottom-left. 786 787#Private 788Consider adding param to control whether quad is CW or CCW. 789## 790 791#Param quad storage for corners of Rect ## 792 793#Example 794 SkRect rect = {1, 2, 3, 4}; 795 SkPoint corners[4]; 796 rect.toQuad(corners); 797 SkDebugf("rect: {%g, %g, %g, %g}\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 798 SkDebugf("corners:"); 799 for (auto corner : corners) { 800 SkDebugf(" {%g, %g}", corner.fX, corner.fY); 801 } 802 SkDebugf("\n"); 803#StdOut 804rect: {1, 2, 3, 4} 805corners: {1, 2} {3, 2} {3, 4} {1, 4} 806## 807## 808 809#SeeAlso SkPath::addRect 810 811## 812 813# ------------------------------------------------------------------------------ 814 815#Method void setBounds(const SkPoint pts[], int count) 816 817#In As_Points 818#Line # sets to upper and lower limits of Point array ## 819Sets to bounds of Point array with count entries. If count is zero or smaller, 820or if Point array contains an infinity or NaN, sets to (0, 0, 0, 0). 821 822Result is either empty or sorted: fLeft is less than or equal to fRight, and 823fTop is less than or equal to fBottom. 824 825#Param pts Point array ## 826#Param count entries in array ## 827 828#Example 829 SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}}; 830 for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) { 831 SkRect rect; 832 rect.setBounds(points, count); 833 if (count > 0) { 834 SkDebugf("added: %3g, %g ", points[count - 1].fX, points[count - 1].fY); 835 } else { 836 SkDebugf("%14s", " "); 837 } 838 SkDebugf("count: %d rect: %g, %g, %g, %g\n", count, 839 rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 840 } 841#StdOut 842 count: 0 rect: 0, 0, 0, 0 843added: 3, 4 count: 1 rect: 3, 4, 3, 4 844added: 1, 2 count: 2 rect: 1, 2, 3, 4 845added: 5, 6 count: 3 rect: 1, 2, 5, 6 846added: nan, 8 count: 4 rect: 0, 0, 0, 0 847## 848## 849 850#SeeAlso set setBoundsCheck SkPath::addPoly 851 852## 853 854# ------------------------------------------------------------------------------ 855 856#Method bool setBoundsCheck(const SkPoint pts[], int count) 857 858#In As_Points 859#Line # sets to upper and lower limits of Point array ## 860Sets to bounds of Point array with count entries. Returns false if count is 861zero or smaller, or if Point array contains an infinity or NaN; in these cases 862sets Rect to (0, 0, 0, 0). 863 864Result is either empty or sorted: fLeft is less than or equal to fRight, and 865fTop is less than or equal to fBottom. 866 867#Param pts Point array ## 868#Param count entries in array ## 869 870#Return true if all Point values are finite ## 871 872#Example 873 SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}}; 874 for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) { 875 SkRect rect; 876 bool success = rect.setBoundsCheck(points, count); 877 if (count > 0) { 878 SkDebugf("added: %3g, %g ", points[count - 1].fX, points[count - 1].fY); 879 } else { 880 SkDebugf("%14s", " "); 881 } 882 SkDebugf("count: %d rect: %g, %g, %g, %g success: %s\n", count, 883 rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, success ? "true" : "false"); 884 } 885#StdOut 886 count: 0 rect: 0, 0, 0, 0 success: true 887added: 3, 4 count: 1 rect: 3, 4, 3, 4 success: true 888added: 1, 2 count: 2 rect: 1, 2, 3, 4 success: true 889added: 5, 6 count: 3 rect: 1, 2, 5, 6 success: true 890added: nan, 8 count: 4 rect: 0, 0, 0, 0 success: false 891## 892## 893 894#SeeAlso set setBounds SkPath::addPoly 895 896## 897 898#Subtopic As_Points ## 899 900#Subtopic Set 901#Line # replaces all values ## 902#Populate 903 904# ------------------------------------------------------------------------------ 905 906#Method void setEmpty() 907 908#In Set 909#Line # sets to (0, 0, 0, 0) ## 910Sets Rect to (0, 0, 0, 0). 911 912Many other rectangles are empty; if left is equal to or greater than right, 913or if top is equal to or greater than bottom. Setting all members to zero 914is a convenience, but does not designate a special empty rectangle. 915 916#Example 917 SkRect rect = {3, 4, 1, 2}; 918 for (int i = 0; i < 2; ++i) { 919 SkDebugf("rect: {%g, %g, %g, %g} is %s" "empty\n", rect.fLeft, rect.fTop, 920 rect.fRight, rect.fBottom, rect.isEmpty() ? "" : "not "); 921 rect.setEmpty(); 922 } 923#StdOut 924rect: {3, 4, 1, 2} is empty 925rect: {0, 0, 0, 0} is empty 926## 927## 928 929#SeeAlso MakeEmpty SkIRect::setEmpty 930 931## 932 933# ------------------------------------------------------------------------------ 934 935#Method void set(const SkIRect& src) 936 937#In Set 938#Line # sets to SkScalar input (left, top, right, bottom) and others ## 939Sets Rect to src, promoting src members from integer to Scalar. 940Very large values in src may lose precision. 941 942#Param src integer Rect ## 943 944#Example 945 SkIRect i_rect = {3, 4, 1, 2}; 946 SkDebugf("i_rect: {%d, %d, %d, %d}\n", i_rect.fLeft, i_rect.fTop, i_rect.fRight, i_rect.fBottom); 947 SkRect f_rect; 948 f_rect.set(i_rect); 949 SkDebugf("f_rect: {%g, %g, %g, %g}\n", f_rect.fLeft, f_rect.fTop, f_rect.fRight, f_rect.fBottom); 950#StdOut 951i_rect: {3, 4, 1, 2} 952f_rect: {3, 4, 1, 2} 953## 954## 955 956#SeeAlso setLTRB SkIntToScalar 957 958## 959 960# ------------------------------------------------------------------------------ 961 962#Method void set(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 963 964#In Set 965Sets Rect to (left, top, right, bottom). 966left and right are not sorted; left is not necessarily less than right. 967top and bottom are not sorted; top is not necessarily less than bottom. 968 969#Param left stored in fLeft ## 970#Param top stored in fTop ## 971#Param right stored in fRight ## 972#Param bottom stored in fBottom ## 973 974#Example 975 SkRect rect1 = {3, 4, 1, 2}; 976 SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom); 977 SkRect rect2; 978 rect2.set(3, 4, 1, 2); 979 SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom); 980#StdOut 981rect1: {3, 4, 1, 2} 982rect2: {3, 4, 1, 2} 983## 984## 985 986#SeeAlso setLTRB setXYWH SkIRect::set 987 988## 989 990# ------------------------------------------------------------------------------ 991 992#Method void setLTRB(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 993 994#In Set 995#Line # sets to SkScalar input (left, top, right, bottom) ## 996Sets Rect to (left, top, right, bottom). 997left and right are not sorted; left is not necessarily less than right. 998top and bottom are not sorted; top is not necessarily less than bottom. 999 1000#Param left stored in fLeft ## 1001#Param top stored in fTop ## 1002#Param right stored in fRight ## 1003#Param bottom stored in fBottom ## 1004 1005#Example 1006 SkRect rect1 = {3, 4, 1, 2}; 1007 SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom); 1008 SkRect rect2; 1009 rect2.setLTRB(3, 4, 1, 2); 1010 SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom); 1011#StdOut 1012rect1: {3, 4, 1, 2} 1013rect2: {3, 4, 1, 2} 1014## 1015## 1016 1017#SeeAlso set setXYWH SkIRect::set 1018 1019## 1020 1021# ------------------------------------------------------------------------------ 1022 1023#Method void set(const SkPoint pts[], int count) 1024 1025#In Set 1026Sets to bounds of Point array with count entries. If count is zero or smaller, 1027or if Point array contains an infinity or NaN, sets Rect to (0, 0, 0, 0). 1028 1029Result is either empty or sorted: fLeft is less than or equal to fRight, and 1030fTop is less than or equal to fBottom. 1031 1032#Param pts Point array ## 1033#Param count entries in array ## 1034 1035#Example 1036 SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}}; 1037 for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) { 1038 SkRect rect; 1039 rect.set(points, count); 1040 if (count > 0) { 1041 SkDebugf("added: %3g, %g ", points[count - 1].fX, points[count - 1].fY); 1042 } else { 1043 SkDebugf("%14s", " "); 1044 } 1045 SkDebugf("count: %d rect: %g, %g, %g, %g\n", count, 1046 rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1047 } 1048#StdOut 1049 count: 0 rect: 0, 0, 0, 0 1050added: 3, 4 count: 1 rect: 3, 4, 3, 4 1051added: 1, 2 count: 2 rect: 1, 2, 3, 4 1052added: 5, 6 count: 3 rect: 1, 2, 5, 6 1053added: nan, 8 count: 4 rect: 0, 0, 0, 0 1054## 1055## 1056 1057#SeeAlso setBounds setBoundsCheck SkPath::addPoly 1058 1059## 1060 1061# ------------------------------------------------------------------------------ 1062 1063#Method void set(const SkPoint& p0, const SkPoint& p1) 1064 1065#In Set 1066Sets bounds to the smallest Rect enclosing Points p0 and p1. The result is 1067sorted and may be empty. Does not check to see if values are finite. 1068 1069#Param p0 corner to include ## 1070#Param p1 corner to include ## 1071 1072#Example 1073#Description 1074p0 and p1 may be swapped and have the same effect unless one contains NaN. 1075## 1076 SkPoint point1 = {SK_ScalarNaN, 8}; 1077 SkPoint point2 = {3, 4}; 1078 SkRect rect; 1079 rect.set(point1, point2); 1080 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1081 rect.set(point2, point1); 1082 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1083## 1084 1085#SeeAlso setBounds setBoundsCheck 1086 1087## 1088 1089# ------------------------------------------------------------------------------ 1090 1091#Method void setXYWH(SkScalar x, SkScalar y, SkScalar width, SkScalar height) 1092 1093#In Set 1094#Line # sets to SkScalar input (x, y, width, height) ## 1095Sets Rect to 1096#Formula 1097(x, y, x + width, y + height) 1098## 1099. Does not validate input; 1100width or height may be negative. 1101 1102#Param x stored in fLeft ## 1103#Param y stored in fTop ## 1104#Param width added to x and stored in fRight ## 1105#Param height added to y and stored in fBottom ## 1106 1107#Example 1108 SkRect rect; 1109 rect.setXYWH(5, 35, -15, 25); 1110 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1111 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1112 rect.sort(); 1113 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1114 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1115#StdOut 1116rect: 5, 35, -10, 60 isEmpty: true 1117rect: -10, 35, 5, 60 isEmpty: false 1118## 1119## 1120 1121#SeeAlso MakeXYWH setLTRB set SkIRect::setXYWH 1122 1123## 1124 1125# ------------------------------------------------------------------------------ 1126 1127#Method void setWH(SkScalar width, SkScalar height) 1128 1129#In Set 1130#Line # sets to SkScalar input (0, 0, width, height) ## 1131Sets Rect to (0, 0, width, height). Does not validate input; 1132width or height may be negative. 1133 1134#Param width stored in fRight ## 1135#Param height stored in fBottom ## 1136 1137#Example 1138 SkRect rect; 1139 rect.setWH(-15, 25); 1140 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1141 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1142 rect.sort(); 1143 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1144 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1145#StdOut 1146rect: 0, 0, -15, 25 isEmpty: true 1147rect: -15, 0, 0, 25 isEmpty: false 1148## 1149## 1150 1151#SeeAlso MakeWH setXYWH isetWH 1152 1153## 1154 1155#Subtopic Set ## 1156 1157#Subtopic From_Integers 1158#Line # set Scalar values from integer input ## 1159 1160#Populate 1161 1162# ------------------------------------------------------------------------------ 1163 1164#Method void iset(int left, int top, int right, int bottom) 1165 1166#In From_Integers 1167#Line # sets to int input (left, top, right, bottom) ## 1168Sets Rect to (left, top, right, bottom). 1169All parameters are promoted from integer to Scalar. 1170left and right are not sorted; left is not necessarily less than right. 1171top and bottom are not sorted; top is not necessarily less than bottom. 1172 1173#Param left promoted to SkScalar and stored in fLeft ## 1174#Param top promoted to SkScalar and stored in fTop ## 1175#Param right promoted to SkScalar and stored in fRight ## 1176#Param bottom promoted to SkScalar and stored in fBottom ## 1177 1178#Example 1179 SkRect rect1 = {3, 4, 1, 2}; 1180 SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom); 1181 SkRect rect2; 1182 rect2.iset(3, 4, 1, 2); 1183 SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom); 1184#StdOut 1185rect1: {3, 4, 1, 2} 1186rect2: {3, 4, 1, 2} 1187## 1188## 1189 1190#SeeAlso set setLTRB SkIRect::set SkIntToScalar 1191 1192## 1193 1194# ------------------------------------------------------------------------------ 1195 1196#Method void isetWH(int width, int height) 1197 1198#In From_Integers 1199#Line # sets to int input (0, 0, width, height) ## 1200Sets Rect to (0, 0, width, height). 1201width and height may be zero or negative. width and height are promoted from 1202integer to SkScalar, large values may lose precision. 1203 1204#Param width promoted to SkScalar and stored in fRight ## 1205#Param height promoted to SkScalar and stored in fBottom ## 1206 1207#Example 1208 SkRect rect1 = {0, 0, 1, 2}; 1209 SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom); 1210 SkRect rect2; 1211 rect2.isetWH(1, 2); 1212 SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom); 1213#StdOut 1214rect1: {0, 0, 1, 2} 1215rect2: {0, 0, 1, 2} 1216## 1217## 1218 1219#SeeAlso MakeWH MakeXYWH iset() SkIRect:MakeWH 1220 1221## 1222 1223#Subtopic From_Integers ## 1224 1225#Subtopic Inset_Outset_Offset 1226#Line # moves sides ## 1227 1228#Populate 1229 1230# ------------------------------------------------------------------------------ 1231 1232#Method SkRect makeOffset(SkScalar dx, SkScalar dy) const 1233 1234#In Inset_Outset_Offset 1235#Line # constructs from translated sides ## 1236Returns Rect offset by (dx, dy). 1237 1238If dx is negative, Rect returned is moved to the left. 1239If dx is positive, Rect returned is moved to the right. 1240If dy is negative, Rect returned is moved upward. 1241If dy is positive, Rect returned is moved downward. 1242 1243#Param dx added to fLeft and fRight ## 1244#Param dy added to fTop and fBottom ## 1245 1246#Return Rect offset in x or y, with original width and height ## 1247 1248#Example 1249 SkRect rect = { 10, 50, 20, 60 }; 1250 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1251 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1252 rect = rect.makeOffset(15, 32); 1253 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1254 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1255#StdOut 1256rect: 10, 50, 20, 60 isEmpty: false 1257rect: 25, 82, 35, 92 isEmpty: false 1258## 1259## 1260 1261#SeeAlso offset() makeInset makeOutset SkIRect::makeOffset 1262 1263## 1264 1265# ------------------------------------------------------------------------------ 1266 1267#Method SkRect makeInset(SkScalar dx, SkScalar dy) const 1268 1269#In Inset_Outset_Offset 1270#Line # constructs from sides moved symmetrically about the center ## 1271Returns Rect, inset by (dx, dy). 1272 1273If dx is negative, Rect returned is wider. 1274If dx is positive, Rect returned is narrower. 1275If dy is negative, Rect returned is taller. 1276If dy is positive, Rect returned is shorter. 1277 1278#Param dx added to fLeft and subtracted from fRight ## 1279#Param dy added to fTop and subtracted from fBottom ## 1280 1281#Return Rect inset symmetrically left and right, top and bottom ## 1282 1283#Example 1284 SkRect rect = { 10, 50, 20, 60 }; 1285 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1286 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1287 rect = rect.makeInset(15, 32); 1288 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1289 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1290#StdOut 1291rect: 10, 50, 20, 60 isEmpty: false 1292rect: 25, 82, 5, 28 isEmpty: true 1293## 1294## 1295 1296#SeeAlso inset() makeOffset makeOutset SkIRect::makeInset 1297 1298## 1299 1300# ------------------------------------------------------------------------------ 1301 1302#Method SkRect makeOutset(SkScalar dx, SkScalar dy) const 1303 1304#In Inset_Outset_Offset 1305#Line # constructs from sides moved symmetrically about the center ## 1306Returns Rect, outset by (dx, dy). 1307 1308If dx is negative, Rect returned is narrower. 1309If dx is positive, Rect returned is wider. 1310If dy is negative, Rect returned is shorter. 1311If dy is positive, Rect returned is taller. 1312 1313#Param dx subtracted to fLeft and added from fRight ## 1314#Param dy subtracted to fTop and added from fBottom ## 1315 1316#Return Rect outset symmetrically left and right, top and bottom ## 1317 1318#Example 1319 SkRect rect = { 10, 50, 20, 60 }; 1320 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1321 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1322 rect = rect.makeOutset(15, 32); 1323 SkDebugf("rect: %g, %g, %g, %g isEmpty: %s\n", rect.left(), rect.top(), rect.right(), 1324 rect.bottom(), rect.isEmpty() ? "true" : "false"); 1325#StdOut 1326rect: 10, 50, 20, 60 isEmpty: false 1327rect: -5, 18, 35, 92 isEmpty: false 1328## 1329## 1330 1331#SeeAlso outset() makeOffset makeInset SkIRect::makeOutset 1332 1333## 1334 1335# ------------------------------------------------------------------------------ 1336 1337#Method void offset(SkScalar dx, SkScalar dy) 1338 1339#In Inset_Outset_Offset 1340#Line # translates sides without changing width and height ## 1341Offsets Rect by adding dx to fLeft, fRight; and by adding dy to fTop, fBottom. 1342 1343If dx is negative, moves Rect to the left. 1344If dx is positive, moves Rect to the right. 1345If dy is negative, moves Rect upward. 1346If dy is positive, moves Rect downward. 1347 1348#Param dx offset added to fLeft and fRight ## 1349#Param dy offset added to fTop and fBottom ## 1350 1351#Example 1352 SkRect rect = { 10, 14, 50, 73 }; 1353 rect.offset(5, 13); 1354 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1355#StdOut 1356rect: 15, 27, 55, 86 1357## 1358## 1359 1360#SeeAlso offsetTo makeOffset SkIRect::offset 1361 1362## 1363 1364# ------------------------------------------------------------------------------ 1365 1366#Method void offset(const SkPoint& delta) 1367 1368#In Inset_Outset_Offset 1369Offsets Rect by adding delta.fX to fLeft, fRight; and by adding delta.fY to 1370fTop, fBottom. 1371 1372If delta.fX is negative, moves Rect to the left. 1373If delta.fX is positive, moves Rect to the right. 1374If delta.fY is negative, moves Rect upward. 1375If delta.fY is positive, moves Rect downward. 1376 1377#Param delta added to Rect ## 1378 1379#Example 1380 SkRect rect = { 10, 14, 50, 73 }; 1381 rect.offset({5, 13}); 1382 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1383#StdOut 1384rect: 15, 27, 55, 86 1385## 1386## 1387 1388#SeeAlso offsetTo makeOffset SkIRect::offset 1389 1390## 1391 1392# ------------------------------------------------------------------------------ 1393 1394#Method void offsetTo(SkScalar newX, SkScalar newY) 1395 1396#In Inset_Outset_Offset 1397#Line # translates to (x, y) without changing width and height ## 1398Offsets Rect so that fLeft equals newX, and fTop equals newY. width and height 1399are unchanged. 1400 1401#Param newX stored in fLeft, preserving width() ## 1402#Param newY stored in fTop, preserving height() ## 1403 1404#Example 1405 SkRect rect = { 10, 14, 50, 73 }; 1406 rect.offsetTo(15, 27); 1407 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1408#StdOut 1409rect: 15, 27, 55, 86 1410## 1411## 1412 1413#SeeAlso offset makeOffset setXYWH SkIRect::offsetTo 1414 1415## 1416 1417# ------------------------------------------------------------------------------ 1418 1419#Method void inset(SkScalar dx, SkScalar dy) 1420 1421#In Inset_Outset_Offset 1422#Line # moves the sides symmetrically about the center ## 1423Insets Rect by (dx, dy). 1424 1425If dx is positive, makes Rect narrower. 1426If dx is negative, makes Rect wider. 1427If dy is positive, makes Rect shorter. 1428If dy is negative, makes Rect taller. 1429 1430#Param dx added to fLeft and subtracted from fRight ## 1431#Param dy added to fTop and subtracted from fBottom ## 1432 1433#Example 1434 SkRect rect = { 10, 14, 50, 73 }; 1435 rect.inset(5, 13); 1436 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1437#StdOut 1438rect: 15, 27, 45, 60 1439## 1440## 1441 1442#SeeAlso outset makeInset SkIRect::inset 1443 1444## 1445 1446# ------------------------------------------------------------------------------ 1447 1448#Method void outset(SkScalar dx, SkScalar dy) 1449 1450#In Inset_Outset_Offset 1451#Line # moves the sides symmetrically about the center ## 1452Outsets Rect by (dx, dy). 1453 1454If dx is positive, makes Rect wider. 1455If dx is negative, makes Rect narrower. 1456If dy is positive, makes Rect taller. 1457If dy is negative, makes Rect shorter. 1458 1459#Param dx subtracted to fLeft and added from fRight ## 1460#Param dy subtracted to fTop and added from fBottom ## 1461 1462#Example 1463 SkRect rect = { 10, 14, 50, 73 }; 1464 rect.outset(5, 13); 1465 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1466#StdOut 1467rect: 5, 1, 55, 86 1468## 1469## 1470 1471#SeeAlso inset makeOutset SkIRect::outset 1472 1473## 1474 1475#Subtopic Inset_Outset_Offset ## 1476 1477#Subtopic Intersection 1478#Line # set to shared bounds ## 1479 1480Rects intersect when they enclose a common area. To intersect, each of the pair 1481must describe area; fLeft is less than fRight, and fTop is less than fBottom; 1482empty() returns false. The intersection of Rect pair can be described by: 1483 1484#Formula 1485(max(a.fLeft, b.fLeft), max(a.fTop, b.fTop), 1486 min(a.fRight, b.fRight), min(a.fBottom, b.fBottom)) 1487## 1488. 1489 1490The intersection is only meaningful if the resulting Rect is not empty and 1491describes an area: fLeft is less than fRight, and fTop is less than fBottom. 1492 1493#Populate 1494 1495# ------------------------------------------------------------------------------ 1496 1497#Method bool contains(SkScalar x, SkScalar y) const 1498 1499#In Intersection 1500#Line # returns true if points are equal or inside ## 1501Returns true if: fLeft <= x < fRight && fTop <= y < fBottom. 1502Returns false if SkRect is empty. 1503 1504#Param x test SkPoint x-coordinate ## 1505#Param y test SkPoint y-coordinate ## 1506 1507#Return true if (x, y) is inside SkRect ## 1508 1509#Example 1510 SkRect rect = { 30, 50, 40, 60 }; 1511 SkPoint tests[] = { { 30, 50 }, { 39, 49 }, { 29, 59 } }; 1512 for (auto contained : tests) { 1513 SkDebugf("rect: (%g, %g, %g, %g) %s (%g, %g)\n", 1514 rect.left(), rect.top(), rect.right(), rect.bottom(), 1515 rect.contains(contained.x(), contained.y()) ? "contains" : "does not contain", 1516 contained.x(), contained.y()); 1517 } 1518#StdOut 1519rect: (30, 50, 40, 60) contains (30, 50) 1520rect: (30, 50, 40, 60) does not contain (39, 49) 1521rect: (30, 50, 40, 60) does not contain (29, 59) 1522## 1523## 1524 1525#SeeAlso SkIRect::contains 1526 1527## 1528 1529# ------------------------------------------------------------------------------ 1530 1531#Method bool contains(const SkRect& r) const 1532 1533#In Intersection 1534Returns true if Rect contains r. 1535Returns false if Rect is empty or r is empty. 1536 1537Rect contains r when Rect area completely includes r area. 1538 1539#Param r Rect contained ## 1540 1541#Return true if all sides of Rect are outside r ## 1542 1543#Example 1544 SkRect rect = { 30, 50, 40, 60 }; 1545 SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} }; 1546 for (auto contained : tests) { 1547 SkDebugf("rect: (%g, %g, %g, %g) %s (%g, %g, %g, %g)\n", 1548 rect.left(), rect.top(), rect.right(), rect.bottom(), 1549 rect.contains(contained) ? "contains" : "does not contain", 1550 contained.left(), contained.top(), contained.right(), contained.bottom()); 1551 } 1552#StdOut 1553rect: (30, 50, 40, 60) contains (30, 50, 31, 51) 1554rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50) 1555rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60) 1556## 1557## 1558 1559#SeeAlso SkIRect::contains 1560 1561## 1562 1563# ------------------------------------------------------------------------------ 1564 1565#Method bool contains(const SkIRect& r) const 1566 1567#In Intersection 1568Returns true if Rect contains r. 1569Returns false if Rect is empty or r is empty. 1570 1571Rect contains r when Rect area completely includes r area. 1572 1573#Param r IRect contained ## 1574 1575#Return true if all sides of Rect are outside r ## 1576 1577#Example 1578 SkRect rect = { 30, 50, 40, 60 }; 1579 SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} }; 1580 for (auto contained : tests) { 1581 SkDebugf("rect: (%g, %g, %g, %g) %s (%d, %d, %d, %d)\n", 1582 rect.left(), rect.top(), rect.right(), rect.bottom(), 1583 rect.contains(contained) ? "contains" : "does not contain", 1584 contained.left(), contained.top(), contained.right(), contained.bottom()); 1585 } 1586#StdOut 1587rect: (30, 50, 40, 60) contains (30, 50, 31, 51) 1588rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50) 1589rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60) 1590## 1591## 1592 1593#SeeAlso SkIRect::contains 1594 1595## 1596 1597# ------------------------------------------------------------------------------ 1598 1599#Method bool intersect(const SkRect& r) 1600 1601#In Intersection 1602#Line # sets to shared area; returns true if not empty ## 1603Returns true if Rect intersects r, and sets Rect to intersection. 1604Returns false if Rect does not intersect r, and leaves Rect unchanged. 1605 1606Returns false if either r or Rect is empty, leaving Rect unchanged. 1607 1608#Param r limit of result ## 1609 1610#Return true if r and Rect have area in common ## 1611 1612#Example 1613#Description 1614Two SkDebugf calls are required. If the calls are combined, their arguments 1615may not be evaluated in left to right order: the printed intersection may 1616be before or after the call to intersect. 1617## 1618 SkRect leftRect = { 10, 40, 50, 80 }; 1619 SkRect rightRect = { 30, 60, 70, 90 }; 1620 SkDebugf("%s intersection: ", leftRect.intersect(rightRect) ? "" : "no "); 1621 SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(), 1622 leftRect.right(), leftRect.bottom()); 1623#StdOut 1624 intersection: 30, 60, 50, 80 1625## 1626## 1627 1628#SeeAlso intersects Intersects join SkIRect::intersect 1629 1630## 1631 1632# ------------------------------------------------------------------------------ 1633 1634#Method bool intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 1635 1636#In Intersection 1637Constructs Rect to intersect from (left, top, right, bottom). Does not sort 1638construction. 1639 1640Returns true if Rect intersects construction, and sets Rect to intersection. 1641Returns false if Rect does not intersect construction, and leaves Rect unchanged. 1642 1643Returns false if either construction or Rect is empty, leaving Rect unchanged. 1644 1645#Param left x minimum of constructed Rect ## 1646#Param top y minimum of constructed Rect ## 1647#Param right x maximum of constructed Rect ## 1648#Param bottom y maximum of constructed Rect ## 1649 1650#Return true if construction and Rect have area in common ## 1651 1652#Example 1653#Description 1654Two SkDebugf calls are required. If the calls are combined, their arguments 1655may not be evaluated in left to right order: the printed intersection may 1656be before or after the call to intersect. 1657## 1658 SkRect leftRect = { 10, 40, 50, 80 }; 1659 SkDebugf("%s intersection: ", leftRect.intersect(30, 60, 70, 90) ? "" : "no "); 1660 SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(), 1661 leftRect.right(), leftRect.bottom()); 1662#StdOut 1663 intersection: 30, 60, 50, 80 1664## 1665## 1666 1667#SeeAlso intersects Intersects join SkIRect::intersect 1668 1669## 1670 1671# ------------------------------------------------------------------------------ 1672 1673#Method bool SK_WARN_UNUSED_RESULT intersect(const SkRect& a, const SkRect& b) 1674 1675#In Intersection 1676Returns true if a intersects b, and sets Rect to intersection. 1677Returns false if a does not intersect b, and leaves Rect unchanged. 1678 1679Returns false if either a or b is empty, leaving Rect unchanged. 1680 1681#Param a Rect to intersect ## 1682#Param b Rect to intersect ## 1683 1684#Return true if a and b have area in common ## 1685 1686#Example 1687 SkRect result; 1688 bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 }); 1689 SkDebugf("%s intersection: %g, %g, %g, %g\n", intersected ? "" : "no ", 1690 result.left(), result.top(), result.right(), result.bottom()); 1691#StdOut 1692 intersection: 30, 60, 50, 80 1693## 1694## 1695 1696#SeeAlso intersects Intersects join SkIRect::intersect 1697 1698## 1699 1700# ------------------------------------------------------------------------------ 1701 1702#Method bool intersects(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) const 1703 1704#In Intersection 1705#Line # returns true if areas overlap ## 1706Constructs Rect to intersect from (left, top, right, bottom). Does not sort 1707construction. 1708 1709Returns true if Rect intersects construction. 1710Returns false if either construction or Rect is empty, or do not intersect. 1711 1712#Param left x minimum of constructed Rect ## 1713#Param top y minimum of constructed Rect ## 1714#Param right x maximum of constructed Rect ## 1715#Param bottom y maximum of constructed Rect ## 1716 1717#Return true if construction and Rect have area in common ## 1718 1719#Example 1720 SkRect rect = { 10, 40, 50, 80 }; 1721 SkDebugf("%s intersection", rect.intersects(30, 60, 70, 90) ? "" : "no "); 1722#StdOut 1723 intersection 1724## 1725## 1726 1727#SeeAlso intersect Intersects SkIRect::Intersects 1728 1729## 1730 1731# ------------------------------------------------------------------------------ 1732 1733#Method bool intersects(const SkRect& r) const 1734 1735#In Intersection 1736Returns true if Rect intersects r. 1737Returns false if either r or Rect is empty, or do not intersect. 1738 1739#Param r Rect to intersect ## 1740 1741#Return true if r and Rect have area in common ## 1742 1743#Example 1744 SkRect rect = { 10, 40, 50, 80 }; 1745 SkDebugf("%s intersection", rect.intersects({30, 60, 70, 90}) ? "" : "no "); 1746#StdOut 1747 intersection 1748## 1749## 1750 1751#SeeAlso intersect Intersects SkIRect::Intersects 1752 1753## 1754 1755# ------------------------------------------------------------------------------ 1756 1757#Method static bool Intersects(const SkRect& a, const SkRect& b) 1758 1759#In Intersection 1760#Line # returns true if areas overlap ## 1761Returns true if a intersects b. 1762Returns false if either a or b is empty, or do not intersect. 1763 1764#Param a Rect to intersect ## 1765#Param b Rect to intersect ## 1766 1767#Return true if a and b have area in common ## 1768 1769#Example 1770 SkDebugf("%s intersection", SkRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? "" : "no "); 1771#StdOut 1772 intersection 1773## 1774## 1775 1776#SeeAlso intersect intersects SkIRect::Intersects 1777 1778## 1779 1780#Subtopic Intersection ## 1781 1782#Subtopic Join 1783#Line # set to union of bounds ## 1784 1785#Populate 1786 1787# ------------------------------------------------------------------------------ 1788 1789#Method void join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) 1790 1791#In Join 1792#Line # sets to union of bounds ## 1793Constructs Rect to intersect from (left, top, right, bottom). Does not sort 1794construction. 1795 1796Sets Rect to the union of itself and the construction. 1797 1798Has no effect if construction is empty. Otherwise, if Rect is empty, sets 1799Rect to construction. 1800 1801#Param left x minimum of constructed Rect ## 1802#Param top y minimum of constructed Rect ## 1803#Param right x maximum of constructed Rect ## 1804#Param bottom y maximum of constructed Rect ## 1805 1806#Example 1807 SkRect rect = { 10, 20, 15, 25}; 1808 rect.join(50, 60, 55, 65); 1809 SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1810#StdOut 1811 join: 10, 20, 55, 65 1812## 1813## 1814 1815#SeeAlso joinNonEmptyArg joinPossiblyEmptyRect SkIRect::join 1816 1817## 1818 1819# ------------------------------------------------------------------------------ 1820 1821#Method void join(const SkRect& r) 1822 1823#In Join 1824Sets Rect to the union of itself and r. 1825 1826Has no effect if r is empty. Otherwise, if Rect is empty, sets 1827Rect to r. 1828 1829#Param r expansion Rect ## 1830 1831#Example 1832 SkRect rect = { 10, 20, 15, 25}; 1833 rect.join({50, 60, 55, 65}); 1834 SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1835#StdOut 1836 join: 10, 20, 55, 65 1837## 1838## 1839 1840#SeeAlso joinNonEmptyArg joinPossiblyEmptyRect SkIRect::join 1841 1842## 1843 1844# ------------------------------------------------------------------------------ 1845 1846#Method void joinNonEmptyArg(const SkRect& r) 1847 1848#In Join 1849#Line # sets to union of bounds, asserting that argument is not empty ## 1850Sets Rect to the union of itself and r. 1851 1852Asserts if r is empty and SK_DEBUG is defined. 1853If Rect is empty, sets Rect to r. 1854 1855May produce incorrect results if r is empty. 1856 1857#Param r expansion Rect ## 1858 1859#Example 1860#Description 1861Since Rect is not sorted, first result is copy of toJoin. 1862## 1863 SkRect rect = { 10, 100, 15, 0}; 1864 SkRect sorted = rect.makeSorted(); 1865 SkRect toJoin = { 50, 60, 55, 65 }; 1866 rect.joinNonEmptyArg(toJoin); 1867 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1868 sorted.joinNonEmptyArg(toJoin); 1869 SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom); 1870#StdOut 1871rect: 50, 60, 55, 65 1872sorted: 10, 0, 55, 100 1873## 1874## 1875 1876#SeeAlso join joinPossiblyEmptyRect SkIRect::join 1877 1878## 1879 1880# ------------------------------------------------------------------------------ 1881 1882#Method void joinPossiblyEmptyRect(const SkRect& r) 1883 1884#In Join 1885#Line # sets to union of bounds. Skips empty check for both ## 1886Sets Rect to the union of itself and the construction. 1887 1888May produce incorrect results if Rect or r is empty. 1889 1890#Param r expansion Rect ## 1891 1892#Example 1893#Description 1894Since Rect is not sorted, first result is not useful. 1895## 1896 SkRect rect = { 10, 100, 15, 0}; 1897 SkRect sorted = rect.makeSorted(); 1898 SkRect toJoin = { 50, 60, 55, 65 }; 1899 rect.joinPossiblyEmptyRect(toJoin); 1900 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 1901 sorted.joinPossiblyEmptyRect(toJoin); 1902 SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom); 1903#StdOut 1904rect: 10, 60, 55, 65 1905sorted: 10, 0, 55, 100 1906## 1907## 1908 1909#SeeAlso joinNonEmptyArg join SkIRect::join 1910 1911## 1912 1913#Subtopic Join ## 1914 1915#Subtopic Rounding 1916#Line # adjust to integer bounds ## 1917 1918#Populate 1919 1920#Method void round(SkIRect* dst) const 1921 1922#In Rounding 1923#Line # sets members to nearest integer value ## 1924Sets IRect by adding 0.5 and discarding the fractional portion of Rect 1925members, using 1926#Formula 1927(SkScalarRoundToInt(fLeft), SkScalarRoundToInt(fTop), 1928 SkScalarRoundToInt(fRight), SkScalarRoundToInt(fBottom)) 1929## 1930. 1931 1932#Param dst storage for IRect ## 1933 1934#Example 1935 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 1936 SkIRect round; 1937 rect.round(&round); 1938 SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 1939#StdOut 1940round: 31, 51, 41, 61 1941## 1942## 1943 1944#SeeAlso roundIn roundOut SkScalarRoundToInt 1945 1946## 1947 1948# ------------------------------------------------------------------------------ 1949 1950#Method void roundOut(SkIRect* dst) const 1951 1952#In Rounding 1953#Line # sets members to nearest integer value away from opposite ## 1954Sets IRect by discarding the fractional portion of fLeft and fTop; and 1955rounding up fRight and fBottom, using 1956#Formula 1957(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop), 1958 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom)) 1959## 1960. 1961 1962#Param dst storage for IRect ## 1963 1964#Example 1965 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 1966 SkIRect round; 1967 rect.roundOut(&round); 1968 SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 1969#StdOut 1970round: 30, 50, 41, 61 1971## 1972## 1973 1974#SeeAlso roundIn round SkScalarRoundToInt 1975 1976## 1977 1978# ------------------------------------------------------------------------------ 1979 1980#Method void roundOut(SkRect* dst) const 1981 1982#In Rounding 1983Sets Rect by discarding the fractional portion of fLeft and fTop; and 1984rounding up fRight and fBottom, using 1985#Formula 1986(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop), 1987 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom)) 1988## 1989. 1990 1991#Param dst storage for Rect ## 1992 1993#Example 1994 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 1995 SkRect round; 1996 rect.roundOut(&round); 1997 SkDebugf("round: %g, %g, %g, %g\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 1998#StdOut 1999round: 30, 50, 41, 61 2000## 2001## 2002 2003#SeeAlso roundIn round SkScalarRoundToInt 2004 2005## 2006 2007# ------------------------------------------------------------------------------ 2008 2009#Method void roundIn(SkIRect* dst) const 2010 2011#In Rounding 2012#Line # sets members to nearest integer value towards opposite ## 2013Sets Rect by rounding up fLeft and fTop; and 2014discarding the fractional portion of fRight and fBottom, using 2015 2016#Formula 2017(SkScalarCeilToInt(fLeft), SkScalarCeilToInt(fTop), 2018 SkScalarFloorToInt(fRight), SkScalarFloorToInt(fBottom)) 2019## 2020. 2021 2022#Param dst storage for IRect ## 2023 2024#Example 2025 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 2026 SkIRect round; 2027 rect.roundIn(&round); 2028 SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 2029#StdOut 2030round: 31, 51, 40, 60 2031## 2032## 2033 2034#SeeAlso roundOut round SkScalarRoundToInt 2035 2036## 2037 2038# ------------------------------------------------------------------------------ 2039 2040#Method SkIRect round() const 2041 2042#In Rounding 2043Returns IRect by adding 0.5 and discarding the fractional portion of Rect 2044members, using 2045#Formula 2046(SkScalarRoundToInt(fLeft), SkScalarRoundToInt(fTop), 2047 SkScalarRoundToInt(fRight), SkScalarRoundToInt(fBottom)) 2048## 2049. 2050 2051#Return rounded IRect ## 2052 2053#Example 2054 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 2055 SkIRect round = rect.round(); 2056 SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 2057#StdOut 2058round: 31, 51, 41, 61 2059## 2060## 2061 2062#SeeAlso roundOut roundIn SkScalarRoundToInt 2063 2064## 2065 2066# ------------------------------------------------------------------------------ 2067 2068#Method SkIRect roundOut() const 2069 2070#In Rounding 2071Sets IRect by discarding the fractional portion of fLeft and fTop; and 2072rounding up fRight and fBottom, using 2073#Formula 2074(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop), 2075 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom)) 2076## 2077. 2078 2079#Return rounded IRect ## 2080 2081#Example 2082 SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f }; 2083 SkIRect round = rect.roundOut(); 2084 SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom); 2085#StdOut 2086round: 30, 50, 41, 61 2087## 2088## 2089 2090#SeeAlso round roundIn SkScalarRoundToInt 2091 2092## 2093 2094#Subtopic Rounding ## 2095 2096#Subtopic Sorting 2097#Line # orders sides ## 2098 2099#Populate 2100 2101# ------------------------------------------------------------------------------ 2102 2103#Method void sort() 2104 2105#In Sorting 2106#Line # orders sides from smaller to larger ## 2107Swaps fLeft and fRight if fLeft is greater than fRight; and swaps 2108fTop and fBottom if fTop is greater than fBottom. Result may be empty; 2109and width() and height() will be zero or positive. 2110 2111#Example 2112 SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f }; 2113 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 2114 rect.sort(); 2115 SkDebugf("sorted: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 2116#StdOut 2117rect: 30.5, 50.5, 20.5, 10.5 2118sorted: 20.5, 10.5, 30.5, 50.5 2119## 2120## 2121 2122#SeeAlso makeSorted SkIRect::sort isSorted 2123 2124## 2125 2126# ------------------------------------------------------------------------------ 2127 2128#Method SkRect makeSorted() const 2129 2130#In Sorting 2131#In Constructor 2132#Line # constructs, ordering sides from smaller to larger ## 2133Returns Rect with fLeft and fRight swapped if fLeft is greater than fRight; and 2134with fTop and fBottom swapped if fTop is greater than fBottom. Result may be empty; 2135and width() and height() will be zero or positive. 2136 2137#Return sorted Rect ## 2138 2139#Example 2140 SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f }; 2141 SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom); 2142 SkRect sort = rect.makeSorted(); 2143 SkDebugf("sorted: %g, %g, %g, %g\n", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom); 2144#StdOut 2145rect: 30.5, 50.5, 20.5, 10.5 2146sorted: 20.5, 10.5, 30.5, 50.5 2147## 2148## 2149 2150#SeeAlso sort SkIRect::makeSorted isSorted 2151 2152## 2153 2154#Subtopic Sorting ## 2155 2156# ------------------------------------------------------------------------------ 2157 2158#Method const SkScalar* asScalars() const 2159#In Property 2160#Line # returns pointer to members as array ## 2161Returns pointer to first Scalar in Rect, to treat it as an array with four 2162entries. 2163 2164#Return pointer to fLeft ## 2165 2166#Example 2167 SkRect rect = {7, 11, 13, 17}; 2168SkDebugf("rect.asScalars() %c= &rect.fLeft\n", rect.asScalars() == &rect.fLeft? '=' : '!'); 2169#StdOut 2170rect.asScalars() == &rect.fLeft 2171## 2172## 2173 2174#SeeAlso toQuad 2175 2176## 2177 2178# ------------------------------------------------------------------------------ 2179 2180#Method void dump(bool asHex) const 2181#In Property 2182#Line # sends text representation to standard output using floats ## 2183Writes text representation of Rect to standard output. Set asHex to true to 2184generate exact binary representations of floating point numbers. 2185 2186#Param asHex true if SkScalar values are written as hexadecimal ## 2187 2188#Example 2189 SkRect rect = {20, 30, 40, 50}; 2190 for (bool dumpAsHex : { false, true } ) { 2191 rect.dump(dumpAsHex); 2192 SkDebugf("\n"); 2193 } 2194#StdOut 2195SkRect::MakeLTRB(20, 30, 40, 50); 2196 2197SkRect::MakeLTRB(SkBits2Float(0x41a00000), /* 20.000000 */ 2198 SkBits2Float(0x41f00000), /* 30.000000 */ 2199 SkBits2Float(0x42200000), /* 40.000000 */ 2200 SkBits2Float(0x42480000) /* 50.000000 */); 2201## 2202## 2203 2204#SeeAlso dumpHex 2205 2206## 2207 2208# ------------------------------------------------------------------------------ 2209 2210#Method void dump() const 2211 2212Writes text representation of Rect to standard output. The representation may be 2213directly compiled as C++ code. Floating point values are written 2214with limited precision; it may not be possible to reconstruct original Rect 2215from output. 2216 2217#Example 2218SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6}; 2219rect.dump(); 2220SkRect copy = SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7); 2221SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not "); 2222#StdOut 2223SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7); 2224rect is not equal to copy 2225## 2226## 2227 2228#SeeAlso dumpHex 2229 2230## 2231 2232# ------------------------------------------------------------------------------ 2233 2234#Method void dumpHex() const 2235#In Property 2236#Line # sends text representation to standard output using hexadecimal ## 2237Writes text representation of Rect to standard output. The representation may be 2238directly compiled as C++ code. Floating point values are written 2239in hexadecimal to preserve their exact bit pattern. The output reconstructs the 2240original Rect. 2241 2242Use instead of dump() when submitting 2243#A bug reports against Skia # http://bug.skia.org ## 2244. 2245 2246#Example 2247 SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6}; 2248rect.dumpHex(); 2249SkRect copy = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */ 2250 SkBits2Float(0x3f2aaaab), /* 0.666667 */ 2251 SkBits2Float(0x40266666), /* 2.600000 */ 2252 SkBits2Float(0x40e00000) /* 7.000000 */); 2253SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not "); 2254#StdOut 2255SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */ 2256 SkBits2Float(0x3f2aaaab), /* 0.666667 */ 2257 SkBits2Float(0x40266666), /* 2.600000 */ 2258 SkBits2Float(0x40e00000) /* 7.000000 */); 2259rect is equal to copy 2260## 2261## 2262 2263#SeeAlso dump 2264 2265## 2266 2267#Method static SkRect SK_WARN_UNUSED_RESULT MakeLargest() 2268#Deprecated 2269## 2270 2271#Struct SkRect ## 2272 2273#Topic Rect ## 2274