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