74 lines
2.1 KiB
Markdown
74 lines
2.1 KiB
Markdown
|
SkRect
|
||
|
======
|
||
|
|
||
|
*Rectangles*
|
||
|
|
||
|
<!--Updated Mar 4, 2011-->
|
||
|
|
||
|
SkRect is basic to many drawing and measuring operations. It can be
|
||
|
drawn using canvas.drawRect(), but it is also used to return the
|
||
|
bounds of objects like paths and text characters. It is specified
|
||
|
using SkScalar values.
|
||
|
|
||
|
SkIRect is the integer counter part to SkRect, but is specified using
|
||
|
32bit integers.
|
||
|
|
||
|
<!--?prettify lang=cc?-->
|
||
|
|
||
|
struct SkRect {
|
||
|
SkScalar fLeft;
|
||
|
SkScalar fTop;
|
||
|
SkScalar fRight;
|
||
|
SkScalar fBottom;
|
||
|
// methods
|
||
|
};
|
||
|
|
||
|
SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
|
||
|
|
||
|
SkRect has the usual getters, to return width(), height(), centerX(),
|
||
|
etc. It also has methods to compute unions and intersections between
|
||
|
rectangles.
|
||
|
|
||
|
Converting between SkRect and SkIRect is asymetric. Short of overflow
|
||
|
issues when SkScalar is an int, converting from SkIRect to SkRect is
|
||
|
straight forward:
|
||
|
|
||
|
<!--?prettify lang=cc?-->
|
||
|
|
||
|
SkRect::set(const SkIRect&);
|
||
|
|
||
|
However, convert from SkRect to SkIRect needs to know how to go from
|
||
|
fractional values to integers.
|
||
|
|
||
|
<!--?prettify lang=cc?-->
|
||
|
|
||
|
SkRect::round(SkIRect*) const; // Round each coordinate.
|
||
|
SkRect::roundOut(SkIRect*) const; // Apply floor to left/top,
|
||
|
// and ceil to right/bottom.
|
||
|
|
||
|
In Skia, rectangle coordinates describe the boundary of what is drawn,
|
||
|
such that an empty rectangle encloses zero pixels:
|
||
|
|
||
|
bool SkRect::isEmpty() const { return fLeft >= fRight || fTop >= fBottom; }
|
||
|
|
||
|
<!--?prettify lang=cc?-->
|
||
|
|
||
|
SkScalar SkRect::width() const { return fRight - fLeft; }
|
||
|
|
||
|
SkScalar SkRect::height() const { return fBottom - fTop; }
|
||
|
|
||
|
bool SkRect::contains(SkScalar x, SkScalar y) const {
|
||
|
return fLeft <= x && x < fRight && fTop <= y && y < fBottom;
|
||
|
}
|
||
|
|
||
|
Thus, to draw a single pixel (assuming no matrix on the canvas), the
|
||
|
rectangle should be initialized as follows:
|
||
|
|
||
|
<!--?prettify lang=cc?-->
|
||
|
|
||
|
SkRect r = SkRect::MakeXYWH(x, y, SkIntToScalar(1), SkIntToScalar(1));
|
||
|
|
||
|
The same conventions hold for the integer counterpart: SkIRect. This
|
||
|
also dovetails with SkRegion, which has the same model for set
|
||
|
membership, and which uses SkIRect.
|