分类:
2009-03-23 14:50:29
//SkPaint.h
/** \class SkPaint
The SkPaint class holds the style and color information about how to draw
geometries, text and bitmaps.
*/
//SkPaint包含有绘画图形,字符,图像时的风格,颜色等信息。
class SkPaint {
public:
SkPaint();
SkPaint(const SkPaint& paint);
~SkPaint();
SkPaint& operator=(const SkPaint&);
friend int operator==(const SkPaint& a, const SkPaint& b);
friend int operator!=(const SkPaint& a, const SkPaint& b)
{
return !(a == b);
}
void flatten(SkFlattenableWriteBuffer&) const;
void unflatten(SkFlattenableReadBuffer&);
/** Restores the paint to its initial settings.
*/
//重新初始化
void reset();
/** Specifies the bit values that are stored in the paint's flags.
*/
//paint的flag
enum Flags {
kAntiAlias_Flag = 0x01, //!< mask to enable antialiasing
kFilterBitmap_Flag = 0x02, //!< mask to enable bitmap filtering
kDither_Flag = 0x04, //!< mask to enable dithering
kUnderlineText_Flag = 0x08, //!< mask to enable underline text
kStrikeThruText_Flag = 0x10, //!< mask to enable strike-thru text
kFakeBoldText_Flag = 0x20, //!< mask to enable fake-bold text
kLinearText_Flag = 0x40, //!< mask to enable linear-text
kSubpixelText_Flag = 0x80, //!< mask to enable subpixel-text
kDevKernText_Flag = 0x100, //!< mask to enable device kerning text
kAllFlags = 0x1FF
};
//下面是关于获得和设置flag的相关函数
/** Return the paint's flags. Use the Flag enum to test flag values.
@return the paint's flags (see enums ending in _Flag for bit masks)
*/
uint32_t getFlags() const { return fFlags; }
/** Set the paint's flags. Use the Flag enum to specific flag values.
@param flags The new flag bits for the paint (see Flags enum)
*/
void setFlags(uint32_t flags);
/** Helper for getFlags(), returning true if kAntiAlias_Flag bit is set
@return true if the antialias bit is set in the paint's flags.
*/
bool isAntiAlias() const
{
return SkToBool(this->getFlags() & kAntiAlias_Flag);
}
/** Helper for setFlags(), setting or clearing the kAntiAlias_Flag bit
@param aa true to enable antialiasing, false to disable it
*/
void setAntiAlias(bool aa);
/** Helper for getFlags(), returning true if kDither_Flag bit is set
@return true if the dithering bit is set in the paint's flags.
*/
bool isDither() const
{
return SkToBool(this->getFlags() & kDither_Flag);
}
/** Helper for setFlags(), setting or clearing the kDither_Flag bit
@param dither true to enable dithering, false to disable it
*/
void setDither(bool dither);
/** Helper for getFlags(), returning true if kLinearText_Flag bit is set
@return true if the lineartext bit is set in the paint's flags
*/
bool isLinearText() const
{
return SkToBool(this->getFlags() & kLinearText_Flag);
}
/** Helper for setFlags(), setting or clearing the kLinearText_Flag bit
@param linearText true to set the linearText bit in the paint's flags,
false to clear it.
*/
void setLinearText(bool linearText);
/** Helper for getFlags(), returning true if kSubpixelText_Flag bit is set
@return true if the lineartext bit is set in the paint's flags
*/
bool isSubpixelText() const
{
return SkToBool(this->getFlags() & kSubpixelText_Flag);
}
/** Helper for setFlags(), setting or clearing the kSubpixelText_Flag bit
@param subpixelText true to set the subpixelText bit in the paint's
flags, false to clear it.
*/
void setSubpixelText(bool subpixelText);
/** Helper for getFlags(), returning true if kUnderlineText_Flag bit is set
@return true if the underlineText bit is set in the paint's flags.
*/
bool isUnderlineText() const
{
return SkToBool(this->getFlags() & kUnderlineText_Flag);
}
/** Helper for setFlags(), setting or clearing the kUnderlineText_Flag bit
@param underlineText true to set the underlineText bit in the paint's
flags, false to clear it.
*/
void setUnderlineText(bool underlineText);
/** Helper for getFlags(), returns true if kStrikeThruText_Flag bit is set
@return true if the strikeThruText bit is set in the paint's flags.
*/
bool isStrikeThruText() const
{
return SkToBool(this->getFlags() & kStrikeThruText_Flag);
}
/** Helper for setFlags(), setting or clearing the kStrikeThruText_Flag bit
@param strikeThruText true to set the strikeThruText bit in the
paint's flags, false to clear it.
*/
void setStrikeThruText(bool strikeThruText);
/** Helper for getFlags(), returns true if kFakeBoldText_Flag bit is set
@return true if the kFakeBoldText_Flag bit is set in the paint's flags.
*/
bool isFakeBoldText() const
{
return SkToBool(this->getFlags() & kFakeBoldText_Flag);
}
/** Helper for setFlags(), setting or clearing the kFakeBoldText_Flag bit
@param fakeBoldText true to set the kFakeBoldText_Flag bit in the paint's
flags, false to clear it.
*/
void setFakeBoldText(bool fakeBoldText);
/** Helper for getFlags(), returns true if kDevKernText_Flag bit is set
@return true if the kernText bit is set in the paint's flags.
*/
bool isDevKernText() const
{
return SkToBool(this->getFlags() & kDevKernText_Flag);
}
/** Helper for setFlags(), setting or clearing the kKernText_Flag bit
@param kernText true to set the kKernText_Flag bit in the paint's
flags, false to clear it.
*/
void setDevKernText(bool devKernText);
bool isFilterBitmap() const
{
return SkToBool(this->getFlags() & kFilterBitmap_Flag);
}
void setFilterBitmap(bool filterBitmap);
/** Styles apply to rect, oval, path, and text.
Bitmaps are always drawn in "fill", and lines are always drawn in
"stroke".
*/
//图形图像的填充类型,适用于rect, oval, path, and text.
//Bitmaps使用kFill_Style;lines使用kStroke_Style。
enum Style {
kFill_Style, //!< fill with the paint's color
kStroke_Style, //!< stroke with the paint's color
kStrokeAndFill_Style, //!< fill and stroke with the paint's color
kStyleCount,
};
/** Return the paint's style, used for controlling how primitives'
geometries are interpreted (except for drawBitmap, which always assumes
kFill_Style).
@return the paint's Style
*/
Style getStyle() const { return (Style)fStyle; }
/** Set the paint's style, used for controlling how primitives'
geometries are interpreted (except for drawBitmap, which always assumes
Fill).
@param style The new style to set in the paint
*/
void setStyle(Style style);
/** Return the paint's color. Note that the color is a 32bit value
containing alpha as well as r,g,b. This 32bit value is not
premultiplied, meaning that its alpha can be any value, regardless of
the values of r,g,b.
@return the paint's color (and alpha).
*/
//当前paint的颜色值
SkColor getColor() const { return fColor; }
/** Set the paint's color. Note that the color is a 32bit value containing
alpha as well as r,g,b. This 32bit value is not premultiplied, meaning
that its alpha can be any value, regardless of the values of r,g,b.
@param color The new color (including alpha) to set in the paint.
*/
void setColor(SkColor color);
/** Helper to getColor() that just returns the color's alpha value.
@return the alpha component of the paint's color.
*/
uint8_t getAlpha() const { return SkToU8(SkColorGetA(fColor)); }
/** Helper to setColor(), that only assigns the color's alpha value,
leaving its r,g,b values unchanged.
@param a set the alpha component (0..255) of the paint's color.
*/
void setAlpha(U8CPU a);
/** Helper to setColor(), that takes a,r,g,b and constructs the color value
using SkColorSetARGB()
@param a The new alpha component (0..255) of the paint's color.
@param r The new red component (0..255) of the paint's color.
@param g The new green component (0..255) of the paint's color.
@param b The new blue component (0..255) of the paint's color.
*/
void setARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
/** Return the width for stroking.
A value of 0 strokes in hairline mode.
Hairlines always draw 1-pixel wide, regardless of the matrix.
@return the paint's stroke width, used whenever the paint's style is
Stroke or StrokeAndFill.
*/
//画笔宽度。如果fWidth为0, 则会使用宽度为1的画笔
SkScalar getStrokeWidth() const { return fWidth; }
/** Set the width for stroking.
Pass 0 to stroke in hairline mode.
Hairlines always draw 1-pixel wide, regardless of the matrix.
@param width set the paint's stroke width, used whenever the paint's
style is Stroke or StrokeAndFill.
*/
//可以传入0为参数
void setStrokeWidth(SkScalar width);
/** Return the paint's stroke miter value. This is used to control the
behavior of miter joins when the joins angle is sharp.
@return the paint's miter limit, used whenever the paint's style is
Stroke or StrokeAndFill.
*/
//画笔相交的斜角缝大小。这个参数会影响交接的效果。优先级高于paint's style
SkScalar getStrokeMiter() const { return fMiterLimit; }
/** Set the paint's stroke miter value. This is used to control the
behavior of miter joins when the joins angle is sharp. This value must
be >= 0.
@param miter set the miter limit on the paint, used whenever the
paint's style is Stroke or StrokeAndFill.
*/
//传入参数必须>0
void setStrokeMiter(SkScalar miter);
/** Cap enum specifies the settings for the paint's strokecap. This is the
treatment that is applied to the beginning and end of each non-closed
contour (e.g. lines).
*/
enum Cap {
kButt_Cap, //!< begin/end contours with no extension
kRound_Cap, //!< begin/end contours with a semi-circle extension
kSquare_Cap, //!< begin/end contours with a half square extension
kCapCount,
kDefault_Cap = kButt_Cap
};
/** Join enum specifies the settings for the paint's strokejoin. This is
the treatment that is applied to corners in paths and rectangles.
*/
enum Join {
kMiter_Join, //!< connect path segments with a sharp join
kRound_Join, //!< connect path segments with a round join
kBevel_Join, //!< connect path segments with a flat bevel join
kJoinCount,
kDefault_Join = kMiter_Join
};
//下面是cap style, join style的函数
/** Return the paint's stroke cap type, controlling how the start and end
of stroked lines and paths are treated.
@return the line cap style for the paint, used whenever the paint's
style is Stroke or StrokeAndFill.
*/
Cap getStrokeCap() const { return (Cap)fCapType; }
/** Set the paint's stroke cap type.
@param cap set the paint's line cap style, used whenever the paint's
style is Stroke or StrokeAndFill.
*/
void setStrokeCap(Cap cap);
/** Return the paint's stroke join type.
@return the paint's line join style, used whenever the paint's style is
Stroke or StrokeAndFill.
*/
Join getStrokeJoin() const { return (Join)fJoinType; }
/** Set the paint's stroke join type.
@param join set the paint's line join style, used whenever the paint's
style is Stroke or StrokeAndFill.
*/
void setStrokeJoin(Join join);
/** Applies any/all effects (patheffect, stroking) to src, returning the
result in dst. The result is that drawing src with this paint will be
the same as drawing dst with a default paint (at least from the
geometric perspective).
@param src input path
@param dst output path (may be the same as src)
@return true if the path should be filled, or false if it should be
drawn with a hairline (width == 0)
*/
//使用当前paint的设置绘画src SkPath。结果有dst传出
bool getFillPath(const SkPath& src, SkPath* dst) const;
/** Returns true if the current paint settings allow for fast computation of
bounds (i.e. there is nothing complex like a patheffect that would make
the bounds computation expensive.
*/
//根据paint的设置判断是否可以快速计算绘画的边界。如果使用像patheffect类似的设置,则会话费较长的时间,也就不能快速计算。
bool canComputeFastBounds() const;
/** Only call this if canComputeFastBounds() returned true. This takes a
raw rectangle (the raw bounds of a shape), and adjusts it for stylistic
effects in the paint (e.g. stroking). If needed, it uses the storage
rect parameter. It returns the adjusted bounds that can then be used
for quickReject tests.
The returned rect will either be orig or storage, thus the caller
should not rely on storage being set to the result, but should always
use the retured value. It is legal for orig and storage to be the same
rect.
e.g.
if (paint.canComputeFastBounds()) {
SkRect r, storage;
path.computeBounds(&r, SkPath::kFast_BoundsType);
const SkRect& fastR = paint.computeFastBounds(r, &storage);
if (canvas->quickReject(fastR, ...)) {
// don't draw the path
}
}
*/
const SkRect& computeFastBounds(const SkRect& orig, SkRect* storage) const;
/** Get the paint's shader object.
The shader's reference count is not affected.
@return the paint's shader (or NULL)
*/
//paint的阴影效果
SkShader* getShader() const { return fShader; }
/** Set or clear the shader object.
Pass NULL to clear any previous shader.
As a convenience, the parameter passed is also returned.
If a previous shader exists, its reference count is decremented.
If shader is not NULL, its reference count is incremented.
@param shader May be NULL. The shader to be installed in the paint
@return shader
*/
//如果传入NULL,则清除以前的阴影效果
SkShader* setShader(SkShader* shader);
/** Get the paint's colorfilter. If there is a colorfilter, its reference
count is not changed.
@return the paint's colorfilter (or NULL)
*/
//颜色过滤器
SkColorFilter* getColorFilter() const { return fColorFilter; }
/** Set or clear the paint's colorfilter, returning the parameter.
If the paint already has a filter, its reference count is decremented.
If filter is not NULL, its reference count is incremented.
@param filter May be NULL. The filter to be installed in the paint
@return filter
*/
SkColorFilter* setColorFilter(SkColorFilter* filter);
/** Get the paint's xfermode object.
The xfermode's reference count is not affected.
@return the paint's xfermode (or NULL)
*/
//坐标转换模式
SkXfermode* getXfermode() const { return fXfermode; }
/** Set or clear the xfermode object.
Pass NULL to clear any previous xfermode.
As a convenience, the parameter passed is also returned.
If a previous xfermode exists, its reference count is decremented.
If xfermode is not NULL, its reference count is incremented.
@param xfermode May be NULL. The new xfermode to be installed in the
paint
@return xfermode
*/
SkXfermode* setXfermode(SkXfermode* xfermode);
/** Helper for setXfermode, passing the corresponding xfermode object
returned from the PorterDuff factory.
@param mode The porter-duff mode used to create an xfermode for the
paint.
@return the resulting xfermode object (or NULL if the mode is
SrcOver)
*/
//设置PorterDuff绘画模式
SkXfermode* setPorterDuffXfermode(SkPorterDuff::Mode mode);
/** Get the paint's patheffect object.
The patheffect reference count is not affected.
@return the paint's patheffect (or NULL)
*/
//可以作为paint的绘画效果来看待
SkPathEffect* getPathEffect() const { return fPathEffect; }
/** Set or clear the patheffect object.
Pass NULL to clear any previous patheffect.
As a convenience, the parameter passed is also returned.
If a previous patheffect exists, its reference count is decremented.
If patheffect is not NULL, its reference count is incremented.
@param effect May be NULL. The new patheffect to be installed in the
paint
@return effect
*/
SkPathEffect* setPathEffect(SkPathEffect* effect);
/** Get the paint's maskfilter object.
The maskfilter reference count is not affected.
@return the paint's maskfilter (or NULL)
*/
//主要用来控制paint的alpha通道
SkMaskFilter* getMaskFilter() const { return fMaskFilter; }
/** Set or clear the maskfilter object.
Pass NULL to clear any previous maskfilter.
As a convenience, the parameter passed is also returned.
If a previous maskfilter exists, its reference count is decremented.
If maskfilter is not NULL, its reference count is incremented.
@param maskfilter May be NULL. The new maskfilter to be installed in
the paint
@return maskfilter
*/
SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter);
// These attributes are for text/fonts
/** Get the paint's typeface object.
The typeface object identifies which font to use when drawing or
measuring text. The typeface reference count is not affected.
@return the paint's typeface (or NULL)
*/
//获得字体,可以设定字体大小,倾斜,缩放,粗体等等。
SkTypeface* getTypeface() const { return fTypeface; }
/** Set or clear the typeface object.
Pass NULL to clear any previous typeface.
As a convenience, the parameter passed is also returned.
If a previous typeface exists, its reference count is decremented.
If typeface is not NULL, its reference count is incremented.
@param typeface May be NULL. The new typeface to be installed in the
paint
@return typeface
*/
SkTypeface* setTypeface(SkTypeface* typeface);
/** Get the paint's rasterizer (or NULL).
The raster controls how paths/text are turned into alpha masks.
@return the paint's rasterizer (or NULL)
*/
//这个光栅不是我们通常意义上的光栅,这里只是为了获得alpha masks的一个效果类。
SkRasterizer* getRasterizer() const { return fRasterizer; }
/** Set or clear the rasterizer object.
Pass NULL to clear any previous rasterizer.
As a convenience, the parameter passed is also returned.
If a previous rasterizer exists in the paint, its reference count is
decremented. If rasterizer is not NULL, its reference count is
incremented.
@param rasterizer May be NULL. The new rasterizer to be installed in
the paint.
@return rasterizer
*/
SkRasterizer* setRasterizer(SkRasterizer* rasterizer);
//这里可以作为一种线环的显示效果
SkDrawLooper* getLooper() const { return fLooper; }
SkDrawLooper* setLooper(SkDrawLooper*);