| #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 ## |