先从MAKEFILE进行分析(顶层MAKEFILE)。export是导出参数给子Makefiel使用的。
CFLAGS(编译器参数) :=-Wall(警告全显示) -o2(优化等级) -g(加入调试信息) -DDEBUG
:=-I(编译加入头文件) $(shell pwd)(当前文件夹)/include -Ixxxx
LDFLAGS(链接器参数设置) :=
TOPDIR(顶层目录):=
TARGET(编译器程序名):=
obj -y +=添加项目中所有使用到的源文件
main.o 顶层目录下的main.c
//添加顶层目录下的子目录
+=display/
+=image_manage/
all:
make -c ./ -f (TOPDIR进入顶层目录)/MAKEFILE.build
&(cc gcc名) $(LDFLAGS链接属性) -o $(TARGET名字) build-in.o是Makefile.buile相关的编译出的.o结果
Makefile.buile编译规则文件,几乎不会进行改变。子目录下Makefile文件是obj+=去添加子文件与子目录。
图片显示的原理:①像素——一个图像的组成元素;②点阵——一个显示器;③分辨率——物理分辨率是设备真实的分辨率(不可变),实际分辨率是软件设备分辨率,其小于等于物理分辨率,由抽去的像素的实现分辨率缩放;④清晰度——一个主观概念(与分辨率与像素间距相关)。
bpp:像素深度,每个像素由多少bit表示(888表示真彩色(int8位色深度,占位内存对齐。24位色),565(16位色))。
颜色序(RGB、BGR)与驱动相关。图片点阵数据获取用数组存放(1024*600*24/8)大小数组表示:①Image2LCD软件提取数据;②通过图片/视频文件直接提取。
影响图片显示的因素:①fb驱动的排布;②应用程序中的排布;③图像数据的排布。
for(i=0;i<HIGHT;i++)
for(j=0;j<WIDTH;j++)
{
//cnt=width*i+j
cnt=WIDTH*i+j;//确认像素点
cnt*3;//确认像素数组位置
//*(pfb+cnt)
*p=(pData[cnt+2]<<2)|(pData[cnt+2]<<8)|(pData[cnt+0]<<16);按照BGR填充各色彩
p++;//pfb(fb首地址)
}
任意分辨率的大小图片显示:①图片大于屏幕,有部分无法显示——剪切;②图片小于屏幕——只填充一部分,空白地区用底色填充。
for(y=0;y<图片宽度;y++)
for(x=0;x<图片长度;x++)
{
cnt1=WIDTH*y+x;//真实屏幕像素位置
cnt2=图片长*y+x;//图片数组位置
*(pfb+cnt1)=(pData[3*cnt2+2]<<0)|(pData[3*cnt2+1]<<8)|(pData[3*cnt2+0]<<16);
pfb++;
}
任意起点图片显示:①小图片在任意起点;②起点移动,图片超出屏幕外。
for(y=y0;y<y0+图高;y++)
for(x=x0;x<x0+图宽;x++)//x0和y0为显示起点
{
cnt1=WIDTH*y+x;//屏幕像素位置
cnt2=图片长*y+x;//普票数组位置
*(pfb+cnt1)=(pData[3*cnt2+2]<<0)|(pData[3*cnt2+1]<<8)|(pData[3*cnt2+0]<<16);
pfb++;
}
图片显示在中间:x0=(屏宽-图宽)/2;y0=(屏高-图高)/2.
for(y=0;y<y0+图片高度;y++)
for(x=0;x<x0+图片宽度;x++)
{
cnt=WIDTH*y+x;
*(pfb+cnt1)=(pData[3*cnt2+2]<<0)|(pData[3*cnt2+1]<<8)|(pData[3*cnt2+0]<<16);
a+=3;//数组位置
}
//结果与上相同
正常的一个显示函数(上面的方法)当超出显示范围时,会产生折叠重合(左右超出部分折叠重合,上下超出部分会自动忽略)。原因就是cnt=WIDTH*y+x。x方向的超线会折叠,但y防线上大于屏高会超出fb大小。
若无双缓冲区,在*(pfb+cnt)超出屏幕上下就会段err。segmentation fault
解决的把稳方法:
for()
{
if(y>=HEIGHT)
{
break;
}
for()
{
if(x>=WIDTH)
{
a+=3;
continue;
}
}
}
对于cnt2的方法:
for()
for()
if(x>WIDTH)
{
continue;
}