
在Qt4.7.4中,QDataStream对一個QColor进行序列化时,會输出6個东西:spec、alpha、red、green、blue、pad。本座今天读到文档中的这一段时,很不理解pad是個什么东西。在问过境外论坛的人,并且读过QColor的代码之后,终于知道咯,pad在代码里只是用来占用内存位置的,当妳使用RGB模式来表示颜色时,pad无意义。
QColor同时支持RGB、HSV、CMYK、HSL四种颜色规范,以这四种规范来表示颜色所需要的数据大小是不同的。而无论是采用哪种规范,在QColor内部都是把数据存储在一個联合体里的。QColor内部对颜色数据的定义是union ct,具体是这样的:
union {
struct {
ushort alpha;
ushort red;
ushort green;
ushort blue;
ushort pad ;
} argb ;
struct {
ushort alpha;
ushort hue;
ushort saturation;
ushort value;
ushort pad ;
} ahsv ;
struct {
ushort alpha;
ushort cyan;
ushort magenta;
ushort yellow;
ushort black;
} acmyk ;
struct {
ushort alpha;
ushort hue;
ushort saturation;
ushort lightness;
ushort pad ;
} ahsl ;
ushort array [ 5 ];
} ct ;
可以看到,CMYK模式实际上要多占用一個ushort的长度。由于这几個对应于不同规范的结构体是共存于一個联合体里的,为咯让它们长度相等,就把另外三個结构体的末尾都填充上一個ushort,这块填充内存就叫做pad。
从这個代码也可以看到,QDataStream在序列化的时候既输出alpha、red、green、blue,也输出pad是必要的。因为在这個时候输出的其实是整个结构体,是不能把它们分开当作“透明”“红”“绿”“蓝”“填充”来看的。这個结构体究竟解释成什么,取决于前面输出的spec。
HxLauncher: Launch Android applications by voice commands