hi3516 freetype sdl


原文链接: hi3516 freetype sdl

https://download.videolan.org/contrib/freetype2/freetype-2.4.10.tar.gz

~/cpp/3rdpart

CFLAGS   += -I/root/paho.mqtt.c/src
MPI_LIBS += /usr/local/lib/libpaho-mqtt3c.so.1

CFLAGS   += -I/usr/local/include/freetype2/freetype
MPI_LIBS += /usr/local/lib/libfreetype.so.6

CFLAGS   += -I/usr/local/include/SDL
MPI_LIBS += /usr/local/lib/libSDL-1.2.so.0

CFLAGS   += -I/usr/local/include/
MPI_LIBS += /usr/local/lib/libSDL_ttf-2.0.so.0

关于使用Hi3516等平台

    在实现osd文字处理的时候
    除了官方的HiFB文档方式处理
    另一种处理方式就是用第三方函数库:freetype+SDL+SDL_ttf
    然后配合region(区域管理)方式 实现文字叠加

这里主要讨论freetype、SDL、SDl_ttf这些库的安装及使用,关于region叠加处理请参考:

首先,是函数库源码包下载,各位可以去官网下载
(要注意源码包的版本兼容,我在编译函数库时就出现了freetype与SDL库的某些版本在一起无法编译的问题)
有需要的朋友 可以直接从我的附件中下载 经过试验可以确保 源码可用可编译移植;

接下来,下载好源码按照以下步骤 安装:

    (注:目前建议全部安装默认路径,切换路径要注意逻辑关系,待后续更新)
    1、freetype安装:
        aria2c -c -x 16 http://download.savannah.gnu.org/releases/freetype/freetype-2.4.10.tar.gz
            tar -xvf freetype***.tar.bz2 解压
         进入 cd freetype文件目录
            执行./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux
                    make
                    make install
    注:若安装成功则会在 /usr/local/目录下生成 bin、lib、include、share四个文件夹并且内部有相关文件;

    2、SDL安装:
            tar -xvf SDL-***.tar.gz 解压
         进入SDL文件目录
            执行./configure CC=arm-isiv300-linux-gcc --host=arm-himix200-linux
                    make
                    make install
    注:若安装成功后将会在usr/local/目录下的bin、lib、include、share目录下生成相应文件

    3、SDL_ttf安装:
            tar -xvf SDL_ttf-***.tar.gz 解压
          进入SDL_ttf文件目录
            执行./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux
                    make
                    make install
    注:若安装成功后将会在 usr/local/ 目录下的bin、lib、include、share目录下生成相应文件

NOTE:

    若以上均安装成功,则在 usr/local 目录下存在如下文件
    执行 tree  -L  2
    .
    ├── bin
    │    ├── freetype-config
    │    └── sdl-config
    ├── include
    │    ├── freetype2
    │    ├── ft2build.h
    │    └── SDL
    ├── lib
    │    ├── libfreetype.a       
    │    ├── libfreetype.la
    │    ├── libfreetype.so -> libfreetype.so.6.9.0
    │    ├── libfreetype.so.6 -> libfreetype.so.6.9.0
    │    ├── libfreetype.so.6.9.0
    │    ├── libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.4
    │    ├── libSDL-1.2.so.0.11.4       
    │    ├── libSDL.a
    │    ├── libSDL.la
    │    ├── libSDLmain.a
    │    ├── libSDLmain.la
    │    ├── libSDL.so -> libSDL-1.2.so.0.11.4
    │    ├── libSDL_ttf-2.0.so.0 -> libSDL_ttf-2.0.so.0.10.1
    │    ├── libSDL_ttf-2.0.so.0.10.1
    │    ├── libSDL_ttf.a
    │    ├── libSDL_ttf.la
    │    ├── libSDL_ttf.so -> libSDL_ttf-2.0.so.0.10.1
    │    └── pkgconfig
    └── share
           ├── aclocal
           └── man

最后,将 include 和 lib( libSDL.so, libSDL_ttf.so, libfreetype.so) 拷贝到相应的应用工程的目录中 并修改Makefile规则 进行编译调试
NOTE: 在板卡执行时,要把 libfreetype.so.6 libSDL-1.2.so.0 libSDL_ttf-2.0.so.0 拷贝到板卡 /lib 目录下。

freetype+SDL+SDL_ttf简介
FreeType2是一个简单的跨平台的字体绘制引擎

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

SDL_ttf是TrueType字体渲染库,使用SDL库,几乎一样的便携。这取决于FreeType2处理TrueType字体数据。它允许程序员使用多个TrueType字体无需代码的字体渲染程序本身。随着轮廓字体和反走样的力量,高质量的文本输出可以毫不费力的获得。

##0/源码下载

下面三个包,可以从我的资源下载,也可以在网上找.
据说三个库不匹配会出问题,你懂得,出了问题改起来很麻烦的.
linux@ubuntu:~/tmp/sdl$ ls
freetype-2.4.10.tar.gz SDL-1.2.15.tar.gz SDL_ttf-2.0.11.tar.gz
1
2
3
4
1/freetype安装:
tar -xvf freetype***.tar.bz2 解压
进入freetype文件目录
执行./configure --host=arm-himix200-linux
make
make install
//ATTENTION:一定要注意安装成功一个库才能安装下一个库

##2/修改freetype的头文件

上述命令敲击过后,会在/usr/local/目录下
生成bin目录
生成include目录
生成lib目录

而我们要做的是
1/修改/usr/local/include/ft2build.h文件 56行
#include
2/修改/usr/local/include/freetype2/freetype/config/ftheader.h文件,全篇
在底行模式下键入
%s/freetype/freetype2\/freetype/g
3/修改/usr/local/freetype2/freetype/config/ftheader.h文件,173行
#define FT_FREETYPE_H

3/SDL安装:
tar -xvf SDL-***.tar.gz 解压
进入SDL文件目录
执行./configure --host=arm-himix200-linux
make
make install
//ATTENTION:一定要注意安装成功一个库才能安装下一个库

4/SDL_ttf安装:
tar -xvf SDL_ttf-***.tar.gz 解压
进入SDL_ttf文件目录
执行./configure --host=arm-himix200-linux
make
make install
//ATTENTION:一定要注意安装成功

5/创建demo
/test.c/

#include<stdio.h>
#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"


int main(int argc, const char *argv[])
{
	char * pstr = "hello";
	SDL_PixelFormat *fmt;
	TTF_Font *font;  
	SDL_Surface *text, *temp;  

	if (TTF_Init() < 0 ) 
	{  
		fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  
		SDL_Quit();
	}  

	font = TTF_OpenFont("./simhei.ttf", 48); 
	if ( font == NULL ) 
	{  
		fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());  
	}  

	SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };  
	text = TTF_RenderUTF8_Solid(font, pstr, forecol);

	fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
	memset(fmt,0,sizeof(SDL_PixelFormat));
	fmt->BitsPerPixel = 16;
	fmt->BytesPerPixel = 2;
	fmt->colorkey = 0xffffffff;
	fmt->alpha = 0xff;

	temp = SDL_ConvertSurface(text,fmt,0);
	SDL_SaveBMP(temp, "save.bmp"); 

	SDL_FreeSurface(text);  
	SDL_FreeSurface(temp);
	TTF_CloseFont(font);  
	TTF_Quit();  

	return 0;
}

##6/编译

/编译选项/
gcc test.c -lSDL -lSDL_ttf -Wl,-rpath,/usr/local/lib

资源下载
编译正常且运行正常的前提是所有的动态库都默认装在了/usr/local/目录下
且目录下有个simhei.ttf文件
当然,也可以看我的demo,点击资源下载标题就可以了
————————————————
版权声明:本文为CSDN博主「__pop_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011011827/article/details/58709139

####
/**********sdl********/
        TTF_Font *font;
        SDL_PixelFormat *fmt;
        SDL_Surface *text;
        SDL_Surface *temp;
        if (TTF_Init() < 0)
        {
            fprintf(stderr, "Couldn't initialize TTF:%s\n", SDL_GetError());
            SDL_Quit();
            return -1;
        }
    
        font = TTF_OpenFont("./simhei.ttf", 16);
        if (NULL == font)
        {
            fprintf(stderr, "Couldn't load %d pt font from %s:%s\n", 18, "ptsize", SDL_GetError());
            return -2;
        }

    char strings[32] = 
    {
        "HIDE MENU        ",
   "FOCUS     AUTO   ", 
        "ROI       OFF    ", 
        "FBL       OFF    ", 
   "BRIGHT    0      ", 
        "EXPMODE   AUTO   ", 
        "WBMODE    AUTO   ", 
        "SHARP     4      ", 
        "DEFAULT   OFF    ", 
        "GAMMA     1      ", 
        "FRAMERATE 1080P30"
    };
    SDL_Color forecol[11] = 
    {
        { 0xff, 0x00, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },
        { 0x80 0xff, 0x00, 0xff }
    };
    fmt = (SDL_PixelFormat
)malloc(sizeof(SDL_PixelFormat));
    memset(fmt, 0, sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;
    for (i = 0; i < 8; i++)
    {
        text = TTF_RenderUTF8_Solid(font, strings[i], forecol[i]);
        temp = SDL_ConvertSurface(text, fmt, 0x00);
    //SDL_SaveBMP(temp, "save.bmp");

        stBitmap[i].u32Width = temp->w;
        //printf("temp->w:%d\n", temp->w);
        stBitmap[i].u32Height = temp->h;
        //printf("temp->h:%d\n", temp->h);
        stBitmap[i].pData = temp->pixels;
        stBitmap[i].enPixelFormat = PIXEL_FORMAT_RGB_1555;

        s32Ret = HI_MPI_RGN_SetBitMap(i, &(stBitmap[i]));
        if (s32Ret != HI_SUCCESS)
        {
            printf("HI_MPI_RGN_SetBitMap failed with %#x!\n", s32Ret);
            return s32Ret;
        }

我采用的方式是利用sdl+freetype生成字符图像,然后将图像的像素赋值给stBitmap.pData,再调用HI_MPI_RGN_SetBitMap来添加osd

其中设置字体颜色的变量是SDL_Color,按RGBA的格式设置

这里有一点要注意的是,(不清楚海思开发人员是如何编写HI_MPI_RGN_SetBitMap的字体叠加逻辑的)

{ 0x7f,   0xff, 0x00, 0xff },
        { 0x80, 0xff, 0x00, 0xff },

这是两个SDL_Color的值,按第一个设置的话,字体镂空,字体的空隙被设定像素填充

                                                按第二个设置的话,字体空隙镂空,字体被设定像素填充(一般情况,这才是我们想要的效果)

也就是说字体镂空还是字体空隙镂空取决于RGBA的第一个分量R的值,如果R大于等0x80则字体空隙镂空,否则的话则字体镂空

这一点海思竟然没有在开发文档中标明,这也提醒各位开发者们,自己开发的产品,一定要有写文档的习惯,不要给其他开发者留下不必要的坑。
————————————————
版权声明:本文为CSDN博主「没有你的夜001」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26671365/article/details/79007066

海思osd+freetype+SDL+SDL_ttf字体颜色。

我的虚拟机是 Ubuntu 14.04,那首先移植 freetype+SDL+SDL_ttf 这三个库。 编译安装后哦 生成文件在 /usr/local/include,lib.share,bin 四个目录中

一、库移植
###(1)freetype下载安装
1、下载

freetype下载 https://download.videolan.org/contrib/freetype2/
选择下载版本为: freetype-2.4.10.tar.gz

aria2c -c -x 16 http://download.savannah.gnu.org/releases/freetype/freetype-2.4.10.tar.gz

2、安装

解压: # tar -xvf freetype-2.4.10.tar.gz
进入freetype文件目录: # cd freetype-2.4.10
执行: # ./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux --prefix=${PWD}/../output --enable-shared=no
编译:make && make install

###(2)SDL下载安装
1、下载

SDL下载 https://download.videolan.org/contrib/sdl/
选择下载版本:SDL-1.2.15.tar.gz

aria2c -c -x 16 https://download.videolan.org/contrib/sdl/SDL-1.2.15.tar.gz
2、安装

解压: # tar -xvf SDL-1.2.15.tar.gz
进入SDL文件目录: # cd SDL-1.2.15/
执行: CC=arm-himix200-linux-gcc ./configure --host=arm-himix200-linux --prefix=${PWD}/../output --enable-shared=no
进入SDL目录:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux --disable-alsa --disable-pulseaudio --enable-esd=no --prefix=/opt/sdl/install

出现问题1:

./src/audio/esd/SDL_esdaudio.c:30:17: fatal error: esd.h: 没有那个文件或目录

解决方法1:
加上--enable-esd=no,这个错误好像是音频相关的错误,这里直接关掉音频。

编译:make && make install

zlib

git clone https://github.com/madler/zlib.git -b v1.2.11 --depth=1
CHOST=arm-himix200-linux ./configure --static  --prefix=${PWD}/../output

make

编译libpng16 已经编译过的请看第三步;

http://www.libpng.org/

aria2c -c -x 16 http://ftp-osl.osuosl.org/pub/libpng/src/libpng16/libpng-1.6.34.tar.gz
下载好libpng源码后,解压&&进入到源码目录;
执行:
CPPFLAGS=-I${PWD}/../output/include LDFLAGS=-L${PWD}/../output/lib CC=arm-himix200-linux-gcc ./configure --host=arm-himix200-linux --with-zlib-prefix=${PWD}/../output --prefix=${PWD}/../output --enable-shared=no

#export LDFLAGS="-L/usr/local/zlib/lib"
#export CPPFLAGS="-I/usr/local/zlib/include"

./configure CC=arm-hisiv500-linux-gcc --host=arm-linux --prefix=/usr/share/arm-libpng LDFLAGS=-L/usr/share/arm-zlib/lib
然后修改Makefile添加zlib的头文件目录,configure上加头文件Makefile中也不会自动加,所以要改下;
DEFAULT_INCLUDES = -I. -I/usr/share/arm-zlib/include
make
sudo make install

###(3)SDL_ttf下载安装
1、下载

SDL_ttf下载
aria2c -c -x 16 https://www.libsdl.org/projects/SDL_ttf/release/SDL_ttf-2.0.11.tar.gz
选择下载版本:SDL_ttf-2.0.11.tar.gz

2、安装

解压: # tar -xvf SDL_ttf-2.0.11.tar.gz
进入SDL_ttf文件目录: # cd SDL_ttf-2.0.11/
执行: # ./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux --with-freetype-prefix=--prefix=${PWD}/../output --with-sdl-prefix=${PWD}/../output --prefix=${PWD}/../output --enable-shared=no
执行: # ./configure CC=arm-himix200-linux-gcc --host=arm-himix200-linux --with-freetype-prefix=/usr/local/ --with-sdl-prefix=/usr/local/
编译: make && make install

注意:将上面的 – 改为两个 -- 这是CSDN编译器的bug!!

MPI_LIBS += $(REL_LIB)/libSDL.a
MPI_LIBS += $(REL_LIB)/libSDL_ttf.a
MPI_LIBS += $(REL_LIB)/libfreetype.a
如果静态编译还要加上
MPI_LIBS += $(REL_LIB)/libz.a

二、测试
(1)拷贝生成sdl库

mkdir /opt/sdl_lib
cd /opt/sdl_lib
cp /usr/local/include/ ./ -rf
cp /usr/local/lib/ ./ -rf

(2)编写测试程序

/************************************************************

File Name: test.c
Created Time: 2017年02月28日 星期二 21时47分05秒
************************************************************/

#include <stdio.h>
#include "SDL.h"
#include "SDL_ttf.h"

int main(int argc, const char *argv[])
{
    char * pstr = "hello";
    SDL_PixelFormat *fmt;
    TTF_Font *font;  
    SDL_Surface *text, *temp;  

    if (TTF_Init() < 0 ) 
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  
        SDL_Quit();
    }

    font = TTF_OpenFont("./simhei.ttf", 48); 
    if ( font == NULL ) 
    {
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());  
    }

    SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };  
    text = TTF_RenderUTF8_Solid(font, pstr, forecol);

    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;

    temp = SDL_ConvertSurface(text,fmt,0);
    SDL_SaveBMP(temp, "save.bmp"); 

    SDL_FreeSurface(text);  
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);  
    TTF_Quit();  

    return 0;
}

(3)编译

CFLAGS=-I/opt/sdl_lib/include -I/opt/sdl_lib/include/SDL -L/opt/sdl_lib/lib
arm-himix200-linux-gcc test.c $(freetype-config --cflags --libs) $(sdl-config --cflags --libs) -lSDL_ttf -Wl,-rpath -o test

arm-himix200-linux-gcc test.c -Llib -Iinclude -Iinclude/libpng16/ -Iinclude/freetype2/ -Iinclude/SDL -l${PWD}/lib/libz.a -l${PWD}/lib/libpng16.a -l${PWD}/lib/libfreetype.a -l${PWD}/lib/libSDL.a -l${PWD}/lib/libSDL_ttf.a -Wl,-rpath -o test

arm-himix200-linux-gcc test.c -Llib -Iinclude -Iinclude/libpng16/ -Iinclude/freetype2/ -Iinclude/SDL ${PWD}/lib/libz.a ${PWD}/lib/libpng16.a ${PWD}/lib/libfreetype.a ${PWD}/lib/libSDL.a ${PWD}/lib/libSDL_ttf.a -Wl,-rpath -o test

arm-himix200-linux-gcc test.c -Llib -Iinclude -Iinclude/libpng16/ -Iinclude/freetype2/ -Iinclude/SDL libz -lpng16 -lSDL_ttf -lfreetype -lSDL-lpthread -Wl,-rpath -o test

arm-himix200-linux-gcc -Iinclude -Iinclude/libpng16/ -Iinclude/freetype2/ -Iinclude/SDL -lpthread -lm -o test test.c -Wl,--start-group ${PWD}/lib/libz.a ${PWD}/lib/libpng16.a ${PWD}/lib/libfreetype.a ${PWD}/lib/libSDL.a ${PWD}/lib/libSDL_ttf.a -Wl,--end-group

@$(CC) $(CFLAGS) -lpthread -lm -o $@ $^ -Wl,--start-group $(MPI_LIBS) $(SENSOR_LIBS) $(AUDIO_LIBA) $(REL_LIB)/libsecurec.a -Wl,--end-group

`