zoukankan      html  css  js  c++  java
  • SkGradientShader与Gradient_Shader类的关系

    通过查看源代码可以得出,几种类型的GradientShader类的继承关系是:

    SkRefCnt类增加了引用计数的相关操作。它的子类都可以被多次引用,当引用计数为零的时候,自动释放。

    Gradient_Shader定义了一些GradientShader效果的公共操作和接口虚函数。

    四种类型的GradientShader具体类(Linear_Gradient/Radial_Gradient/Sweep_Gradient/Two_Point_Radial_Gradient)都继承于Gradient_Shader。

    ---------------------------------------------------

    SkGradientShader是一个独立的类,只是封装了四个静态函数,分别调用Linear_Gradient/Radial_Gradient/Sweep_Gradient/Two_Point_Radial_Gradient的构造函数,从而创建具体的GrdientShader对象。相当于为所有的GradientShader创建函数提供了小的命名空间。通过这个命名空间方便的去调用创建函数。

    class SK_API SkGradientShader 
    {
    public:
       
        static SkShader* CreateLinear(  const SkPoint pts[2],
                                        const SkColor colors[], const SkScalar pos[], int count,
                                        SkShader::TileMode mode,
                                        SkUnitMapper* mapper = NULL);
    
        static SkShader* CreateRadial(  const SkPoint& center, SkScalar radius,
                                        const SkColor colors[], const SkScalar pos[], int count,
                                        SkShader::TileMode mode,
                                        SkUnitMapper* mapper = NULL);
    
        static SkShader* CreateTwoPointRadial(const SkPoint& start,
                                              SkScalar startRadius,
                                              const SkPoint& end,
                                              SkScalar endRadius,
                                              const SkColor colors[],
                                              const SkScalar pos[], int count,
                                              SkShader::TileMode mode,
                                              SkUnitMapper* mapper = NULL);
      
        static SkShader* CreateSweep(SkScalar cx, SkScalar cy,
                                     const SkColor colors[], const SkScalar pos[],
                                     int count, SkUnitMapper* mapper = NULL);
    };
    

      以Linear_Gradient为例:

    SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2],
                                             const SkColor colors[],
                                             const SkScalar pos[], int colorCount,
                                             SkShader::TileMode mode,
                                             SkUnitMapper* mapper)
    {
        if (NULL == pts || NULL == colors || colorCount < 1) 
       {
            return NULL;
        }
        EXPAND_1_COLOR(colorCount);
    
        return SkNEW_ARGS(Linear_Gradient,
                          (pts, colors, pos, colorCount, mode, mapper));
    }
    

      宏SkNEW_ARGS:

     #define SkNEW_ARGS(type_name, args)     new type_name args
    

      相当于SkGradientShader::CreateLinear函数返回:

    return new Linear_Gradient(pts, colors, pos, colorCount, mode, mapper)
    

     从而调用:

        Linear_Gradient(const SkPoint pts[2],
                        const SkColor colors[], const SkScalar pos[], int colorCount,
                        SkShader::TileMode mode, SkUnitMapper* mapper)
            : Gradient_Shader(colors, pos, colorCount, mode, mapper),
              fStart(pts[0]),
              fEnd(pts[1])
        {
            pts_to_unit_matrix(pts, &fPtsToUnit);
        }
    

      

    ezhong的博客园:http://www.cnblogs.com/ezhong/

  • 相关阅读:
    Ext.Net学习笔记02:Ext.Net用法概览
    Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
    【转】好的用户界面-界面设计的一些技巧
    发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
    抢票季:吐槽12306 & 分享抢票经验
    2.5星|《解谜茑屋》:疑似企业公关稿,对话体,信息含量较低
    樊登推荐过的书15本,好书2本半
    一些黑猩猩会使用草药治病,疗效还不错:3.5星|邓巴《人类的算法》
    莫奈塞尚的知名度,主要归功于富豪画家卡耶博特的遗赠:4星|《引爆流行》
    4星|《猎药师》:五千年以来药物研发简史,作者是前一线科学家
  • 原文地址:https://www.cnblogs.com/ezhong/p/2267016.html
Copyright © 2011-2022 走看看