Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
编解码器注册:
SKIA的编解码部分通过一个模板类来实现,这样做的为了实现不同类型的codec兼容
external\skia\include\core\SkTRegistry.h
template <typename T> class SkTRegistry : SkNoncopyable {
public:
typedef T Factory;
//fFact即传进去来的fact类型,其实它是一个函数指针,后面创建codec会调用。
explicit SkTRegistry(T fact) : fFact(fact) {
#ifdef SK_BUILD_FOR_ANDROID
// work-around for double-initialization bug
{
//gHead是链表头
SkTRegistry* reg = gHead;
//循环比较每个元素
while (reg) {
//找到就返回
if (reg == this) {
return;
}
//比较下一个
reg = reg->fChain;
}
}
#endif
//没有找到则说明是没注册过
fChain = gHead;
//当前最新注册作为表头
gHead = this;
}
static const SkTRegistry* Head() { return gHead; }
const SkTRegistry* next() const { return fChain; }
const Factory& factory() const { return fFact; }
};
模板类被定义成如下type:
SkImageDecoder.h
typedef SkTRegistry<SkImageDecoder*(*)(SkStreamRewindable*)> SkImageDecoder_DecodeReg;
typedef SkTRegistry<SkImageDecoder::Format(*)(SkStreamRewindable*)> SkImageDecoder_FormatReg;
SkImageEncoder.h
typedef SkTRegistry<SkImageEncoder*(*)(SkImageEncoder::Type)> SkImageEncoder_EncodeReg;
调用例子,比如jpeg编解码模块的使用:
SkImageDecode