Bootstrap

笔记整理—linux驱动开发部分(14)图片解码播放器

        先从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;
            }

;