MTK的52D芯片有32Mb RAM和 16Mb ROM,ROM非常紧张,所以采用了压缩方式。但开机logo是放在不压缩部分的,而且原始方案里只能用bmp图片做logo,图片不管怎么处理最后都要处理成16位点阵数据,所以对图片压缩没有意义。由于rom限制,log大小不能太大,为了放更大的log,我决定不用资源生成的数组,而是用自己压缩的数组,解开后显示到屏幕上。
彩色图片压缩不容易,算法也复杂,我用的黑白图片。这对显示开机logo一般也足够了。
先用python处理图片,生成压缩的数组,采用类似RLE的压缩算法。
压缩后格式是:以0xff为一行开头,第二个数据是开头的颜色,后面数据依次是黑白连续数据的长度。
import Image #PIL
import os
fn = 'logo2.bmp'
img = Image.open(fn)
x,y = img.size
dataCount = 0
def outPutData(data):
global dataCount
print '%#04x,'%(data),
dataCount +=1
if(dataCount == 10):
dataCount = 0
print '\n'
dataCount = 0
for yi in range(y):
outPutData(0xff),
headColor = img.getpixel((0,yi))
# print headColor
outPutData(headColor),
preColor = headColor
count = 0
for xi in range(x):
color = img.getpixel((xi,yi))
if preColor == color:
count += 1
else:
outPutData(count),
count = 1
preColor = color
用下面的状态机就可以把数据解压开,并显示到屏幕上去。
x_offset = (w_dev-w+1)/2;
y_offset = (h_dev-h+1)/2;
y = y_offset;
x = x_offset;
state = 0;
for(i = 0; i<dataLen;++i)
{
data = dataComprass[i];
switch(state)
{
case 0:
switch(data)
{
case 0xff:
state = 1;
break;
default:
ASSERT(0);
}
break;
case 1:
color = (data)?0xfffe:0;
state = 2;
break;
case 2:
switch(data)
{
case 0xff:
state = 1;
y += 1;
x = x_offset;
break;
default:
num = data;
for(j = 0;j<num;++j)
{
(*((kal_uint16*)gdi_layer_buffer_pool+(y*(w_dev)+x))) = color;
++x;
}
color = (color)?0:0xfffe;
break;
}
break;
default:
break;
}
}