Encoding Types
注:本文的中文翻译源自本人,不一定准确,但是是一种比较形象的表示
1.RRE: rise-and-run-length-encoding
2度游程编码。
1.1.取得背景色,并填充至整个区域。背景色是整个区域中出现频率最高的颜色,猜测是通过多点取样得到的。
1.2.取得子矩形,并用每个子矩形的颜色填充子矩形。每个子矩形中只有一种颜色,但是颜色可以向前继承。
2.Hextile
16瓦编码,是一种变异的RRE编码方式。
每个矩形都被分成16×16的瓦片(tile),瓦片排列方式是从左到右,从上到下,每个瓦片都被称为一个子矩形,每个子矩形只要四个字节(一般)即可描述。用到了两次位级编码,如subencoding信息只有一个字节,但是内部的后5位(或者低5位)从低到高分别表示raw、backgroundSpecified、foregroundSpecified、AnySubrects、SubrectsColored;每个subrects中的位置信息也是用位级表示的,高四位表示x-y,低四位表示w-h。这种表示方法跟RRE不同,因为前者的x-y-w-h值可能较大,分别需要用两个字节表示(>256)。如果一个矩形的长宽不能被16整除,那么最后的一个子矩形会小一些。为了方便理解,将要处理的数据从上到下分为大矩形、小矩形和子矩形三个层级。
2.1.将大矩形划分为16×16的子矩形,每个小矩形的长宽都为16×16。
2.2.小矩形为raw,那么直接将client->buffer中的数据copy至client->frameBuffer。
2.3.小矩形不为raw
2.3.1.提取background颜色并填充整个小矩形
2.3.2.提取foreground颜色
2.3.3.如果有子矩形,那么分成两类进行填充:子矩形没有特殊颜色,直接填充foreground颜色;子矩形有特殊颜色,将特殊颜色填充子矩形。
3.TRLE: Tiled Run-Length Encoding
分片调色游程编码
该编码方式结合了分片编码,游程编码和调色编码,是一种更compact的编码方式。使用了新的像素类型:CPIXEL,bPP为32,深度为24或更小。一般只需要三个字节来存储rgb。首先将矩形进行分片,每个小矩形大小为16×16,每个分片都由subencoding type开始,根据type不同,进行不同的编码。
3.1.Type = 0
类型为raw pixel data,直接复制至client->frameBuffer即可。
3.2.Type = 1
类型为solid tile,整个分片都是单色的,将该颜色填充至client->frameBuffer。
3.3.Type = 2~16
类型为packed palette,即压缩调色盘类型。这种类型比较复杂,需要根据调色盘来填充颜色,数据结构如下。比如当type=5时,调色盘大小(paletteSize)就为5,那么首先从server端读取5个大小为BPCP(CPIXEL的大小)的color。那么此时每个像素会被压缩在4位之内,也就是一个字节包含两个像素,需要读取的字节数位w×h/4。读取完像素之后,根据调色盘内的数据对像素进行上色并复制到client->frameBuffer。该过程有点类似于解压缩。
3.4.Type = 17~126
颜色数太多,压缩效率不如调色游程编码(palette RLE),所以这一段type不使用。
3.5.Type = 127
对packed palette进行复用
3.6.Type = 128
普通的游程编码(plain RLE),但是长度控制在256之内(16×16),数据结构如下图所示。BPCP和1分别表示数据的字节数。
3.7.Type= 129
调色游程编码(palette RLE),对tpye=130~255进行复用。
3.8.Type = 130~255
调色游程编码(palette RLE),调色盘大小为(type-128),跟普通的游程编码相比节约了颜色的存储空间,由3字节变为了1字节,而且使用了调色盘,每种颜色可以直接从调色盘中读取,实际只需要记录调色盘序号就可以。数据结构如下图所示。
4.ZRLE: Zlib Run-Length Encoding
Z库压缩游程编码
其他方面与TRLE基本相同,区别有三:
- 分片变大,为64×64
- 片内数据压缩方式为Zlib Data
- 将type = 127和129都弃用,即不存在复用(也许是因为分片太大,无法复用)
关于zlib的压缩方式,有两种,分别是LZ77算法和Huffman编码,前者使用的是滑动窗口字典编码,后者采用的是频率排序二叉树构建编码。具体的实现可以参考这两个链接:
(lz77) https://www.cnblogs.com/junyuhuang/p/4138376.html;
(Huffman) https://blog.csdn.net/yang6464158/article/details/39852255