IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> SDL显示文本 -> 正文阅读

[系统运维]SDL显示文本

SDL显示文本

?? SDL2.0库本身没有文本数据显示相关函数接口,文本显示需要编译安装SDL_ttf库

1.编译安装SDL2_ttf库

SDL_ttf下载地址:SDL_ttf
??(1)将下载的SDL2-2.0.14.tar.gz压缩包拷贝至虚拟机解压。

[wbyq@wbyq src_pack]$ tar xvf /mnt/hgfs/ubuntu/software_pack/SDL2_ttf-2.0.15.tar.gz 

(2)配置编译安装路径

[wbyq@wbyq SDL2_ttf-2.0.15]$ ./autogen.sh 
[wbyq@wbyq SDL2_ttf-2.0.15]$ ./configure --prefix=$PWD/_install
[wbyq@wbyq SDL2_ttf-2.0.15]$ make && make install 

(3)编译成功生成文文件

[wbyq@wbyq _install]$ tree
.
├── include
│   └── SDL2
│       ├── freetype.h
│       └── SDL_ttf.h
└── lib
    ├── libSDL2_ttf-2.0.so.0 -> libSDL2_ttf-2.0.so.0.14.1
    ├── libSDL2_ttf-2.0.so.0.14.1
    ├── libSDL2_ttf.a
    ├── libSDL2_ttf.la
    ├── libSDL2_ttf.so -> libSDL2_ttf-2.0.so.0.14.1
    └── pkgconfig
        └── SDL2_ttf.pc

4 directories, 8 files

2.增加设置字体大小函数

??SDL2_ttf库中提供函数没有单独提供设置字体大小函数,为了方便设置字体大小,修改SDL_ttf.c文件,增加设置字体大小函数。

[wbyq@wbyq SDL2_ttf-2.0.15]$ gedit SDL_ttf.c +2135
void TTF_SetFontSize(TTF_Font *font,int ptsize)
{
	FT_Fixed scale;
	FT_Error error;
	FT_Face face;
	face = font->face;
	/* Make sure that our font face is scalable (global metrics) */
	if ( FT_IS_SCALABLE(face) ) {
	  	/* Set the character size and use default DPI (72) */
	  	error = FT_Set_Char_Size( font->face, 0, ptsize * 64, 0, 0 );
			if( error ) {
	    	TTF_SetFTError( "Couldn't set font size", error );
	    	TTF_CloseFont( font );
	    	return ;
	  }
	  /* Get the scalable font metrics for this font */
	  scale = face->size->metrics.y_scale;
	  font->ascent  = FT_CEIL(FT_MulFix(face->ascender, scale));
	  font->descent = FT_CEIL(FT_MulFix(face->descender, scale));
	  font->height  = font->ascent - font->descent + /* baseline */ 1;
	  font->lineskip = FT_CEIL(FT_MulFix(face->height, scale));
	  font->underline_offset = FT_FLOOR(FT_MulFix(face->underline_position, scale));
	  font->underline_height = FT_FLOOR(FT_MulFix(face->underline_thickness, scale));
	} else {
		/* Non-scalable font case.  ptsize determines which family
		 * or series of fonts to grab from the non-scalable format.
		 * It is not the point size of the font.
		 * */
		if ( ptsize >= font->face->num_fixed_sizes )
			ptsize = font->face->num_fixed_sizes - 1;
		font->font_size_family = ptsize;
		error = FT_Set_Pixel_Sizes( face,
				face->available_sizes[ptsize].height,
				face->available_sizes[ptsize].width );
	  	/* With non-scalale fonts, Freetype2 likes to fill many of the
		 * font metrics with the value of 0.  The size of the
		 * non-scalable fonts must be determined differently
		 * or sometimes cannot be determined.
		 * */
	  	font->ascent = face->available_sizes[ptsize].height;
	  	font->descent = 0;
	  	font->height = face->available_sizes[ptsize].height;
	  	font->lineskip = FT_CEIL(font->ascent);
	  	font->underline_offset = FT_FLOOR(face->underline_position);
	  	font->underline_height = FT_FLOOR(face->underline_thickness);
	}
	if ( font->underline_height < 1 ) {
		font->underline_height = 1;
	}
	font->glyph_italics *= font->height;
	Flush_Cache(font); //这个非常重要
}

在这里插入图片描述
??在sdl_ttf.h中声明函数

[wbyq@wbyq SDL2_ttf-2.0.15]$ gedit SDL_ttf.h +291
extern void TTF_SetFontSize(TTF_Font *font,int ptsize);/*设置字体大小*/

3.SDL文本显示示

#include <stdio.h>
#include <SDL.h>
#include <SDL_ttf.h>
#define WINDOW_W 800
#define WINDOW_H 480
int main(int argc,char *argv[])
{
	/*SDL初始化*/
	SDL_Init(SDL_INIT_VIDEO);
	/*TTF初始化*/
	TTF_Init();
	/*创建窗口*/
	SDL_Window *window=SDL_CreateWindow("SDL SHOW TEXT",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_W,WINDOW_H,SDL_WINDOW_SHOWN	);
	/*创建渲染器*/
	SDL_Renderer *render=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
	/*设置渲染器颜色*/
	SDL_SetRenderDrawColor(render, 255, 255, 255, 255);
	/*清空渲染器*/
	SDL_RenderClear(render);
	/*打开字库*/
	TTF_Font *ttffont=TTF_OpenFont("simkai.ttf",50);
	if(ttffont==NULL)
	{
		printf("simkai.ttf open failed\n");
		return 0;
	}
	
	SDL_Color color={52,203,120,255};/*字体颜色RGBA*/
	
	/*创建字体显示表面*/
	SDL_Surface *text1_surface=TTF_RenderUTF8_Blended(ttffont,"hello,world!",color);
	/*创建纹理*/
	SDL_Texture * texture=SDL_CreateTextureFromSurface(render,text1_surface);
	/*将surface拷贝到渲染器*/
	SDL_Rect dstrect;
	dstrect.x=WINDOW_W/2-text1_surface->w/2;/*显示的起始位置*/
	dstrect.y=100;/*显示的起始位置*/
	dstrect.w=text1_surface->w;/*显示的宽度*/
	dstrect.h=text1_surface->h;/*显示的高度*/
	SDL_RenderCopy(render,texture,NULL,&dstrect);
	SDL_FreeSurface(text1_surface);/*释放surface*/
	SDL_DestroyTexture(texture);/*释放纹理*/

	/*设置字体大小*/
	TTF_SetFontSize(ttffont,60);
	/*字体加粗*/
	TTF_SetFontStyle(ttffont,TTF_STYLE_BOLD);
	/*创建字体显示表面*/
	text1_surface=TTF_RenderUTF8_Blended(ttffont,"北京万邦易嵌科技有限公司",color);
	/*创建纹理*/
	texture=SDL_CreateTextureFromSurface(render,text1_surface);
	/*将surface拷贝到渲染器*/
	dstrect.x=WINDOW_W/2-text1_surface->w/2;/*显示的起始位置*/
	dstrect.y=160;/*显示的起始位置*/
	dstrect.w=text1_surface->w;/*显示的宽度*/
	dstrect.h=text1_surface->h;/*显示的高度*/
	SDL_RenderCopy(render,texture,NULL,&dstrect);
	SDL_FreeSurface(text1_surface);/*释放surface*/
	SDL_DestroyTexture(texture);/*释放纹理*/
	/*正常字体*/
	TTF_SetFontStyle(ttffont,TTF_STYLE_NORMAL);
	/*创建字体显示表面*/
	text1_surface=TTF_RenderUTF8_Blended(ttffont,"www.wanbangee.com",color);
	/*创建纹理*/
	texture=SDL_CreateTextureFromSurface(render,text1_surface);
	/*将surface拷贝到渲染器*/
	dstrect.x=WINDOW_W/2-text1_surface->w/2;/*显示的起始位置*/
	dstrect.y=230;/*显示的起始位置*/
	dstrect.w=text1_surface->w;/*显示的宽度*/
	dstrect.h=text1_surface->h;/*显示的高度*/
	SDL_RenderCopy(render,texture,NULL,&dstrect);
	SDL_FreeSurface(text1_surface);/*释放surface*/
	SDL_DestroyTexture(texture);/*释放纹理*/

	/*正常字体*/
	TTF_SetFontStyle(ttffont,TTF_STYLE_NORMAL);
	/*创建字体显示表面*/
	text1_surface=TTF_RenderUTF8_Blended(ttffont,"SDL_ttf库显示测试示例!",color);
	/*创建纹理*/
	texture=SDL_CreateTextureFromSurface(render,text1_surface);
	/*将surface拷贝到渲染器*/
	dstrect.x=WINDOW_W/2-text1_surface->w/2;/*显示的起始位置*/
	dstrect.y=300;/*显示的起始位置*/
	dstrect.w=text1_surface->w;/*显示的宽度*/
	dstrect.h=text1_surface->h;/*显示的高度*/
	SDL_RenderCopy(render,texture,NULL,&dstrect);
	SDL_FreeSurface(text1_surface);/*释放surface*/
	SDL_DestroyTexture(texture);/*释放纹理*/
	SDL_RenderPresent(render);/*刷新显示*/
	SDL_Event event;
	while(1)
	{
		if(SDL_PollEvent(&event))/*获取事件*/
		{
			if(event.type==SDL_QUIT)break;
		}
	}
	TTF_CloseFont(ttffont);/*关闭字库*/
	TTF_Quit();/*关闭ttf*/
	SDL_DestroyRenderer(render);/*注销渲染器*/
	SDL_DestroyWindow(window);/*注销窗口*/
	SDL_Quit();
	return 0;
}

4.Makefile文件

CFLAGS =-I/home/wbyq/src_pack/SDL2-2.0.14/_install/include -I/home/wbyq/src_pack/SDL2-2.0.14/_install/include/SDL2 -L/home/wbyq/src_pack/SDL2-2.0.14/_install/lib
CFLAGS +=-L/home/wbyq/src_pack/SDL2_image-2.0.5/_install/lib -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include -I/home/wbyq/src_pack/SDL2_image-2.0.5/_install/include/SDL2

CFLAGS +=-I/home/wbyq/src_pack/SDL2_ttf-2.0.15/_install/include/SDL2 -L/home/wbyq/src_pack/SDL2_ttf-2.0.15/_install/lib
CFLAGS+=-lSDL2 -lpthread -lm -ldl -lSDL2_image -lSDL2_ttf
app:
	gcc sdl_test.c  $(CFLAGS)

5.运行效果

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:26:30  更:2021-12-03 13:27:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:45:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码