SkFlattenable /Registrar/



/** \class SkFlattenable
 
 SkFlattenable is the base class for objects that need to be flattened
 into a data stream for either transport or as part of the key to the
 font cache.
 */
class SK_API SkFlattenable : public SkRefCnt 
{}

 以SkFlattenable为基类的对象是:为了 传输数据 或者 作为字体缓冲 的关键部分 需要被填充到一个数据流中 的对象    ?

SkNoncopyable

       ∟ SkRefCnt

             ∟SkFlattenable

类 SkFlattenable 中定义了一个函数指针:

 typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&);

参数:SkFlattenableReadBuffer引用

返回值:SkFlattenable 指针

类内部定义Registrar成员类,Registrar类构造函数调用SkFlattenable的Register(const char name,Factory factory);

在SkFlattenable.cpp中有全局变量:

static int gCount;
static Pair gPairs[MAX_PAIR_COUNT];

 SkFlattenable的Register函数(此函数为静态成员)将参数加入到全局变量 gPairs中。

void SkFlattenable::Register(const char name[], Factory factory)
{
    SkASSERT(name);
    SkASSERT(factory);
    static bool gOnce;
    if (!gOnce) 
  {
        gCount = 0;
        gOnce = true;
   }
    SkASSERT(gCount < MAX_PAIR_COUNT);
    gPairs[gCount].fName = name;
    gPairs[gCount].fFactory = factory;
    gCount += 1;
}

 SkFlattenable提供了另两个静态成员函数 用于在 gPairs中根据name查找Factroy,或者根据Factroy查找name

    static Factory NameToFactory(const char name[]);
    static const char* FactoryToName(Factory);

 

依靠子类实现的函数有:

virtual Factory getFactory() = 0;
virtual void flatten(SkFlattenableWriteBuffer&);
virtual bool toDumpString(SkString*) const;  //本类中直接返回false
SkFlattenable(SkFlattenableReadBuffer&) {}

  

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

原文地址:https://www.cnblogs.com/ezhong/p/2267918.html