传奇源码对于素材处理


这个代码,要说好呢,还是有很多的可以学习的地方的,不过很多地方也是实现得比较粗糙。

要对真彩色支持,首先要了解到:

1、它是16位增强色的,是没有调色板的。具体原理后述。

2、它的素材也是针对增强色设计的,字节可直接用于增强色模式,不可直接用于真彩色模式。

认识到了这两点,基本知道该怎么做了。

先说说增强色模式,现在一般的传奇3私服,会提供一个登录器,登录器除了IP代理之外,还有一个作用就是在运行程序时,把电脑设置成增强色模式,不然按现代的机器,真彩色模式运行,把增强色的数据直接当成rgb颜色渲染,会花屏。

增强色用2个字节(WORD)表示一个颜色,r分量占5位,g分量占6位,b分量占5位,共计16位。

因此每个分量有一个位掩码和一个位移码,对这个WORD数据作用掩码和位移,就可以取出对应的分量的颜色值。当电脑在增强色模式下时,这个操作是自动进行的。

取出rgb分量,还是不能将其用于表示rgb,原因是精度不一样导致的数据单位不一样。

真彩色中,一个分量是一个字节,即8位,而增强色中,一个分量是5或者6位。因此,需要做一个缩放。

例如,红色,在真彩色中,r分量是0xff,而在增强色中,r是二进制11111。

因此,r和b分量需要乘以8,g分量需要乘以4。然后,就可以组合成rgb真彩色了。

因为程序的素材本身就不是真彩色的,因此,我们只需要对surface的操作进行真彩色的支持即可。

首先dx设备要设置成32位深度的,然后,对surface的取色彩操作,要认为是直接在取真彩色的数据,并且在取出计算分量时,相应的要除以8,或4,缩放到增强色的空间。对surface的写入色彩操作,要认为是在写真彩色数据,所以要先把WORD的增强色变换到DWORD的真彩色rgb,然后在写入。另外,因为色彩深度不一样,对surface的pitch处理时要考虑到,因为它是以字节为单位的。