ee2a8eede9
NOTRY=true DOCS_PREVIEW= https://skia.org/?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/skcanvas?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/skpaint?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/skrect?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/skregion?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/skmatrix?cl=1127383010 DOCS_PREVIEW= https://skia.org/user/api/canvas?cl=1127383010 Review URL: https://codereview.chromium.org/1127383010
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.
|