Hi3516a移植SDL+FreeType+SDL_ttf

SDL+FreeType+SDL_ttf庫編譯過程

freeType編譯過程

  • 解壓:tar -xvf freetype-2.4.10.tar.gz
  • 進入freeType目錄:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux
  • 1
  • make
  • make install

SDL編譯過程

  • 解壓:tar -xvf SDL-1.2.15.tar.gz
  • 進入SDL目錄:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux --disable-alsa --disable-pulseaudio --enable-esd=no 
  • 1

出現問題1:

./src/audio/esd/SDL_esdaudio.c:30:17: fatal error: esd.h: 沒有那個文件或目錄
  • 1

解決方法1: 
加上--enable-esd=no,這個錯誤好像是音頻相關的錯誤,這裏直接關掉音頻。 
make 
make install

SDL_ttf編譯過程

  • 解壓:tar xvf SDL_ttf-2.0.11.tar.gz
  • 進入SDL_ttf-2.0.11目錄:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux
  • 1

若上述過程成功,會在/usr/local目錄下生成相應文件: 
在/usr/local目錄下執行tree -L 2(ps:有時間要研究下tree命令),結果如下:

.
├── bin
│   ├── freetype-config
│   └── sdl-config
├── etc
├── games
├── 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
│   ├── python2.7
│   └── python3.5
├── man -> share/man
├── sbin
├── share
│   ├── aclocal
│   ├── ca-certificates
│   ├── emacs
│   ├── fonts
│   ├── man
│   ├── sgml
│   └── xml
└── src
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 拷貝生成sdl庫
mkdir -C /opt/sdl_lib
cd /opt/sdl_lib
cp /usr/local/include/ ./ -rf
cp /usr/local/lib/ ./ -rf 
  • 1
  • 2
  • 3
  • 4

測試

ps:這個程序不是我寫的,感謝作者Sues

/*************************************************************************
  > File Name: test.c
  > Author: Sues
  > Mail: [email protected] 
  > 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"); 

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

    return 0;
}

編譯命令:

arm-hisiv500-linux-gcc test.c `sdl-config --cflags --libs` -I/opt/sdl_lib/include -I/opt/sdl_lib/include/SDL -L/opt/sdl_lib/lib -lSDL -lSDL_ttf -Wl,-rpath -o test
  • 1

在開發板上執行test,會生成save.bmp,打開後可以發現是Hello! 
注意:執行需要

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/sdl_lib/lib #/opt/sdl_lib/lib目錄是我存放動態庫文件的地方
# 同時需要在test文件下防止simhei.ttf文件,這樣才能找到字體
  • 1
  • 2

總結

參考的是如下博主的資源,感謝這位博主的分享! 
參考鏈接

番外

因爲BMP圖片不能設置透明,所以顯示的圖在視頻幀上會導致視頻的背景是黑色的,而且無法去除。這個問題我糾結了好久,最後也是在易百納論壇找到的解決方法! 
重點在於zhuangweiye大神的回答:


s32Ret = SAMPLE_RGN_UpdateCanvas("sys_time.bmp", &stBitmap, HI_TRUE, 0x8000, &stSize, stCanvasInfo.u32Stride, stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt);
  • 1
  • 2

有時間再把區域+SDL的方法顯示位圖這一部分搞上來,暫時還是寫寫編譯的東西吧!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章