![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数码相框
qq_1213701132
这个作者很懒,什么都没留下…
展开
-
显示设备framebuffer
分配、设置、注册DispOpr结构体,由Display_manager.c通过链表管理。static T_DispOpr g_tFBOpr = { .name = "fb", .DeviceInit = FBDeviceInit, //"framebuffer显示设备"的初始化函数 .ShowPixel = FBShowPixel, //设置FrameBuffer的指定象素为某颜色 .CleanScreen = FBCleanScreen, //"framebuffer显示设原创 2020-08-18 15:17:21 · 203 阅读 · 0 评论 -
freetype 矢量字体
从点阵字库里把字母或汉字取出来在LCD上显示,缺点就是选定点阵文件后文字的大小就确定了,如8x16和16x16,不能缩放。矢量字体文件:若干闭合曲线的关键点glyph(相对位置不变);使用数学曲线(贝塞尔曲线)连接关键点;填充内部空间(闭合曲线)。参考freetype文件及官方文档有使用示例 freetype2.4.10 :http://wenku.baidu.com/view/2d24be10cc7931b765ce155b.html文字的显示过程:1.根据文字确定它的编码值(根据GBK,un原创 2020-08-13 20:29:57 · 1499 阅读 · 0 评论 -
ascii字体和GBK字体
ascii分配、设置、注册FontOpr结构体,由Font_manager.c通过链表管理。static T_FontOpr g_tASCIIFontOpr = { .name = "ascii", .FontInit = ASCIIFontInit, .GetFontBitmap = ASCIIGetFontBitmap,};ASCII字体模块的初始化函数,参数:文件,字体大小(只支持16x16点阵)。static int ASCIIFontInit(char原创 2020-08-13 20:27:30 · 794 阅读 · 0 评论 -
数码相框-font字体模块
font模块包含Fonts_manager.c,ascii.c,gbk.c,freetype.c,其中Fonts_manager.c通过链表管理这3中字体显示方式。每个字体文件向上注册FontOpr结构体,由Fonts_manager.c通过链表管理这些结构体。typedef struct FontOpr { char *name; /* 字体模块的名字 */ int (*FontInit)(char *pcFontFile, unsigned int dwFontSize); /* 字体模块的原创 2020-08-13 20:16:36 · 202 阅读 · 0 评论 -
数码相框-encoding编码模块
encoding模块包含encoding_manager.c,ascii.c,utf-8.c,utf-16be.c,utf-16le.c,其中page_manager.c通过链表管理这4中编码方式。主要包括ascii编码和unicode编码方式。每个编码方式向上注册EncodingOpr结构体,由encoding_manager.c通过链表管理这些结构体。typedef struct EncodingOpr { char *name; /* 编码模块的名字 */ int iHeadLen;原创 2020-08-13 16:45:38 · 226 阅读 · 0 评论 -
unicode编码
UTF-8分配、设置、注册EncodingOpr结构体,由Encoding_manager.c通过链表管理。static T_EncodingOpr g_tUtf8EncodingOpr = { .name = "utf-8", .iHeadLen = 3, /*文件头的长度: 一般在文件的开始用几个字节来表示它的编码方式*/ .isSupport = isUtf8Coding, /* 用这个函数来判断是否支持某个文件 */ .GetCodeFrmBuf = U原创 2020-08-13 16:23:07 · 249 阅读 · 0 评论 -
ascii编码
ANSI编码:对于字母存储的是ASCII码,对于汉字存储的是GBK码。分配、设置、注册EncodingOpr结构体,由Encoding_manager.c通过链表管理。static T_EncodingOpr g_tAsciiEncodingOpr = { .name = "ascii", .iHeadLen = 0,/* 文件头的长度: 一般在文件的开始用几个字节来表示它的编码方式 */ .isSupport = isAsciiCoding, /* 用这个函数原创 2020-08-13 16:22:35 · 258 阅读 · 0 评论 -
freetype字体
分配、设置、注册T_FontOpr结构体,由Font_manager.c通过链表管理。static T_FontOpr g_tFreeTypeFontOpr = { .name = "freetype", .FontInit = FreeTypeFontInit, //FreeType字体模块的初始化函数 .GetFontBitmap = FreeTypeGetFontBitmap, //获得UNICODE字符的FreeType位图 .SetFontSize = F原创 2020-08-13 14:54:34 · 397 阅读 · 0 评论 -
字符编码及字体显示
字符编码计算机的所有信息都以二进制表示(二进制数字)如:程序中puts(“Hello 你好”)输出字符串信息,字符串在计算机里面保存为二进制数值48 65 6C 6C 57 C4E3 BAC3,计算机中传输的只是数字,显示为Hello 你好。字符显示: 数字 -> 代表什么 ->显示为“什么” 字符编码 字体文件字符编码:用什么数字表示哪个字符ASCII码-1个字节GBK码-2个字节 ->编码方式不同,导致相同数字代表不同的字符->unicod原创 2020-08-09 22:22:23 · 748 阅读 · 0 评论 -
数码相框-框架
main函数/* digitpic <freetype_file> */int main(int argc, char **argv){ int iError; /* 初始化调试模块: 可以通过"标准输出"也可以通过"网络"打印调试信息 * 因为下面马上就要用到DBG_PRINTF函数, 所以先初始化调试模块*/ DebugInit(); /* 注册调试通道 */ InitDebugChanel(); /* 初始化调试通道 */ if (argc != 2){ ..原创 2020-08-04 22:26:58 · 297 阅读 · 0 评论 -
数码相框-页面模块
page模块包含page_manager.c,main_page.c(主页面),manual_page.c(手控页面),auto_page.c(自动播放页面),setting_page.c(设置页面),browse_page.c(浏览页面),interval_page.c(时间间隔设置页面),page_manager.c通过链表管理这6个页面。每个页面向上注册PageAction结构体,由page_manager.c通过链表管理这些结构体,PageLayout结构体位页面布局的位置数组。typedef原创 2020-08-04 19:09:04 · 158 阅读 · 0 评论 -
数码相框-渲染模块
render模块包含三个部分:format,operation和render.c,其中format为图片文件解析模块,operation为操作模块,render.c为渲染函数。 format目录 operation目录 render.cpicfmt_manager.c Zoom.c Merge.c | |Bmp.c Jpg.cformat其中图片文件解析模块中,picfmt_manager管理底层支持的两种图片格式bmp和jpg,它们分别向上注册PicFilePa原创 2020-08-04 17:11:35 · 220 阅读 · 0 评论 -
数码相框-输入模块
input模块包含三个文件,input_manager.c,touchscreen.c和stdin.c,其中touchscreen.ch和stdin.c为支持的输入方式,input_manager.c通过链表管理可支持的设备。 input_manager.c | |touchscreen.c stdin.c底层的touchscreen.c和stdin.c,向上注册InputOpr结构体,提供该设备的操作函数。typedef struct InputOpr { char *n原创 2020-08-04 15:45:42 · 154 阅读 · 0 评论 -
数码相框-display模块
display模块包含两个文件,display_manager.c和fb.c,其中fb.c为支持的显示设备,display_manager.c通过链表管理可支持的设备。display_manager.c | fb.c底层如fb.c,向上注册DispOpr结构体,提供该设备的操作函数。typedef struct DispOpr { char *name; /* 显示模块的名字 */ int iXres; /* X分辨率 */ int iYres;原创 2020-08-04 15:08:36 · 525 阅读 · 0 评论 -
页面规划
要在lcd上显示图标,要事先规划出各图片的坐标。typedef struct PageLayout { int iTopLeftX; /* 这个区域的左上角、右下角坐标 */ int iTopLeftY; int iBotRightX; int iBotRightY; int iBpp; /* 一个象素用多少位来表示 */ int iMaxTotalBytes; //最大图标总字节数 PT_Layout atLayout; /* 数组: 这个原创 2020-08-03 22:11:55 · 193 阅读 · 0 评论 -
数码相框-文件模块
typedef struct FileMap { char strFileName[256]; /* 文件名 */ // int iFd; FILE * tFp; /* 文件句柄 */ int iFileSize; /* 文件大小 */ unsigned char *pucFileMapMem; /* 使用mmap函数映射文件得到的内存 */}T_FileMap, *PT_FileMap;使用mmap函数映射一个文件到内存,原创 2020-08-03 21:50:45 · 121 阅读 · 0 评论 -
显存管理
Disp_manager.c为了显示更流畅,事先malloc分配多块缓存,设置好页面内容,然后再把缓存内容全部memcpy复制进framebuffer显存里。每块缓存用VideoMem结构体来描述。typedef struct VideoMem { int iID; // ID值,用于标识不同的页面 int bDevFrameBuffer; //判断:1:这个VideoMem是显示设备的显存; 0:只是一个普通缓存 E_VideoMemState eVideoMemState; // 这个原创 2020-08-03 16:36:01 · 335 阅读 · 0 评论 -
libjpeg的使用及jpg图片的提取
显存framebuffer中存放的是像素的RGB数据,jpg格式的图片是压缩的,用libjpeg把jpg图片解压出RGB原始数据。libjpeg是使用C语言实现的读、写JPEG文件的库,使用libjpeg的应用程序是以”scanline”为单位进行图像处理的。转换速度和质量可以平衡。libjpeg处理的图片一般是矩形,矩形里是一行行数据,一行数据为”scanline”。每行数据是一个个像素,像素的值由component组成,RGB有三个component,灰度值有一个component。图片信息相当于一个原创 2020-08-03 15:34:05 · 2347 阅读 · 0 评论 -
图片缩放 转换bpp 图片合并
图片缩放缩放原理:原图和缩放图内点的位置,在图片中的相对位置不变。缩放图中每个点的都可以根据图中公式计算出在原图中的位置,然后把原图颜色赋给缩放图。可以用两个for循环复制数据。函数原型:int PicZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic)8.3.2中自定义的图片描述结构体PixelDatas,用缩放后的数据更改该结构体内容。优化:1.每行的Sy坐标不变,所以在第一个for循环里计算y坐标。2.Sx每行都要重新计算,原创 2020-08-03 11:31:50 · 475 阅读 · 0 评论 -
bmp图片提取
位图(bitmap)最简单,其文件扩展名为*.BMP。bmp文件存储的是RGB颜色,可以直接把RGB数据放在LCD上显示。在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图时候才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的(Flash中使用了适量图,是按相同颜色区域存储的)。位图文件(*.BMP)的格式位图文件主要分为如下3个部分:块名称对应Windows结构体定义大小(Byte)文件信息头BITMAPFILEHEADER1原创 2020-08-03 11:21:21 · 803 阅读 · 1 评论 -
多线程支持多输入
参考 Unix_Linux_Windows_OpenMP多线程编程.pdf P18 3.3.2 条件变量前面两种方式都是单线程实现的,第一种轮询方式while死循环,不断调用GetInputEvent函数,CPU占用率高。第二种也会调用GetInputEvent函数,执行到select会休眠,由内核唤醒,不断循环。第三种多线程,主线程休眠,子线程也在休眠,一旦有数据就唤醒子线程,子线程得到数据再来唤醒主线程。main函数iError = AllInputDevicesInit(); //调用所有输原创 2020-08-01 16:29:16 · 348 阅读 · 1 评论 -
数码相框的电源管理2
编写支持开关机(suspend)的应用程序开关机只是休眠唤醒,2440开发板没有电源管理芯片,硬件上也没实现软件开关机。Linux内核提供了三种Suspend: Freeze、Standby和STR(Suspend to RAM),在用户空间向”/sys/power/state”文件分别写入”freeze”、”standby”和”mem”,即可触发它们。思路读按键, 得到某个值就执行 echo mem > /sys/power/state 系统进入休眠状态唤醒按某个按键就可以,不需要应用程序原创 2020-07-31 15:55:52 · 131 阅读 · 0 评论 -
数码相框的电源管理1
2 编写支持开关机(suspend)的应用程序开关机只是休眠唤醒,2440开发板没有电源管理芯片,硬件上也没实现软件开关机。思路读按键, 得到某个值就执行 echo mem > /sys/power/state 系统进入休眠状态唤醒按某个按键就可以,不需要应用程序支持。以前做的输入子系统的按键驱动程序,使2440具备唤醒功能,在它的基础上写开关机应用程序。若以S2为开关机键,读到键值KEY_L,看它上报的事件input_event结构体。在驱动程序中上报事件:input_event(b原创 2020-07-25 22:05:10 · 404 阅读 · 0 评论