Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64098
  • 博文数量: 29
  • 博客积分: 1250
  • 博客等级: 中尉
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-30 13:04
文章分类

全部博文(29)

文章存档

2009年(24)

2008年(5)

我的朋友

分类:

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.

    */

    //paintflag

    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_Stylelines使用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.

    */

    //画笔宽度。如果fWidth0 则会使用宽度为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)

    */

    //主要用来控制paintalpha通道

    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*);

 

阅读(1160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~