SFont 库

sfont用大小写英文字母和符号进行内容显示,资源即是字体图片。
sfont下载:http://www.linux-games.com/sfont
我下载SFont 2.03后,解压并make,产生了许多的文件,其中包括三个SFont的测试文件,下面是SFontTest3的效果:

自己来写一个试试,将.h文件,.c文件,要使用的图片文件(我就直接使用24P_Copperplate_Blue.png了)复制到代码文件目录。官网上有更多的字体 http://www.linux-games.com/sfont-fonts/

#include <SDL.h>
#include <SDL_image.h>
#include "SFont.h"int main(){SDL_Surface *screen, *font;SFont_Font* myFont;if(SDL_Init(SDL_INIT_VIDEO) < 0){fprintf(stderr,"SDL init error: %s\n",SDL_GetError());exit(1);}   screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);if(screen == NULL){fprintf(stderr,"Error: %s\n",SDL_GetError());exit(1);}atexit(SDL_Quit);font  = IMG_Load("24P_Copperplate_Blue.png");if(font == NULL){fprintf(stderr,"IMG_Load Error: %s\n",SDL_GetError());exit(1);}myFont = SFont_InitFont(font);/* void SFont_Write(SDL_Surface *Surface, const SFont_Font *Font, int x, int y, const char *text); */SFont_Write(screen,myFont,100,220,"SFont works, hello world");SDL_UpdateRect(screen,0,0,0,0);SDL_Delay(5000);SFont_FreeFont(myFont);//SDL_FreeSurface(font);  /* SDL_FreeFont(myFont) has free font before.*///SDL_FreeSurface(screen);  /* SDL_quit has handled it.*/return 0;
}
edemon@ubuntu1:~/workspace$gcc SFontTest.c SFont.c -o exe -lSDL -lSDL_image
edemon@ubuntu1:~/workspace$./exe

TrueType库

SDL_ttf支持utf8和unicode中文编码,字体美观,缩放简单,可是字库是比较大的。计量单位是MB。
arphic是truetype下的一个库:

edemon@ubuntu1:/usr/share/fonts/truetype$du -sh arphic
37M arphic

关于TrueType库的安装和使用在博文linux图形编程之SDL中的SDL_ttf部分有介绍。
字体绘制函数在SDL_ttf.c中可查看详情

extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Solid(TTF_Font *font,const char *text, SDL_Color fg);
extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Solid(TTF_Font *font,const char *text, SDL_Color fg);
extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Solid(TTF_Font *font,const Uint16 *text, SDL_Color fg);

如在安装后想立刻观看效果,可以使用安装包解压后文件夹中的测试文件:

Usage: /home/edemon/SDL_ttf-2.0.11/.libs/lt-showfont [-solid][-utf8|-unicode][-b][-i][-u][-s][-outline size][-hintlight|-hintmono|-hintnone][-nokerning][-fgcol r,g,b][-bgcol r,g,b]<font>.ttf[ptsize][text]edemon@ubuntu1:~/SDL_ttf-2.0.11$ sudo ./showfont -bgcol 255,255,0 /usr/share/fonts/truetype/freefont/FreeSans.ttf 23 hello\ world
Font is generally 26 big, and string is 26 big


在终端shell上使用中文,测试演示出来是乱码。不过自己在代码中写入中文是不会有这种现象的,可看linux图形编程之SDL中的SDL_ttf部分。

点阵字库

点阵字库保存着英文和中文的字体信息,字体文件大小单位是KB,很小。它通过在屏幕上特定矩阵范围内画出字体的每一点,然后显示出来,处理速度很快,不过显示大字号的时候有锯齿感。

edemon@ubuntu1:~/asc_hzk$du -sh HZK-16
352K    HZK-16

在ubuntu上写程序时,我输入一个汉字结果终端显示了两个中文字符,开始以为是程序错误了,经查证是字符编码的问题。
UTF-8编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节。GBK编码,一个汉字占两个字节。程序是按照一个汉字两个字节进行处理的,所以将文件变成GBK编码。
查看文件的字符编码:
用vim打开文件,set fileencoding可以得到 fileencoding=utf-8,接着我们设置文件编码为GBK

command> set fileencoding=GBK
fileencoding=cp936

不过我再次打开vim时,仍然显示utf-8,看了网上的许多教程,感觉有问题。然后我粗暴地解决了这个次要问题:直接用Geany设置字符编码为GBK。
然后编译测试。

参考博文:https://blog.twofei.com/embedded/hzk.html

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>void initSDL();
void eputc(int x, int y, Uint32 color, char code);
void cputc(int x, int y, Uint32 color, char *code);
void ecputs(int x, int y, Uint32 color, char *str);
void drawPixel(int x, int y, Uint32 color);SDL_Surface *screen;
Uint32 color;
char *efont;
char *cfont;
FILE *efp,*cfp;#define meme 20000
#define memc 200000
int main(){efont = (char *)malloc(meme);cfont = (char *)malloc(memc);  if(efont==NULL && cfont==NULL){fprintf(stderr,"can't malloc memory\n");exit(1);}efp = fopen("../asc_hzk/ASC-16/ASC16","r");//cfp = fopen("/home/edemon/font_lib/16x16/HZK16C","r");cfp = fopen("../asc_hzk/HZK-16/HZK16","r");if(efp==NULL || cfp==NULL){fprintf(stderr,"ASC16 or HZK16 is not found\n");exit(1);}fread(efont,sizeof(char),meme,efp);fread(cfont,sizeof(char),memc,cfp);fclose(efp);fclose(cfp);initSDL();color = SDL_MapRGB(screen->format,255,255,255);SDL_FillRect(screen,&screen->clip_rect,color);  /* set the screen color */color = SDL_MapRGB(screen->format,0,0,0);ecputs(200,20,color,"一  二  三  四  五");SDL_UpdateRect(screen,0,0,0,0);SDL_Delay(10000);free(efont);free(cfont);return 0;
}void initSDL(){if(SDL_Init(SDL_INIT_VIDEO) < 0){fprintf(stderr,"SDL init error: %s\n",SDL_GetError());exit(1);}   screen = SDL_SetVideoMode(640,480,16,SDL_SWSURFACE);if(screen == NULL){fprintf(stderr,"Error: %s\n",SDL_GetError());exit(1);}atexit(SDL_Quit);
}void drawPixel(int x, int y, Uint32 color){Uint16 *bufp;if(SDL_MUSTLOCK(screen)){if(SDL_LockSurface(screen) < 0){return ;}}bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;*bufp = color;if(SDL_MUSTLOCK(screen)){SDL_UnlockSurface(screen);}SDL_UpdateRect(screen,x,y,1,1);
}void eputc(int x, int y, Uint32 color, char code){int i, j;char mask = 0x80;char *ptr = efont+code*16;for(i=0;i<16;i++){for(j=0;j<8;j++){if(ptr[i] & (mask>>j)) drawPixel(x+j,y+i,color);}}
}void cputc(int x, int y, Uint32 color, char *code){int i,j,k;char mask = 0x80; /* 0xFF = 255 = 2^8-1, 0x80 = 16*8 = 2^7 */char q, w;        char *ptr;q = code[0]-0xA1;w = code[1]-0xA1;ptr = cfont+(q*94+w)*32; for(i=0;i<16;i++){   /* 16 rows */for(j=0;j<2;j++){  /* 2 cols, one col has 8 points, which is presented by 8 bits.*/for(k=0;k<8;k++){ /* check 8 bits for every col */if(ptr[2*i+j]&(mask>>k)) drawPixel(x+j*8+k,y+i,color);}}}
}void ecputs(int x, int y, Uint32 color, char *str){char *ptr = str;char code[2] = {0};int len = strlen(str);char mask = 0x80;while(len > 0){if(ptr[0]&mask){        /* Chinese character */    code[0] = ptr[0];code[1] = ptr[1];cputc(x,y,color,code);len -= 2;x += 16;ptr += 2;}else {                 /* English character */code[0] = ptr[0];eputc(x,y,color,code[0]);len--;x += 8;ptr++;}}
}


可能是字体小的缘故,一旦写复杂的汉字,效果就会变差。除非采用更大的点阵。

SDL应用之三种字库相关推荐

  1. matlab矩阵运算_MATLAB基础学习之三种基本运算

    MATLAB学习之三种运算 MATLAB软件 一.基本算数运算 在MATLAB中有两种矩阵运算:右除/和左除.如果A矩阵是非奇异方阵,则B/A等效于B*inv(A),AB等效于inv(A)*B.注:i ...

  2. X86虚拟化之三种服务器虚拟化战略架构

    2019独角兽企业重金招聘Python工程师标准>>> 厚朴[HOPE]工作室 新闻中心 厚朴新闻 专题培训 团队锦囊 协同工作 项目管理 组织架构 师资顾问 设备资产 排忧解难 原 ...

  3. DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率

    DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率 导读 上一篇文章,比较了三种算法实现对手写数字识别,其中,SVM和神经网络算法表现非 ...

  4. 代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析

    1.以类取代类型码 适用情况:类之中有一个数值类型码,但它并不影响类的行为. 重构手段:以一个新的类替换该数值类型码. 重构类图示意: 这里的"不影响类的行为"是什么意思呢? 类型 ...

  5. 【转】NGUI研究院之三种方式监听NGUI的事件方法(七)

    NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不 ...

  6. Android开发之三种动画

    转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...

  7. (转)NGUI研究院之三种方式监听NGUI的事件方法

    NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不 ...

  8. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  9. 集合框架之三种迭代的能否删除

    一:普通for循环的删除 1 // 普通for循环,通过索引删除,删除后索引要-- 2 for (int i = 0; i < list.size(); i++) { 3 if ("d ...

最新文章

  1. 惊:FastThreadLocal吞吐量居然是ThreadLocal的3倍!!!
  2. R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和、使用tapply函数按组聚合求和、按组聚合求和(使用dplyr包)
  3. BCH为什么没有黑客马拉松大赛?我们差钱吗?
  4. 2019年寒假作业1编辑总结
  5. gdiplus 水印_Delphi程序的应用GDI+制作水印效果图片
  6. Xcode4.5编译ffmpeg成功,过程说明
  7. linux下I2C驱动发送IO时序,Linux I2C 驱动阅读的碰到的一些网上没有提到的东西
  8. Silverlight 写了一个2D仿3D的柱状图表
  9. sublime Text3安装及配置与解决安装插件失败
  10. python可变类型与不可变类型作为函数参数区别_不要用可变类型对象做函数默认参数...
  11. 使用GY89的BMP180模块获取温度和压强(海拔)
  12. vscode php 不进断点,php – Docker和XDebug没有读取断点VSCode
  13. 海康、大华摄像头chrome高版本实时播放(java集成)
  14. 七月三日服务器维护,7月3日全部服务器更新维护公告
  15. Driller工具分析
  16. 转载之-中值滤波均值滤波
  17. 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
  18. 计算机技术考研科目大纲,2017计算机考研大纲:计算机大纲文字完整版
  19. 决策树相关算法——ID3、C4.5的详细说明及实现
  20. Warpspeed 2021 DFINITY×IAF黑客松Demo Day落幕,10支队伍获奖

热门文章

  1. 服务器U盘安装虚拟化,用Proxmox ISO镜像制作引导U盘
  2. 论文阅读Measuring Regularity of Individual Travel Patterns
  3. AD20的最全安装步骤
  4. 男人应该做的50件事(1-16)
  5. hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】
  6. Xmanager 5安装及使用
  7. 云宏携手英特尔基于英特尔® 至强® 可扩展平台全面升级超融合一体机解决方案
  8. 攻防世界逆向入门题之open-source
  9. Ansible中的常用模块介绍
  10. python signal处理