SkRect_Reference.bmh revision 4855f78dd16ad50003ec537c98062e24a831cd45
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
903#Populate
904
905# ------------------------------------------------------------------------------
906
907#Method void setEmpty()
908
909#In Set
910#Line # sets to (0, 0, 0, 0) ##
911Sets Rect to (0, 0, 0, 0).
912
913Many other rectangles are empty; if left is equal to or greater than right,
914or if top is equal to or greater than bottom. Setting all members to zero
915is a convenience, but does not designate a special empty rectangle.
916
917#Example
918    SkRect rect = {3, 4, 1, 2};
919    for (int i = 0; i < 2; ++i) {
920    SkDebugf("rect: {%g, %g, %g, %g} is %s" "empty\n", rect.fLeft, rect.fTop,
921             rect.fRight, rect.fBottom, rect.isEmpty() ? "" : "not ");
922    rect.setEmpty();
923    }
924#StdOut
925rect: {3, 4, 1, 2} is empty
926rect: {0, 0, 0, 0} is empty
927##
928##
929
930#SeeAlso MakeEmpty SkIRect::setEmpty
931
932##
933
934# ------------------------------------------------------------------------------
935
936#Method void set(const SkIRect& src)
937
938#In Set
939#Line # sets to SkScalar input (left, top, right, bottom) and others ##
940Sets Rect to src, promoting src members from integer to Scalar.
941Very large values in src may lose precision. 
942
943#Param src  integer Rect ##
944
945#Example
946    SkIRect i_rect = {3, 4, 1, 2};
947    SkDebugf("i_rect: {%d, %d, %d, %d}\n", i_rect.fLeft, i_rect.fTop, i_rect.fRight, i_rect.fBottom);
948    SkRect f_rect;
949    f_rect.set(i_rect);
950    SkDebugf("f_rect: {%g, %g, %g, %g}\n", f_rect.fLeft, f_rect.fTop, f_rect.fRight, f_rect.fBottom);
951#StdOut
952i_rect: {3, 4, 1, 2}
953f_rect: {3, 4, 1, 2}
954##
955##
956
957#SeeAlso  setLTRB SkIntToScalar
958
959##
960
961# ------------------------------------------------------------------------------
962
963#Method void set(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
964
965#In Set
966Sets Rect to (left, top, right, bottom).
967left and right are not sorted; left is not necessarily less than right.
968top and bottom are not sorted; top is not necessarily less than bottom.
969
970#Param left  stored in fLeft ##
971#Param top  stored in fTop ##
972#Param right  stored in fRight ##
973#Param bottom  stored in fBottom ##
974
975#Example
976    SkRect rect1 = {3, 4, 1, 2};
977    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
978    SkRect rect2;
979    rect2.set(3, 4, 1, 2);
980    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
981#StdOut
982rect1: {3, 4, 1, 2}
983rect2: {3, 4, 1, 2}
984##
985##
986
987#SeeAlso setLTRB setXYWH SkIRect::set
988
989##
990
991# ------------------------------------------------------------------------------
992
993#Method void setLTRB(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
994
995#In Set
996#Line # sets to SkScalar input (left, top, right, bottom) ##
997Sets Rect to (left, top, right, bottom).
998left and right are not sorted; left is not necessarily less than right.
999top and bottom are not sorted; top is not necessarily less than bottom.
1000
1001#Param left  stored in fLeft ##
1002#Param top  stored in fTop ##
1003#Param right  stored in fRight ##
1004#Param bottom  stored in fBottom ##
1005
1006#Example
1007    SkRect rect1 = {3, 4, 1, 2};
1008    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
1009    SkRect rect2;
1010    rect2.setLTRB(3, 4, 1, 2);
1011    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
1012#StdOut
1013rect1: {3, 4, 1, 2}
1014rect2: {3, 4, 1, 2}
1015##
1016##
1017
1018#SeeAlso set setXYWH SkIRect::set
1019
1020##
1021
1022# ------------------------------------------------------------------------------
1023
1024#Method void set(const SkPoint pts[], int count)
1025
1026#In Set
1027Sets to bounds of Point array with count entries. If count is zero or smaller,
1028or if Point array contains an infinity or NaN, sets Rect to (0, 0, 0, 0).
1029
1030Result is either empty or sorted: fLeft is less than or equal to fRight, and
1031fTop is less than or equal to fBottom.
1032
1033#Param pts  Point array ##
1034#Param count  entries in array ##
1035
1036#Example
1037   SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};
1038   for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {
1039       SkRect rect;
1040       rect.set(points, count);
1041       if (count > 0) {
1042           SkDebugf("added: %3g, %g ", points[count - 1].fX,  points[count - 1].fY);
1043       } else {
1044           SkDebugf("%14s", " ");
1045       }
1046       SkDebugf("count: %d rect: %g, %g, %g, %g\n", count,
1047               rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1048   }
1049#StdOut
1050              count: 0 rect: 0, 0, 0, 0
1051added:   3, 4 count: 1 rect: 3, 4, 3, 4
1052added:   1, 2 count: 2 rect: 1, 2, 3, 4
1053added:   5, 6 count: 3 rect: 1, 2, 5, 6
1054added: nan, 8 count: 4 rect: 0, 0, 0, 0
1055##
1056##
1057
1058#SeeAlso setBounds setBoundsCheck SkPath::addPoly
1059
1060##
1061
1062# ------------------------------------------------------------------------------
1063
1064#Method void set(const SkPoint& p0, const SkPoint& p1)
1065
1066#In Set
1067Sets bounds to the smallest Rect enclosing Points p0 and p1. The result is
1068sorted and may be empty. Does not check to see if values are finite.
1069
1070#Param p0  corner to include ##
1071#Param p1  corner to include ##
1072
1073#Example
1074#Description
1075p0 and p1 may be swapped and have the same effect unless one contains NaN. 
1076##
1077   SkPoint point1 = {SK_ScalarNaN, 8};
1078   SkPoint point2 = {3, 4};
1079   SkRect rect;
1080   rect.set(point1, point2);
1081   SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1082   rect.set(point2, point1);
1083   SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1084##
1085
1086#SeeAlso setBounds setBoundsCheck
1087
1088##
1089
1090# ------------------------------------------------------------------------------
1091
1092#Method void setXYWH(SkScalar x, SkScalar y, SkScalar width, SkScalar height)
1093
1094#In Set
1095#Line # sets to SkScalar input (x, y, width, height) ##
1096Sets Rect to 
1097#Formula
1098(x, y, x + width, y + height)
1099##
1100. Does not validate input;
1101width or height may be negative.
1102
1103#Param x  stored in fLeft ##
1104#Param y  stored in fTop ##
1105#Param width  added to x and stored in fRight ##
1106#Param height  added to y and stored in fBottom ##
1107
1108#Example
1109    SkRect rect;
1110    rect.setXYWH(5, 35, -15, 25);
1111    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1112              rect.bottom(), rect.isEmpty() ? "true" : "false");
1113    rect.sort();
1114    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1115              rect.bottom(), rect.isEmpty() ? "true" : "false");
1116#StdOut
1117rect: 5, 35, -10, 60  isEmpty: true
1118rect: -10, 35, 5, 60  isEmpty: false
1119##
1120##
1121
1122#SeeAlso MakeXYWH setLTRB set SkIRect::setXYWH
1123
1124##
1125
1126# ------------------------------------------------------------------------------
1127
1128#Method void setWH(SkScalar width, SkScalar height)
1129
1130#In Set
1131#Line # sets to SkScalar input (0, 0, width, height) ##
1132Sets Rect to (0, 0, width, height). Does not validate input;
1133width or height may be negative.
1134
1135#Param width  stored in fRight ##
1136#Param height  stored in fBottom ##
1137
1138#Example
1139    SkRect rect;
1140    rect.setWH(-15, 25);
1141    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1142              rect.bottom(), rect.isEmpty() ? "true" : "false");
1143    rect.sort();
1144    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1145              rect.bottom(), rect.isEmpty() ? "true" : "false");
1146#StdOut
1147rect: 0, 0, -15, 25  isEmpty: true
1148rect: -15, 0, 0, 25  isEmpty: false
1149##
1150##
1151
1152#SeeAlso MakeWH setXYWH isetWH
1153
1154##
1155
1156#Subtopic Set ##
1157
1158#Subtopic From_Integers
1159#Line # set Scalar values from integer input ##
1160
1161#Populate
1162
1163# ------------------------------------------------------------------------------
1164
1165#Method void iset(int left, int top, int right, int bottom)
1166
1167#In From_Integers
1168#Line # sets to int input (left, top, right, bottom) ##
1169Sets Rect to (left, top, right, bottom).
1170All parameters are promoted from integer to Scalar.
1171left and right are not sorted; left is not necessarily less than right.
1172top and bottom are not sorted; top is not necessarily less than bottom.
1173
1174#Param left  promoted to SkScalar and stored in fLeft ##
1175#Param top  promoted to SkScalar and stored in fTop ##
1176#Param right  promoted to SkScalar and stored in fRight ##
1177#Param bottom  promoted to SkScalar and stored in fBottom ##
1178
1179#Example
1180    SkRect rect1 = {3, 4, 1, 2};
1181    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
1182    SkRect rect2;
1183    rect2.iset(3, 4, 1, 2);
1184    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
1185#StdOut
1186rect1: {3, 4, 1, 2}
1187rect2: {3, 4, 1, 2}
1188##
1189##
1190
1191#SeeAlso set setLTRB SkIRect::set SkIntToScalar
1192
1193##
1194
1195# ------------------------------------------------------------------------------
1196
1197#Method void isetWH(int width, int height)
1198
1199#In From_Integers
1200#Line # sets to int input (0, 0, width, height) ##
1201Sets Rect to (0, 0, width, height).
1202width and height may be zero or negative. width and height are promoted from
1203integer to SkScalar, large values may lose precision.
1204
1205#Param width  promoted to SkScalar and stored in fRight ##
1206#Param height  promoted to SkScalar and stored in fBottom ##
1207
1208#Example
1209    SkRect rect1 = {0, 0, 1, 2};
1210    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
1211    SkRect rect2;
1212    rect2.isetWH(1, 2);
1213    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
1214#StdOut
1215rect1: {0, 0, 1, 2}
1216rect2: {0, 0, 1, 2}
1217##
1218##
1219
1220#SeeAlso MakeWH MakeXYWH iset() SkIRect:MakeWH
1221
1222##
1223
1224#Subtopic From_Integers ##
1225
1226#Subtopic Inset_Outset_Offset
1227#Line # moves sides ##
1228
1229#Populate
1230
1231# ------------------------------------------------------------------------------
1232
1233#Method SkRect makeOffset(SkScalar dx, SkScalar dy) const
1234
1235#In Inset_Outset_Offset
1236#Line # constructs from translated sides ##
1237Returns Rect offset by (dx, dy).
1238
1239If dx is negative, Rect returned is moved to the left.
1240If dx is positive, Rect returned is moved to the right.
1241If dy is negative, Rect returned is moved upward.
1242If dy is positive, Rect returned is moved downward. 
1243
1244#Param dx  added to fLeft and fRight ##
1245#Param dy  added to fTop and fBottom ##
1246
1247#Return Rect offset in x or y, with original width and height ##
1248
1249#Example
1250    SkRect rect = { 10, 50, 20, 60 };
1251    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1252              rect.bottom(), rect.isEmpty() ? "true" : "false");
1253    rect = rect.makeOffset(15, 32);
1254    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1255              rect.bottom(), rect.isEmpty() ? "true" : "false");
1256#StdOut
1257rect: 10, 50, 20, 60  isEmpty: false
1258rect: 25, 82, 35, 92  isEmpty: false
1259##
1260##
1261
1262#SeeAlso offset() makeInset makeOutset SkIRect::makeOffset
1263
1264##
1265
1266# ------------------------------------------------------------------------------
1267
1268#Method SkRect makeInset(SkScalar dx, SkScalar dy) const
1269
1270#In Inset_Outset_Offset
1271#Line # constructs from sides moved symmetrically about the center ##
1272Returns Rect, inset by (dx, dy).
1273
1274If dx is negative, Rect returned is wider.
1275If dx is positive, Rect returned is narrower.
1276If dy is negative, Rect returned is taller.
1277If dy is positive, Rect returned is shorter. 
1278
1279#Param dx  added to fLeft and subtracted from fRight ##
1280#Param dy  added to fTop and subtracted from fBottom ##
1281
1282#Return Rect inset symmetrically left and right, top and bottom ##
1283
1284#Example
1285    SkRect rect = { 10, 50, 20, 60 };
1286    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1287              rect.bottom(), rect.isEmpty() ? "true" : "false");
1288    rect = rect.makeInset(15, 32);
1289    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1290              rect.bottom(), rect.isEmpty() ? "true" : "false");
1291#StdOut
1292rect: 10, 50, 20, 60  isEmpty: false
1293rect: 25, 82, 5, 28  isEmpty: true
1294##
1295##
1296
1297#SeeAlso inset() makeOffset makeOutset SkIRect::makeInset
1298
1299##
1300
1301# ------------------------------------------------------------------------------
1302
1303#Method SkRect makeOutset(SkScalar dx, SkScalar dy) const
1304
1305#In Inset_Outset_Offset
1306#Line # constructs from sides moved symmetrically about the center ##
1307Returns Rect, outset by (dx, dy).
1308
1309If dx is negative, Rect returned is narrower.
1310If dx is positive, Rect returned is wider.
1311If dy is negative, Rect returned is shorter.
1312If dy is positive, Rect returned is taller. 
1313
1314#Param dx  subtracted to fLeft and added from fRight ##
1315#Param dy  subtracted to fTop and added from fBottom ##
1316
1317#Return Rect outset symmetrically left and right, top and bottom ##
1318
1319#Example
1320    SkRect rect = { 10, 50, 20, 60 };
1321    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1322              rect.bottom(), rect.isEmpty() ? "true" : "false");
1323    rect = rect.makeOutset(15, 32);
1324    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
1325              rect.bottom(), rect.isEmpty() ? "true" : "false");
1326#StdOut
1327rect: 10, 50, 20, 60  isEmpty: false
1328rect: -5, 18, 35, 92  isEmpty: false
1329##
1330##
1331
1332#SeeAlso outset() makeOffset makeInset SkIRect::makeOutset
1333
1334##
1335
1336# ------------------------------------------------------------------------------
1337
1338#Method void offset(SkScalar dx, SkScalar dy)
1339
1340#In Inset_Outset_Offset
1341#Line # translates sides without changing width and height ##
1342Offsets Rect by adding dx to fLeft, fRight; and by adding dy to fTop, fBottom.
1343
1344If dx is negative, moves Rect to the left.
1345If dx is positive, moves Rect to the right.
1346If dy is negative, moves Rect upward.
1347If dy is positive, moves Rect downward. 
1348
1349#Param dx  offset added to fLeft and fRight ##
1350#Param dy  offset added to fTop and fBottom ##
1351
1352#Example
1353    SkRect rect = { 10, 14, 50, 73 };
1354    rect.offset(5, 13);
1355    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1356#StdOut
1357rect: 15, 27, 55, 86
1358##
1359##
1360
1361#SeeAlso offsetTo makeOffset SkIRect::offset
1362
1363##
1364
1365# ------------------------------------------------------------------------------
1366
1367#Method void offset(const SkPoint& delta)
1368
1369#In Inset_Outset_Offset
1370Offsets Rect by adding delta.fX to fLeft, fRight; and by adding delta.fY to
1371fTop, fBottom.
1372
1373If delta.fX is negative, moves Rect to the left.
1374If delta.fX is positive, moves Rect to the right.
1375If delta.fY is negative, moves Rect upward.
1376If delta.fY is positive, moves Rect downward. 
1377
1378#Param delta  added to Rect ##
1379
1380#Example
1381    SkRect rect = { 10, 14, 50, 73 };
1382    rect.offset({5, 13});
1383    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1384#StdOut
1385rect: 15, 27, 55, 86
1386##
1387##
1388
1389#SeeAlso offsetTo makeOffset SkIRect::offset
1390
1391##
1392
1393# ------------------------------------------------------------------------------
1394
1395#Method void offsetTo(SkScalar newX, SkScalar newY)
1396
1397#In Inset_Outset_Offset
1398#Line # translates to (x, y) without changing width and height ##
1399Offsets Rect so that fLeft equals newX, and fTop equals newY. width and height
1400are unchanged.
1401
1402#Param newX  stored in fLeft, preserving width() ##
1403#Param newY  stored in fTop, preserving height() ##
1404
1405#Example
1406    SkRect rect = { 10, 14, 50, 73 };
1407    rect.offsetTo(15, 27);
1408    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1409#StdOut
1410rect: 15, 27, 55, 86
1411##
1412##
1413
1414#SeeAlso offset makeOffset setXYWH SkIRect::offsetTo
1415
1416##
1417
1418# ------------------------------------------------------------------------------
1419
1420#Method void inset(SkScalar dx, SkScalar dy)
1421
1422#In Inset_Outset_Offset
1423#Line # moves the sides symmetrically about the center ##
1424Insets Rect by (dx, dy).
1425
1426If dx is positive, makes Rect narrower.
1427If dx is negative, makes Rect wider.
1428If dy is positive, makes Rect shorter.
1429If dy is negative, makes Rect taller.
1430
1431#Param dx  added to fLeft and subtracted from fRight ##
1432#Param dy  added to fTop and subtracted from fBottom ##
1433
1434#Example
1435    SkRect rect = { 10, 14, 50, 73 };
1436    rect.inset(5, 13);
1437    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1438#StdOut
1439rect: 15, 27, 45, 60
1440##
1441##
1442
1443#SeeAlso outset makeInset SkIRect::inset
1444
1445##
1446
1447# ------------------------------------------------------------------------------
1448
1449#Method void outset(SkScalar dx, SkScalar dy)
1450
1451#In Inset_Outset_Offset
1452#Line # moves the sides symmetrically about the center ##
1453Outsets Rect by (dx, dy).
1454
1455If dx is positive, makes Rect wider.
1456If dx is negative, makes Rect narrower.
1457If dy is positive, makes Rect taller.
1458If dy is negative, makes Rect shorter.
1459
1460#Param dx  subtracted to fLeft and added from fRight ##
1461#Param dy  subtracted to fTop and added from fBottom ##
1462
1463#Example
1464    SkRect rect = { 10, 14, 50, 73 };
1465    rect.outset(5, 13);
1466    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1467#StdOut
1468rect: 5, 1, 55, 86
1469##
1470##
1471
1472#SeeAlso inset makeOutset SkIRect::outset
1473
1474##
1475
1476#Subtopic Inset_Outset_Offset ##
1477
1478#Subtopic Intersection
1479#Line # set to shared bounds ##
1480
1481Rects intersect when they enclose a common area. To intersect, each of the pair 
1482must describe area; fLeft is less than fRight, and fTop is less than fBottom;
1483empty() returns false. The intersection of Rect pair can be described by:
1484
1485#Formula
1486(max(a.fLeft, b.fLeft), max(a.fTop, b.fTop),
1487 min(a.fRight, b.fRight), min(a.fBottom, b.fBottom))
1488##
1489.
1490
1491The intersection is only meaningful if the resulting Rect is not empty and
1492describes an area: fLeft is less than fRight, and fTop is less than fBottom.
1493
1494#Populate
1495
1496# ------------------------------------------------------------------------------
1497
1498#Method    bool contains(const SkRect& r) const
1499
1500#In Intersection
1501#Line # returns true if points are equal or inside ##
1502Returns true if Rect contains r.
1503Returns false if Rect is empty or r is empty.
1504
1505Rect contains r when Rect area completely includes r area.
1506
1507#Param r  Rect contained ##
1508
1509#Return true if all sides of Rect are outside r ##
1510
1511#Example
1512    SkRect rect = { 30, 50, 40, 60 };
1513    SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
1514    for (auto contained : tests) {
1515        SkDebugf("rect: (%g, %g, %g, %g) %s (%g, %g, %g, %g)\n",
1516                 rect.left(), rect.top(), rect.right(), rect.bottom(),
1517                 rect.contains(contained) ? "contains" : "does not contain",
1518                 contained.left(), contained.top(), contained.right(), contained.bottom());
1519    }
1520#StdOut
1521rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
1522rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
1523rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
1524##
1525##
1526
1527#SeeAlso SkIRect::contains
1528
1529##
1530
1531# ------------------------------------------------------------------------------
1532
1533#Method    bool contains(const SkIRect& r) const
1534
1535#In Intersection
1536Returns true if Rect contains r.
1537Returns false if Rect is empty or r is empty.
1538
1539Rect contains r when Rect area completely includes r area.
1540
1541#Param r  IRect contained ##
1542
1543#Return true if all sides of Rect are outside r ##
1544
1545#Example
1546    SkRect rect = { 30, 50, 40, 60 };
1547    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
1548    for (auto contained : tests) {
1549        SkDebugf("rect: (%g, %g, %g, %g) %s (%d, %d, %d, %d)\n",
1550                 rect.left(), rect.top(), rect.right(), rect.bottom(),
1551                 rect.contains(contained) ? "contains" : "does not contain",
1552                 contained.left(), contained.top(), contained.right(), contained.bottom());
1553    }
1554#StdOut
1555rect: (30, 50, 40, 60) contains (30, 50, 31, 51)
1556rect: (30, 50, 40, 60) does not contain (39, 49, 40, 50)
1557rect: (30, 50, 40, 60) does not contain (29, 59, 30, 60)
1558##
1559##
1560
1561#SeeAlso SkIRect::contains
1562
1563##
1564
1565# ------------------------------------------------------------------------------
1566
1567#Method bool intersect(const SkRect& r)
1568
1569#In Intersection
1570#Line # sets to shared area; returns true if not empty ##
1571Returns true if Rect intersects r, and sets Rect to intersection.
1572Returns false if Rect does not intersect r, and leaves Rect unchanged.
1573
1574Returns false if either r or Rect is empty, leaving Rect unchanged.
1575
1576#Param r  limit of result ##
1577
1578#Return true if r and Rect have area in common ##
1579
1580#Example
1581#Description
1582Two SkDebugf calls are required. If the calls are combined, their arguments
1583may not be evaluated in left to right order: the printed intersection may
1584be before or after the call to intersect.
1585##
1586    SkRect leftRect =  { 10, 40, 50, 80 };
1587    SkRect rightRect = { 30, 60, 70, 90 };
1588    SkDebugf("%s intersection: ", leftRect.intersect(rightRect) ? "" : "no ");
1589    SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(), 
1590                                 leftRect.right(), leftRect.bottom());
1591#StdOut
1592 intersection: 30, 60, 50, 80
1593##                                 
1594##
1595
1596#SeeAlso intersects Intersects join SkIRect::intersect
1597
1598##
1599
1600# ------------------------------------------------------------------------------
1601
1602#Method bool intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
1603
1604#In Intersection
1605Constructs Rect to intersect from (left, top, right, bottom). Does not sort
1606construction.
1607
1608Returns true if Rect intersects construction, and sets Rect to intersection.
1609Returns false if Rect does not intersect construction, and leaves Rect unchanged.
1610
1611Returns false if either construction or Rect is empty, leaving Rect unchanged.
1612
1613#Param left  x minimum of constructed Rect ##
1614#Param top  y minimum of constructed Rect ##
1615#Param right  x maximum of constructed Rect ##
1616#Param bottom  y maximum of constructed Rect ##
1617
1618#Return true if construction and Rect have area in common ##
1619
1620#Example
1621#Description
1622Two SkDebugf calls are required. If the calls are combined, their arguments
1623may not be evaluated in left to right order: the printed intersection may
1624be before or after the call to intersect.
1625##
1626    SkRect leftRect =  { 10, 40, 50, 80 };
1627    SkDebugf("%s intersection: ", leftRect.intersect(30, 60, 70, 90) ? "" : "no ");
1628    SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(), 
1629                                 leftRect.right(), leftRect.bottom());
1630#StdOut
1631 intersection: 30, 60, 50, 80
1632##                                 
1633##
1634
1635#SeeAlso intersects Intersects join SkIRect::intersect
1636
1637##
1638
1639# ------------------------------------------------------------------------------
1640
1641#Method bool SK_WARN_UNUSED_RESULT intersect(const SkRect& a, const SkRect& b)
1642
1643#In Intersection
1644Returns true if a intersects b, and sets Rect to intersection.
1645Returns false if a does not intersect b, and leaves Rect unchanged.
1646
1647Returns false if either a or b is empty, leaving Rect unchanged.
1648
1649#Param a  Rect to intersect ##
1650#Param b  Rect to intersect ##
1651
1652#Return true if a and b have area in common ##
1653
1654#Example
1655    SkRect result;
1656    bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 });
1657    SkDebugf("%s intersection: %g, %g, %g, %g\n", intersected ? "" : "no ",
1658             result.left(), result.top(), result.right(), result.bottom());
1659#StdOut
1660 intersection: 30, 60, 50, 80
1661##                                 
1662##
1663
1664#SeeAlso intersects Intersects join SkIRect::intersect
1665
1666##
1667
1668# ------------------------------------------------------------------------------
1669
1670#Method    bool intersects(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) const
1671
1672#In Intersection
1673#Line # returns true if areas overlap ##
1674Constructs Rect to intersect from (left, top, right, bottom). Does not sort
1675construction.
1676
1677Returns true if Rect intersects construction.
1678Returns false if either construction or Rect is empty, or do not intersect.
1679
1680#Param left  x minimum of constructed Rect ##
1681#Param top  y minimum of constructed Rect ##
1682#Param right  x maximum of constructed Rect ##
1683#Param bottom  y maximum of constructed Rect ##
1684
1685#Return true if construction and Rect have area in common ##
1686
1687#Example
1688    SkRect rect = { 10, 40, 50, 80 };
1689    SkDebugf("%s intersection", rect.intersects(30, 60, 70, 90) ? "" : "no ");
1690#StdOut
1691 intersection
1692##                                 
1693##
1694
1695#SeeAlso intersect Intersects SkIRect::Intersects
1696
1697##
1698
1699# ------------------------------------------------------------------------------
1700
1701#Method    bool intersects(const SkRect& r) const
1702
1703#In Intersection
1704Returns true if Rect intersects r.
1705Returns false if either r or Rect is empty, or do not intersect.
1706
1707#Param r  Rect to intersect ##
1708
1709#Return true if r and Rect have area in common ##
1710
1711#Example
1712    SkRect rect = { 10, 40, 50, 80 };
1713    SkDebugf("%s intersection", rect.intersects({30, 60, 70, 90}) ? "" : "no ");
1714#StdOut
1715 intersection
1716##                                 
1717##
1718
1719#SeeAlso intersect Intersects SkIRect::Intersects
1720
1721##
1722
1723# ------------------------------------------------------------------------------
1724
1725#Method    static bool Intersects(const SkRect& a, const SkRect& b)
1726
1727#In Intersection
1728#Line # returns true if areas overlap ##
1729Returns true if a intersects b.
1730Returns false if either a or b is empty, or do not intersect.
1731
1732#Param a  Rect to intersect ##
1733#Param b  Rect to intersect ##
1734
1735#Return true if a and b have area in common ##
1736
1737#Example
1738    SkDebugf("%s intersection", SkRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? "" : "no ");
1739#StdOut
1740 intersection
1741##                                 
1742##
1743
1744#SeeAlso intersect intersects SkIRect::Intersects
1745
1746##
1747
1748#Subtopic Intersection ##
1749
1750#Subtopic Join
1751#Line # set to union of bounds ##
1752
1753#Populate
1754
1755# ------------------------------------------------------------------------------
1756
1757#Method    void join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom)
1758
1759#In Join
1760#Line # sets to union of bounds ##
1761Constructs Rect to intersect from (left, top, right, bottom). Does not sort
1762construction.
1763
1764Sets Rect to the union of itself and the construction.
1765
1766Has no effect if construction is empty. Otherwise, if Rect is empty, sets
1767Rect to construction.
1768
1769#Param left  x minimum of constructed Rect ##
1770#Param top  y minimum of constructed Rect ##
1771#Param right  x maximum of constructed Rect ##
1772#Param bottom  y maximum of constructed Rect ##
1773
1774#Example
1775    SkRect rect = { 10, 20, 15, 25};
1776    rect.join(50, 60, 55, 65);
1777    SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1778#StdOut
1779 join: 10, 20, 55, 65
1780##                                 
1781##
1782
1783#SeeAlso joinNonEmptyArg joinPossiblyEmptyRect SkIRect::join
1784
1785##
1786
1787# ------------------------------------------------------------------------------
1788
1789#Method    void join(const SkRect& r)
1790
1791#In Join
1792Sets Rect to the union of itself and r.
1793
1794Has no effect if r is empty. Otherwise, if Rect is empty, sets
1795Rect to r.
1796
1797#Param r  expansion Rect ##
1798
1799#Example
1800    SkRect rect = { 10, 20, 15, 25};
1801    rect.join({50, 60, 55, 65});
1802    SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1803#StdOut
1804 join: 10, 20, 55, 65
1805##                                 
1806##
1807
1808#SeeAlso joinNonEmptyArg joinPossiblyEmptyRect SkIRect::join
1809
1810##
1811
1812# ------------------------------------------------------------------------------
1813
1814#Method    void joinNonEmptyArg(const SkRect& r)
1815
1816#In Join
1817#Line # sets to union of bounds, asserting that argument is not empty ##
1818Sets Rect to the union of itself and r.
1819
1820Asserts if r is empty and SK_DEBUG is defined.
1821If Rect is empty, sets Rect to r.
1822
1823May produce incorrect results if r is empty.
1824
1825#Param r  expansion Rect ##
1826
1827#Example
1828#Description
1829Since Rect is not sorted, first result is copy of toJoin.
1830##
1831    SkRect rect = { 10, 100, 15, 0};
1832    SkRect sorted = rect.makeSorted();
1833    SkRect toJoin = { 50, 60, 55, 65 };
1834    rect.joinNonEmptyArg(toJoin);
1835    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1836    sorted.joinNonEmptyArg(toJoin);
1837    SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);
1838#StdOut
1839rect: 50, 60, 55, 65
1840sorted: 10, 0, 55, 100
1841##                                 
1842##
1843
1844#SeeAlso join joinPossiblyEmptyRect SkIRect::join
1845
1846##
1847
1848# ------------------------------------------------------------------------------
1849
1850#Method    void joinPossiblyEmptyRect(const SkRect& r)
1851
1852#In Join
1853#Line # sets to union of bounds. Skips empty check for both ##
1854Sets Rect to the union of itself and the construction.
1855
1856May produce incorrect results if Rect or r is empty.
1857
1858#Param r  expansion Rect ##
1859
1860#Example
1861#Description
1862Since Rect is not sorted, first result is not useful.
1863##
1864    SkRect rect = { 10, 100, 15, 0};
1865    SkRect sorted = rect.makeSorted();
1866    SkRect toJoin = { 50, 60, 55, 65 };
1867    rect.joinPossiblyEmptyRect(toJoin);
1868    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
1869    sorted.joinPossiblyEmptyRect(toJoin);
1870    SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);
1871#StdOut
1872rect: 10, 60, 55, 65
1873sorted: 10, 0, 55, 100
1874##                                 
1875##
1876
1877#SeeAlso joinNonEmptyArg join SkIRect::join
1878
1879##
1880
1881#Subtopic Join ##
1882
1883#Subtopic Rounding
1884#Line # adjust to integer bounds ##
1885
1886#Populate
1887
1888#Method    void round(SkIRect* dst) const
1889
1890#In Rounding
1891#Line # sets members to nearest integer value ##
1892Sets IRect by adding 0.5 and discarding the fractional portion of Rect
1893members, using
1894#Formula
1895(SkScalarRoundToInt(fLeft), SkScalarRoundToInt(fTop),
1896 SkScalarRoundToInt(fRight), SkScalarRoundToInt(fBottom))
1897##
1898.
1899
1900#Param dst  storage for IRect ##
1901
1902#Example
1903    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
1904    SkIRect round;
1905    rect.round(&round);
1906    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
1907#StdOut
1908round: 31, 51, 41, 61
1909##
1910##
1911
1912#SeeAlso roundIn roundOut SkScalarRoundToInt
1913
1914##
1915
1916# ------------------------------------------------------------------------------
1917
1918#Method    void roundOut(SkIRect* dst) const
1919
1920#In Rounding
1921#Line # sets members to nearest integer value away from opposite ##
1922Sets IRect by discarding the fractional portion of fLeft and fTop; and
1923rounding up fRight and FBottom, using
1924#Formula
1925(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop),
1926 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom))
1927##
1928.
1929
1930#Param dst  storage for IRect ##
1931
1932#Example
1933    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
1934    SkIRect round;
1935    rect.roundOut(&round);
1936    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
1937#StdOut
1938round: 30, 50, 41, 61
1939##
1940##
1941
1942#SeeAlso roundIn round SkScalarRoundToInt
1943
1944##
1945
1946# ------------------------------------------------------------------------------
1947
1948#Method    void roundOut(SkRect* dst) const 
1949
1950#In Rounding
1951Sets Rect by discarding the fractional portion of fLeft and fTop; and
1952rounding up fRight and FBottom, using
1953#Formula
1954(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop),
1955 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom))
1956##
1957.
1958
1959#Param dst  storage for Rect ##
1960
1961#Example
1962    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
1963    SkRect round;
1964    rect.roundOut(&round);
1965    SkDebugf("round: %g, %g, %g, %g\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
1966#StdOut
1967round: 30, 50, 41, 61
1968##
1969##
1970
1971#SeeAlso roundIn round SkScalarRoundToInt
1972
1973##
1974
1975# ------------------------------------------------------------------------------
1976
1977#Method    void roundIn(SkIRect* dst) const
1978
1979#In Rounding
1980#Line # sets members to nearest integer value towards opposite ##
1981Sets Rect by rounding up fLeft and fTop; and
1982discarding the fractional portion of fRight and FBottom, using
1983
1984#Formula
1985(SkScalarCeilToInt(fLeft), SkScalarCeilToInt(fTop),
1986 SkScalarFloorToInt(fRight), SkScalarFloorToInt(fBottom))
1987##
1988.
1989
1990#Param dst  storage for IRect ##
1991
1992#Example
1993    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
1994    SkIRect round;
1995    rect.roundIn(&round);
1996    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
1997#StdOut
1998round: 31, 51, 40, 60
1999##
2000##
2001
2002#SeeAlso roundOut round SkScalarRoundToInt
2003
2004##
2005
2006# ------------------------------------------------------------------------------
2007
2008#Method    SkIRect round() const
2009
2010#In Rounding
2011Returns IRect by adding 0.5 and discarding the fractional portion of Rect
2012members, using
2013#Formula
2014(SkScalarRoundToInt(fLeft), SkScalarRoundToInt(fTop),
2015 SkScalarRoundToInt(fRight), SkScalarRoundToInt(fBottom))
2016##
2017.
2018
2019#Return  rounded IRect ##
2020
2021#Example
2022    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
2023    SkIRect round = rect.round();
2024    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
2025#StdOut
2026round: 31, 51, 41, 61
2027##
2028##
2029
2030#SeeAlso roundOut roundIn SkScalarRoundToInt
2031
2032##
2033
2034# ------------------------------------------------------------------------------
2035
2036#Method    SkIRect roundOut() const
2037
2038#In Rounding
2039Sets IRect by discarding the fractional portion of fLeft and fTop; and
2040rounding up fRight and FBottom, using
2041#Formula
2042(SkScalarFloorToInt(fLeft), SkScalarFloorToInt(fTop),
2043 SkScalarCeilToInt(fRight), SkScalarCeilToInt(fBottom))
2044##
2045.
2046
2047#Return  rounded IRect ##
2048
2049#Example
2050    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
2051    SkIRect round = rect.roundOut();
2052    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
2053#StdOut
2054round: 30, 50, 41, 61
2055##
2056##
2057
2058#SeeAlso round roundIn SkScalarRoundToInt
2059
2060##
2061
2062#Subtopic Rounding ##
2063
2064#Subtopic Sorting
2065#Line # orders sides ##
2066
2067#Populate
2068
2069# ------------------------------------------------------------------------------
2070
2071#Method    void sort()
2072
2073#In Sorting
2074#Line # orders sides from smaller to larger ##
2075Swaps fLeft and fRight if fLeft is greater than fRight; and swaps
2076fTop and fBottom if fTop is greater than fBottom. Result may be empty;
2077and width() and height() will be zero or positive.
2078
2079#Example
2080    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };
2081    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
2082    rect.sort();
2083    SkDebugf("sorted: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
2084#StdOut
2085rect: 30.5, 50.5, 20.5, 10.5
2086sorted: 20.5, 10.5, 30.5, 50.5
2087##
2088##
2089
2090#SeeAlso makeSorted SkIRect::sort isSorted
2091
2092##
2093
2094# ------------------------------------------------------------------------------
2095
2096#Method    SkRect makeSorted() const
2097
2098#In Sorting
2099#In Constructor
2100#Line # constructs, ordering sides from smaller to larger ##
2101Returns Rect with fLeft and fRight swapped if fLeft is greater than fRight; and
2102with fTop and fBottom swapped if fTop is greater than fBottom. Result may be empty;
2103and width() and height() will be zero or positive.
2104
2105#Return  sorted Rect ##
2106
2107#Example
2108    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };
2109    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
2110    SkRect sort = rect.makeSorted();
2111    SkDebugf("sorted: %g, %g, %g, %g\n", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom);
2112#StdOut
2113rect: 30.5, 50.5, 20.5, 10.5
2114sorted: 20.5, 10.5, 30.5, 50.5
2115##
2116##
2117
2118#SeeAlso sort SkIRect::makeSorted isSorted
2119
2120##
2121
2122#Subtopic Sorting ##
2123
2124# ------------------------------------------------------------------------------
2125
2126#Method    const SkScalar* asScalars() const
2127#In Property
2128#Line # returns pointer to members as array ##
2129Returns pointer to first Scalar in Rect, to treat it as an array with four
2130entries.
2131
2132#Return  pointer to fLeft ##
2133
2134#Example
2135   SkRect rect = {7, 11, 13, 17};
2136SkDebugf("rect.asScalars() %c= &rect.fLeft\n", rect.asScalars() == &rect.fLeft? '=' : '!');
2137#StdOut
2138rect.asScalars() == &rect.fLeft
2139##
2140##
2141
2142#SeeAlso toQuad
2143
2144##
2145
2146# ------------------------------------------------------------------------------
2147
2148#Method    void dump(bool asHex) const
2149#In Property
2150#Line # sends text representation to standard output using floats ##
2151Writes text representation of Rect to standard output. Set asHex to true to 
2152generate exact binary representations of floating point numbers.
2153
2154#Param asHex  true if SkScalar values are written as hexadecimal ##
2155
2156#Example
2157   SkRect rect = {20, 30, 40, 50};
2158    for (bool dumpAsHex : { false, true } ) {
2159        rect.dump(dumpAsHex);
2160        SkDebugf("\n");
2161    }
2162#StdOut
2163SkRect::MakeLTRB(20, 30, 40, 50);
2164
2165SkRect::MakeLTRB(SkBits2Float(0x41a00000), /* 20.000000 */
2166                 SkBits2Float(0x41f00000), /* 30.000000 */
2167                 SkBits2Float(0x42200000), /* 40.000000 */
2168                 SkBits2Float(0x42480000)  /* 50.000000 */);
2169##
2170##
2171
2172#SeeAlso dumpHex
2173
2174##
2175
2176# ------------------------------------------------------------------------------
2177
2178#Method    void dump() const
2179
2180Writes text representation of Rect to standard output. The representation may be
2181directly compiled as C++ code. Floating point values are written
2182with limited precision; it may not be possible to reconstruct original Rect
2183from output.
2184
2185#Example
2186SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};
2187rect.dump();
2188SkRect copy = SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);
2189SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not ");
2190#StdOut
2191SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);
2192rect is not equal to copy
2193##
2194##
2195
2196#SeeAlso dumpHex
2197
2198##
2199
2200# ------------------------------------------------------------------------------
2201
2202#Method    void dumpHex() const
2203#In Property
2204#Line # sends text representation to standard output using hexadecimal ##
2205Writes text representation of Rect to standard output. The representation may be
2206directly compiled as C++ code. Floating point values are written
2207in hexadecimal to preserve their exact bit pattern. The output reconstructs the
2208original Rect.
2209
2210Use instead of dump() when submitting 
2211#A bug reports against Skia # http://bug.skia.org ##
2212.
2213
2214#Example
2215   SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};
2216rect.dumpHex();
2217SkRect copy = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
2218                 SkBits2Float(0x3f2aaaab), /* 0.666667 */
2219                 SkBits2Float(0x40266666), /* 2.600000 */
2220                 SkBits2Float(0x40e00000)  /* 7.000000 */);
2221SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not ");
2222#StdOut
2223SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
2224                 SkBits2Float(0x3f2aaaab), /* 0.666667 */
2225                 SkBits2Float(0x40266666), /* 2.600000 */
2226                 SkBits2Float(0x40e00000)  /* 7.000000 */);
2227rect is equal to copy
2228##
2229##
2230
2231#SeeAlso dump
2232
2233##
2234
2235#Method static SkRect SK_WARN_UNUSED_RESULT MakeLargest()
2236#Deprecated
2237##
2238
2239#Struct SkRect ##
2240
2241#Topic Rect ##
2242