61313f38e1
First cut at splitting bookmaker documentation into reference and overview. Reference starts with a hyperlinked index, generated from a public include. This moves towards typing once, minimizing the information duplicated in the .h file and the .bmh file. TBR=caryclark@google.com Docs-Preview: https://skia.org/?cl=154630 Change-Id: I836622db9b1786bd28c0bce2536cd3caef6e5a32 Reviewed-on: https://skia-review.googlesource.com/c/154630 Commit-Queue: Cary Clark <caryclark@skia.org> Auto-Submit: Cary Clark <caryclark@skia.org> Reviewed-by: Cary Clark <caryclark@skia.org>
170 lines
5.4 KiB
Plaintext
170 lines
5.4 KiB
Plaintext
#Topic Path_Overview
|
|
|
|
Path contains Lines and Curves which can be stroked or filled. Contour is
|
|
composed of a series of connected Lines and Curves. Path may contain zero,
|
|
one, or more Contours.
|
|
Each Line and Curve are described by Verb, Points, and optional Path_Conic_Weight.
|
|
|
|
Each pair of connected Lines and Curves share common Point; for instance, Path
|
|
containing two connected Lines are described the Path_Verb sequence:
|
|
SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb; and a Point sequence
|
|
with three entries, sharing
|
|
the middle entry as the end of the first Line and the start of the second Line.
|
|
|
|
Path components Arc, Rect, Round_Rect, Circle, and Oval are composed of
|
|
Lines and Curves with as many Verbs and Points required
|
|
for an exact description. Once added to Path, these components may lose their
|
|
identity; although Path can be inspected to determine if it describes a single
|
|
Rect, Oval, Round_Rect, and so on.
|
|
|
|
#Example
|
|
#Height 192
|
|
#Description
|
|
Path contains three Contours: Line, Circle, and Quad. Line is stroked but
|
|
not filled. Circle is stroked and filled; Circle stroke forms a loop. Quad
|
|
is stroked and filled, but since it is not closed, Quad does not stroke a loop.
|
|
##
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPath path;
|
|
path.moveTo(124, 108);
|
|
path.lineTo(172, 24);
|
|
path.addCircle(50, 50, 30);
|
|
path.moveTo(36, 148);
|
|
path.quadTo(66, 188, 120, 136);
|
|
canvas->drawPath(path, paint);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setColor(SK_ColorBLUE);
|
|
paint.setStrokeWidth(3);
|
|
canvas->drawPath(path, paint);
|
|
}
|
|
##
|
|
|
|
Path contains a Path_Fill_Type which determines whether overlapping Contours
|
|
form fills or holes. Path_Fill_Type also determines whether area inside or outside
|
|
Lines and Curves is filled.
|
|
|
|
#Example
|
|
#Height 192
|
|
#Description
|
|
Path is drawn filled, then stroked, then stroked and filled.
|
|
##
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
SkPath path;
|
|
path.moveTo(36, 48);
|
|
path.quadTo(66, 88, 120, 36);
|
|
canvas->drawPath(path, paint);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setColor(SK_ColorBLUE);
|
|
paint.setStrokeWidth(8);
|
|
canvas->translate(0, 50);
|
|
canvas->drawPath(path, paint);
|
|
paint.setStyle(SkPaint::kStrokeAndFill_Style);
|
|
paint.setColor(SK_ColorRED);
|
|
canvas->translate(0, 50);
|
|
canvas->drawPath(path, paint);
|
|
}
|
|
##
|
|
|
|
Path contents are never shared. Copying Path by value effectively creates
|
|
a new Path independent of the original. Internally, the copy does not duplicate
|
|
its contents until it is edited, to reduce memory use and improve performance.
|
|
|
|
#Subtopic Contour
|
|
#Alias Path_Contour ##
|
|
#Alias Contour ##
|
|
#Alias Contours ##
|
|
#Line # loop of lines and curves ##
|
|
|
|
Contour contains one or more Verbs, and as many Points as
|
|
are required to satisfy Path_Verb_Array. First Path_Verb in Path is always
|
|
SkPath::kMove_Verb; each SkPath::kMove_Verb that follows starts a new Contour.
|
|
|
|
#Example
|
|
#Description
|
|
Each SkPath::moveTo starts a new Contour, and content after SkPath::close()
|
|
also starts a new Contour. Since SkPath::conicTo is not preceded by
|
|
SkPath::moveTo, the first Point of the third Contour starts at the last Point
|
|
of the second Contour.
|
|
##
|
|
#Height 192
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
canvas->drawString("1st contour", 150, 100, paint);
|
|
canvas->drawString("2nd contour", 130, 160, paint);
|
|
canvas->drawString("3rd contour", 40, 30, paint);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
SkPath path;
|
|
path.moveTo(124, 108);
|
|
path.lineTo(172, 24);
|
|
path.moveTo(36, 148);
|
|
path.quadTo(66, 188, 120, 136);
|
|
path.close();
|
|
path.conicTo(70, 20, 110, 40, 0.6f);
|
|
canvas->drawPath(path, paint);
|
|
##
|
|
|
|
If final Path_Verb in Contour is SkPath::kClose_Verb, Line connects Path_Last_Point in
|
|
Contour with first Point. A closed Contour, stroked, draws
|
|
Paint_Stroke_Join at Path_Last_Point and first Point. Without SkPath::kClose_Verb
|
|
as final Verb, Path_Last_Point and first Point are not connected; Contour
|
|
remains open. An open Contour, stroked, draws Paint_Stroke_Cap at
|
|
Path_Last_Point and first Point.
|
|
|
|
#Example
|
|
#Height 160
|
|
#Description
|
|
Path is drawn stroked, with an open Contour and a closed Contour.
|
|
##
|
|
void draw(SkCanvas* canvas) {
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setStrokeWidth(8);
|
|
SkPath path;
|
|
path.moveTo(36, 48);
|
|
path.quadTo(66, 88, 120, 36);
|
|
canvas->drawPath(path, paint);
|
|
path.close();
|
|
canvas->translate(0, 50);
|
|
canvas->drawPath(path, paint);
|
|
}
|
|
##
|
|
|
|
#Subtopic Zero_Length
|
|
#Alias Zero_Length_Contour ##
|
|
#Line # consideration when contour has no length ##
|
|
Contour length is distance traveled from first Point to Path_Last_Point,
|
|
plus, if Contour is closed, distance from Path_Last_Point to first Point.
|
|
Even if Contour length is zero, stroked Lines are drawn if Paint_Stroke_Cap
|
|
makes them visible.
|
|
|
|
#Example
|
|
#Height 64
|
|
SkPaint paint;
|
|
paint.setAntiAlias(true);
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
paint.setStrokeWidth(8);
|
|
paint.setStrokeCap(SkPaint::kRound_Cap);
|
|
SkPath path;
|
|
path.moveTo(36, 48);
|
|
path.lineTo(36, 48);
|
|
canvas->drawPath(path, paint);
|
|
path.reset();
|
|
paint.setStrokeCap(SkPaint::kSquare_Cap);
|
|
path.moveTo(56, 48);
|
|
path.close();
|
|
canvas->drawPath(path, paint);
|
|
##
|
|
|
|
#Subtopic Zero_Length ##
|
|
|
|
#Subtopic Contour ##
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
#Topic Path_Overview ##
|