aboutsummaryrefslogtreecommitdiffhomepage
path: root/site/user/api/skpaint_overview.md
diff options
context:
space:
mode:
Diffstat (limited to 'site/user/api/skpaint_overview.md')
-rw-r--r--site/user/api/skpaint_overview.md207
1 files changed, 207 insertions, 0 deletions
diff --git a/site/user/api/skpaint_overview.md b/site/user/api/skpaint_overview.md
new file mode 100644
index 0000000000..df89812bb5
--- /dev/null
+++ b/site/user/api/skpaint_overview.md
@@ -0,0 +1,207 @@
+SkPaint Overview
+=======
+<span id="top"></span>
+
+*color, stroke, font, effects*
+
+<div class="float">
+ <ul>
+ <li><a href="#">SkPaint</a></li>
+ <li><a href="#SkXfermode">SkXfermode</a></li>
+ <li><a href="#SkShader">SkShader</a></li>
+ <li><a href="#SkMaskFilter">SkMaskFilter</a></li>
+ <li><a href="#SkColorFilter">SkColorFilter</a></li>
+ <li><a href="#SkPathEffect">SkPathEffect</a></li>
+ </ul>
+</div>
+
+
+Anytime you draw something in Skia, and want to specify what color it
+is, or how it blends with the background, or what style or font to
+draw it in, you specify those attributes in a paint.
+
+Unlike `SkCanvas`, paints do not maintain an internal stack of state
+(i.e. there is no save/restore on a paint). However, paints are
+relatively light-weight, so the client may create and maintain any
+number of paint objects, each set up for a particular use. Factoring
+all of these color and stylistic attributes out of the canvas state,
+and into (multiple) paint objects, allows canvas' save/restore to be
+that much more efficient, as all they have to do is maintain the stack
+of matrix and clip settings.
+
+<fiddle-embed name='@skpaint_skia'></fiddle-embed>
+
+This shows three different paints, each set up to draw in a different
+style. Now the caller can intermix these paints freely, either using
+them as is, or modifying them as the drawing proceeds.
+
+<fiddle-embed name='@skpaint_mix'></fiddle-embed>
+
+Beyond simple attributes such as color, strokes, and text values,
+paints support effects. These are subclasses of different aspects of
+the drawing pipeline, that when referenced by a paint (each of them is
+reference-counted), are called to override some part of the drawing
+pipeline.
+
+For example, to draw using a gradient instead of a single color,
+assign a SkShader to the paint.
+
+<fiddle-embed name='@skpaint_shader'></fiddle-embed>
+
+Now, anything drawn with that paint will be drawn with the gradient
+specified in the call to `MakeLinear()`. The shader object that is
+returned is reference-counted. Whenever any effects object, like a
+shader, is assigned to a paint, its reference-count is increased by
+the paint. To balance this, the caller in the above example calls
+`unref()` on the shader once it has assigned it to the paint. Now the
+paint is the only "owner" of that shader, and it will automatically
+call `unref()` on the shader when either the paint goes out of scope, or
+if another shader (or null) is assigned to it.
+
+There are 6 types of effects that can be assigned to a paint:
+
+* **SkPathEffect** - modifications to the geometry (path) before it
+ generates an alpha mask (e.g. dashing)
+* **SkRasterizer** - composing custom mask layers (e.g. shadows)
+* **SkMaskFilter** - modifications to the alpha mask before it is
+ colorized and drawn (e.g. blur)
+* **SkShader** - e.g. gradients (linear, radial, sweep), bitmap patterns
+ (clamp, repeat, mirror)
+* **SkColorFilter** - modify the source color(s) before applying the
+ xfermode (e.g. color matrix)
+* **SkXfermode** - e.g. porter-duff transfermodes, blend modes
+
+Paints also hold a reference to a SkTypeface. The typeface represents
+a specific font style, to be used for measuring and drawing
+text. Speaking of which, paints are used not only for drawing text,
+but also for measuring it.
+
+<!--?prettify lang=cc?-->
+
+ paint.measureText(...);
+ paint.getTextBounds(...);
+ paint.textToGlyphs(...);
+ paint.getFontMetrics(...);
+
+<span id="SkXfermode"></span>
+
+SkXfermode
+----------
+
+The following example demonstrates all of the Skia's standard transfer
+modes. In this example the source is a solid magenta color with a
+horizontal alpha gradient and the destination is a solid cyan color
+with a vertical alpha gradient.
+
+<fiddle-embed name='@skpaint_xfer'></fiddle-embed>
+
+<span id="SkShader"></span>
+
+SkShader
+--------
+
+Several shaders are defined (besides the linear gradient already mentioned):
+
+* Bitmap Shader
+
+ <fiddle-embed name='@skpaint_bitmap_shader'></fiddle-embed>
+
+* Radial Gradient Shader
+
+ <fiddle-embed name='@skpaint_radial'></fiddle-embed>
+
+* Two-Point Conical Gradient Shader
+
+ <fiddle-embed name='@skpaint_2pt'></fiddle-embed>
+
+
+* Sweep Gradient Shader
+
+ <fiddle-embed name='@skpaint_sweep'></fiddle-embed>
+
+* Fractal Perlin Noise Shader
+
+ <fiddle-embed name='@skpaint_perlin'></fiddle-embed>
+
+* Turbulence Perlin Noise Shader
+
+ <fiddle-embed name='@skpaint_turb'></fiddle-embed>
+
+* Compose Shader
+
+ <fiddle-embed name='@skpaint_compose_shader'></fiddle-embed>
+
+
+<span id="SkMaskFilter"></span>
+
+SkMaskFilter
+------------
+
+* Blur Mask Filter
+
+ <fiddle-embed name='@skpaint_blur_mask_filter'></fiddle-embed>
+
+
+<span id="SkColorFilter"></span>
+
+SkColorFilter
+-------------
+
+* Color Matrix Color Filter
+
+ <fiddle-embed name='@skpaint_matrix_color_filter'></fiddle-embed>
+
+* Color Table Color Filter
+
+ <fiddle-embed name='@skpaint_color_table_filter'></fiddle-embed>
+
+<span id="SkPathEffect"></span>
+
+SkPathEffect
+------------
+
+* SkPath2DPathEffect: Stamp the specified path to fill the shape,
+ using the matrix to define the latice.
+
+ <fiddle-embed name='@skpaint_path_2d_path_effect'></fiddle-embed>
+
+* SkLine2DPathEffect: a special case of SkPath2DPathEffect where the
+ path is a straight line to be stroked, not a path to be filled.
+
+ <fiddle-embed name='@skpaint_line_2d_path_effect'></fiddle-embed>
+
+* SkPath1DPathEffect: create dash-like effects by replicating the specified path along the drawn path.
+
+ <fiddle-embed name='@skpaint_path_1d_path_effect'></fiddle-embed>
+
+* SkArcToPathEffect
+
+ The following few examples use this function:
+
+ <fiddle-embed name='@skpaint_arc_to_path_effect'></fiddle-embed>
+
+* SkCornerPathEffect: a path effect that can turn sharp corners into
+ various treatments (e.g. rounded corners).
+
+ <fiddle-embed name='@skpaint_corner_path_effects'></fiddle-embed>
+
+* SkDashPathEffect: a path effect that implements dashing.
+
+ <fiddle-embed name='@skpaint_dash_path_effect'></fiddle-embed>
+
+* SkDiscretePathEffect: This path effect chops a path into discrete
+ segments, and randomly displaces them.
+
+ <fiddle-embed name='@skpaint_discrete_path_effect'></fiddle-embed>
+
+* SkComposePathEffect: a pathEffect whose effect is to apply
+ first the inner pathEffect and the the outer pathEffect (i.e.
+ outer(inner(path))).
+
+ <fiddle-embed name='@skpaint_compose_path_effect'></fiddle-embed>
+
+* SkSumPathEffect: a pathEffect whose effect is to apply two effects,
+ in sequence (i.e. first(path) + second(path)).
+
+ <fiddle-embed name='@skpaint_sum_path_effect'></fiddle-embed>
+