首页 > 其他分享 >freetype 显示一行字符

freetype 显示一行字符

时间:2024-01-11 11:06:06浏览次数:23  
标签:字符 freetype FT int unsigned 一行 fb pen var

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <math.h>
#include <wchar.h>

#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H


unsigned char *fb_mem = NULL;
unsigned char *fb_hzk = NULL;
int sreen_size = 0;
struct fb_var_screeninfo fb_var;
struct fb_fix_screeninfo fb_fix;
int fd_fb = 0;
int fd_HZK = 0;
unsigned int line_width;
unsigned int pixel_width;


FT_Vector pen;
FT_Face face;

typedef struct TGlyph_ {
	FT_UInt index;
	FT_Vector pos;
	FT_Glyph image;
} TGlyph, *PGlyph;

void lcd_draw_point(int x, int y, int color)   //0x00RRGGBB
{
	unsigned char *pen_8 = fb_mem + y*line_width + x*pixel_width;
	unsigned short *pen_16;
	unsigned int *pen_32;

	unsigned int red;
	unsigned int green;
	unsigned int blue;

	pen_16 = (unsigned short *)pen_8;
	pen_32 = (unsigned int *)pen_8;

	switch(fb_var.bits_per_pixel){
		case 8: {
			*pen_8 = color;
			break;
		}
		case 16:  {// 565
			red = (color >> 16) & 0xff;
			green = (color >> 8) & 0xff;
			blue = (color >> 0) & 0xff;
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;
			break;
		}
		case 32: {
			*pen_32 = color;
			break;
		}
		default: {
			printf("can't support %dbpp\n", fb_var.bits_per_pixel);
			break;
		}
	}
}

// void lcd_draw_ascii(int x, int y, unsigned char c)  //8*16
// {
// 	unsigned char *dot = (unsigned char *)&fontdata_8x16[c*16];
// 	unsigned char byte;
// 	int i,b;
	
// 	for(i=0; i<16; i++) {
// 		byte = dot[i];
// 		for(b=7; b>0; b--){
// 			if(byte & (1<<b)) {
// 				lcd_draw_point(x+7-b, y+i, 0xffffffff);     //显示白色
// 			}else {
// 				lcd_draw_point(x+7-b, y+i, 0);              //显示黑色
// 			}
// 		}
// 	}
// }

void lcd_draw_chinese(int x, int y, unsigned char *str)  // 16*16
{
	unsigned int area  = str[0] - 0xA1;
	unsigned int where = str[1] - 0xA1;
	unsigned char *dot = fb_hzk + (area * 94 + where) * 32;
	unsigned char byte;
	int i,j,b;

	for(i = 0; i < 16; i++) {
		for(j = 0; j < 2; j++) {
			byte = dot[i*2+j];
			for(b = 7; b > 0; b--) {
				if(byte & (1<<b)) {
					lcd_draw_point(x+j*8+7-b, y+i, 0xffffffff);     //显示白色
				}else {
					lcd_draw_point(x+j*8+7-b, y+i, 0);              //显示黑色
				}
			}
		}
	}

}

void draw_bit_map(FT_Bitmap*  bitmap, FT_Int x, FT_Int y)
{
	FT_Int  i, j, p, q;
	FT_Int  x_max = x + bitmap->width;
	FT_Int  y_max = y + bitmap->rows;


	for ( i = x, p = 0; i < x_max; i++, p++ )
	{
		for ( j = y, q = 0; j < y_max; j++, q++ )
		{
			if ( i < 0      || j < 0       ||
				i >= fb_var.xres || j >= fb_var.yres )
			continue;

			//image[j][i] |= bitmap->buffer[q * bitmap->width + p];
			lcd_draw_point(i, j, bitmap->buffer[q * bitmap->width + p]);
		}
	}
}

void lcd_draw_oneline_left(wchar_t *str, FT_Int x, FT_Int y, int fontsize)
{
	int i;

	pen.x = x * 64;
	pen.y = (fb_var.yres - y) * 64;

	for(i = 0; i < wcslen(str); i++){
		FT_Set_Transform(face, NULL, &pen);

		FT_Load_Char(face, str[i], FT_LOAD_RENDER);
 
		draw_bit_map(  &face->glyph->bitmap,
					face->glyph->bitmap_left,
					fb_var.yres - face->glyph->bitmap_top);

		pen.x += face->glyph->advance.x;
		//pen.y = (fb_var.yres - 80) * 64;
	}
}

void lcd_draw_oneline_center(wchar_t *str, FT_Int y, int fontsize)  //仅需要知道高度即可
{
	int i;
	TGlyph glyph;

	//计算输入的字符串的bbox的大小
	for(i = 0; i < wcslen(str); i++) {
		glyph->
	}


}

int main(int argc, char **argv)
{

	wchar_t *chinese_str = L"繁ABCDEFG";
	FT_Library library;
	
	
	int i;

	fd_fb = open("/dev/fb0", O_RDWR);
	if(fd_fb < 0)
	{
		printf("can't open fb0\n");
		return -1;
	}

	if(argc != 2) {
		printf("Usage : %s <font file>\n", argv[0]);
	}

	//获取屏幕信息
	if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &fb_var))
	{
		printf("can't get fb_var\n");
		return -1;
	}

	//获取固定信息
	if(ioctl(fd_fb, FBIOGET_FSCREENINFO, &fb_fix))
	{
		printf("can't get fb_fix\n");
		return -1;
	}

	line_width  = fb_var.xres * fb_var.bits_per_pixel / 8;
	pixel_width = fb_var.bits_per_pixel / 8;
	sreen_size 	= fb_var.xres * fb_var.yres * fb_var.bits_per_pixel / 8;

	fb_mem = (unsigned char *)mmap(NULL, sreen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if(fb_mem == MAP_FAILED)
	{
		printf("can't mmap\n");
		return -1;
	}

	//清屏
	memset(fb_mem, 0, sreen_size);

	
	//初始化freeType库
	if(FT_Init_FreeType(&library))
	{
		printf("can't init freetype library\n");
		return -1;
	}

	//创建face对象
	if(FT_New_Face(library, argv[1], 0, &face))
	{
		printf("can't create face object\n");
		return -1;
	}

	//设置字体大小
	if(FT_Set_Pixel_Sizes(face, 24, 0))
	{
		printf("can't set font size\n");
		return -1;
	}

	//设置char初始点   (80,80)
	
	
	lcd_draw_oneline_left(chinese_str, 0, 80, 24);
	 

	//lcd_draw_ascii(fb_var.xres/2, fb_var.yres/2, 'A');

	//printf("chinese code = %02x %02x \n", str[0], str[1]);
	//lcd_draw_chinese(fb_var.xres/2+8, fb_var.yres/2, str);

	return 0;	
}

  


标签:字符,freetype,FT,int,unsigned,一行,fb,pen,var
From: https://blog.51cto.com/u_16492438/9193962

相关文章

  • js 字符串处理函数
    length、charAt()、charCodeAt()和fromCharCode()返回的结果都跟预期是一样的。这是因为在这个范围内,每个字符都是用16位表示的,而这几个方法也都基于16位码元完成操作。只要字符编码大小与码元大小一一对应,这些方法就能如期工作。这个对应关系在扩展到Unicode增补字符平面......
  • python第三节:Str字符串类型(2)
    str.format(*args, **kwargs)执行字符串格式化操作。语法:点号前面是一个带槽(由大括号表示)的字符串,字符串里面可以设置各种参数和格式控制标记,后面是format和替换的字符串。{参数序号:格式控制标记}如下六个按照顺序使用。:填空对齐宽度逗号精度类型冒号用于填充的单个字符<左对齐>......
  • Flex布局解决最后一行左对齐
    使用flex布局,将多个元素以三个为一行,往下排列。.logo-field{width:650px;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;.__logo-item{width:200px;height:150px;margin-top:15px......
  • docker安装oracle并修改服务名修改字符集
    拉取镜像dockerpullregistry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 创建容器dockerrun-d-p1521:1521--nameoracle11gregistry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g  查看容易dockerps-a 进入容器dockerexec-itoracle11gbash 切......
  • JOSN字符串字段遍历(json-path)
    官网https://github.com/json-path/JsonPath依赖<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.5.0</version></dependency>......
  • 【教3妹学编程-算法题】找出出现至少三次的最长特殊子字符串 I
    3妹:2哥2哥,我掐指一算,今天是你的发薪日吧,要不要请我吃个饭哈?2哥:切,这还用算,每个月都是10号嘛。3妹:2哥,让我吃个瓜,能不能告诉我你的工资是多少,吓死我!2哥:工资怎么能随便告诉别人呢,别人比你多了你难受,别人比你少了别人难受,还是不知道别人的好。3妹:那你到底请不请吃饭嘛。2哥:想吃饭哪那么......
  • 【字典树/trie树】实现高效插入和查询字符串的数据结构
    本文是https://www.acwing.com/problem/content/description/837/的总结,有兴趣可以做做字典树的实现依赖于树结构,有两种操作,1是插入字符串,2是查找字符串。使用idx维护最新的结点下标。如下图,假设我们维护一个 可以看到,我们维护了一个树形结构储存了左边的字符串,但......
  • str 系列字符串操作函数
    str系列字符串操作函数主要包括strlen、strcpy、strcmp、strcat等。strlen函数用于统计字符串长度,strcpy函数用于将某个字符串复制到字符数组中,strcmp函数用于比较两个字符串的大小,strcat函数用于将两个字符串连接到一起。各个函数的具体格式如下所示:1#include<string.......
  • 双向广搜->字符变换(洛谷P1032)
    题意:给起始和终止串A和B,以及不超过6个字符串变换规则,求A->B能否在10步以内变换完成。分析:暴力bfs每次有6条路可以走,时间复杂度是6^10大概6e8的时间复杂度,会TLE。于是这题是一道经典的双向bfs。直接开两个队列,两个map,暴力搜1~5步即可。双向bfs的时间复杂度是2*(6^5)=1e4......
  • 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中
    描述写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)数据范围:1\len\le1000\1≤n≤1000输入描述:第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。输出描述:......