您尚未登录。

楼主 #1 2018-08-11 14:06:10

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

@assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

QQ20180811133927.jpg

QQ20180811133939.jpg

一个初始化
一个获取 bitmap 和 width 和 rows
只要这三个函数就好了
同样弄一个结构体
里面 h_px 这个成员要实时去设置 因为 freetype 里面有获取的

哪位有空可以照着这种套路试一试,
做出来分享一下.





离线

#2 2018-08-11 14:38:51

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

裸机实现的,还是Linux下

离线

楼主 #3 2018-08-11 14:47:40

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

他做的Linux下面的, 裸机的套路应该是一样的。
但是裸机这么做必要性不太大了。





离线

#4 2018-08-11 20:12:32

john78
会员
注册时间: 2018-07-19
已发帖子: 222
积分: 160

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

木有看懂,也有汉字显示移植计划。不用小字库,至少HzK16,目标支持矢量字体

离线

楼主 #5 2018-08-11 20:36:01

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

john78 说:

木有看懂,也有汉字显示移植计划。不用小字库,至少HzK16,目标支持矢量字体

使用libfreetype这种矢量字体(ttf)解析库,
直接解析ttf文件,
可以生成任意大小的字,
而不需要预先生成固定大小的字模文件。

https://whycan.cn/t_741.html





离线

#6 2018-08-11 22:50:29

john78
会员
注册时间: 2018-07-19
已发帖子: 222
积分: 160

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

HZK16搞定了。矢量还要研究。free type
功能大多,太复杂。得花精力研究

离线

#7 2018-10-27 02:39:06

tango_zhu
会员
注册时间: 2018-04-12
已发帖子: 121
积分: 3

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

mark 下 这个是直接解析ttf文件吗

离线

楼主 #8 2018-10-27 08:06:06

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

tango_zhu 说:

mark 下 这个是直接解析ttf文件吗

对的,对的。





离线

#9 2018-12-24 22:34:36

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

ttf放在文件系统里,这个文件系统怎么和freetype对接的?freetype怎么去找的。 Linux没问题但是逻辑呢,得自己实现文件系统吧

最近编辑记录 达克罗德 (2018-12-24 22:34:54)

离线

#10 2018-12-25 08:10:31

lilo
会员
注册时间: 2017-10-15
已发帖子: 215
积分: 215

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

达克罗德 说:

ttf放在文件系统里,这个文件系统怎么和freetype对接的?freetype怎么去找的。 Linux没问题但是逻辑呢,得自己实现文件系统吧

对接是指如何调用吗?
调用方法可以参考晕哥这个帖子: https://whycan.cn/t_741.html

文件系统改改代码估计未必需要, 把需要的字扣出来, 存到另外一个 ttf 文件里面, 然后把文件存数组。

剪裁ttf字库可以参考 中科世为 这个套路: https://developer.flythings.cn/docs/zh/font_cut_tool

最近编辑记录 lilo (2018-12-25 08:12:16)

离线

#11 2018-12-25 08:29:20

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

lilo 说:
达克罗德 说:

ttf放在文件系统里,这个文件系统怎么和freetype对接的?freetype怎么去找的。 Linux没问题但是逻辑呢,得自己实现文件系统吧

对接是指如何调用吗?
调用方法可以参考晕哥这个帖子: https://whycan.cn/t_741.html

文件系统改改代码估计未必需要, 把需要的字扣出来, 存到另外一个 ttf 文件里面, 然后把文件存数组。

剪裁ttf字库可以参考 中科世为 这个套路: https://developer.flythings.cn/docs/zh/font_cut_tool

谢谢!我是说初始化freetype字体face的时候,要传递ttf文件名,ttf是放到文件系统里的。在裸奔系统里,怎么实现这种文件访问

PS,这个裁剪工具真不错,我的字体十几MB,可以试试

离线

楼主 #12 2018-12-25 08:55:03

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

http://bbs.21ic.com/icview-586134-1-1.html

今天发现了Freetype与文件系统相关的接口定义
在ftstdlib.h 这个头中

#include <string.h>

#define ft_memchr   memchr
#define ft_memcmp   memcmp
#define ft_memcpy   memcpy
#define ft_memmove  memmove
#define ft_memset   memset
#define ft_strcat   strcat
#define ft_strcmp   strcmp
#define ft_strcpy   strcpy
#define ft_strlen   strlen
#define ft_strncmp  strncmp
#define ft_strncpy  strncpy
#define ft_strrchr  strrchr
#define ft_strstr   strstr
这些是内存管理

#include <stdio.h>

#define FT_FILE     FILE
#define ft_fclose   fclose
#define ft_fopen    fopen
#define ft_fread    fread
#define ft_fseek    fseek
#define ft_ftell    ftell
#define ft_sprintf  sprintf
这些是输入输出的接口

个人感觉,需要移植的接口就是以上内容,现在的问题是要如何将那些源码加载到工程中
尽管我在Docs文件加下打开了一个叫做INSTALL.any的文件
里面提示了如何添加源码,但是我按照其操作依然错误很多,有些想放弃了。
* DO NOT COMPILE ALL C FILES!  Rather, compile the following ones.

    -- base components (required)

      src/base/ftsystem.c
      src/base/ftinit.c
      src/base/ftdebug.c

      src/base/ftbase.c

      src/base/ftbbox.c       -- recommended, see <freetype/ftbbox.h>
      src/base/ftglyph.c      -- recommended, see <freetype/ftglyph.h>

      src/base/ftbdf.c        -- optional, see <freetype/ftbdf.h>
      src/base/ftbitmap.c     -- optional, see <freetype/ftbitmap.h>
      src/base/ftcid.c        -- optional, see <freetype/ftcid.h>
      src/base/ftfstype.c     -- optional
      src/base/ftgasp.c       -- optional, see <freetype/ftgasp.h>
      src/base/ftgxval.c      -- optional, see <freetype/ftgxval.h>
      src/base/ftlcdfil.c     -- optional, see <freetype/ftlcdfil.h>
      src/base/ftmm.c         -- optional, see <freetype/ftmm.h>
      src/base/ftotval.c      -- optional, see <freetype/ftotval.h>
      src/base/ftpatent.c     -- optional
      src/base/ftpfr.c        -- optional, see <freetype/ftpfr.h>
      src/base/ftstroke.c     -- optional, see <freetype/ftstroke.h>
      src/base/ftsynth.c      -- optional, see <freetype/ftsynth.h>
      src/base/fttype1.c      -- optional, see <freetype/t1tables.h>
      src/base/ftwinfnt.c     -- optional, see <freetype/ftwinfnt.h>
      src/base/ftxf86.c       -- optional, see <freetype/ftxf86.h>

      src/base/ftmac.c        -- only on the Macintosh

    -- font drivers (optional; at least one is needed)

      src/bdf/bdf.c           -- BDF font driver
      src/cff/cff.c           -- CFF/OpenType font driver
      src/cid/type1cid.c      -- Type 1 CID-keyed font driver
      src/pcf/pcf.c           -- PCF font driver
      src/pfr/pfr.c           -- PFR/TrueDoc font driver
      src/sfnt/sfnt.c         -- SFNT files support
                                 (TrueType & OpenType)
      src/truetype/truetype.c -- TrueType font driver
      src/type1/type1.c       -- Type 1 font driver
      src/type42/type42.c     -- Type 42 font driver
      src/winfonts/winfnt.c   -- Windows FONT / FNT font driver

    -- rasterizers (optional; at least one is needed for vector
       formats)

      src/raster/raster.c     -- monochrome rasterizer
      src/smooth/smooth.c     -- anti-aliasing rasterizer

    -- auxiliary modules (optional)

      src/autofit/autofit.c   -- auto hinting module
      src/cache/ftcache.c     -- cache sub-system (in beta)
      src/gzip/ftgzip.c       -- support for compressed fonts (.gz)
      src/lzw/ftlzw.c         -- support for compressed fonts (.Z)
      src/gxvalid/gxvalid.c   -- TrueTypeGX/AAT table validation
      src/otvalid/otvalid.c   -- OpenType table validation
      src/psaux/psaux.c       -- PostScript Type 1 parsing
      src/pshinter/pshinter.c -- PS hinting module
      src/psnames/psnames.c   -- PostScript glyph names support


    Notes:

      `ftcache.c'  needs `ftglyph.c'
      `ftfstype.c' needs `fttype1.c'
      `ftglyph.c'  needs `ftbitmap.c'
      `ftstroke.c' needs `ftglyph.c'
      `ftsynth.c'  needs `ftbitmap.c'

      `cff.c'      needs `sfnt.c', `pshinter.c', and `psnames.c'
      `truetype.c' needs `sfnt.c' and `psnames.c'
      `type1.c'    needs `psaux.c' `pshinter.c', and `psnames.c'
      `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c'
      `type42.c'   needs `truetype.c'



感觉把下面这些接口实现了就可以操作 freetype了, 21ic 上面有朋友把fatfs弄上去整合就可以用了:

#define ft_fclose   fclose
#define ft_fopen    fopen
#define ft_fread    fread
#define ft_fseek    fseek
#define ft_ftell    ftell
#define ft_sprintf  sprintf
这些是输入输出的接口




14楼:

经过三个晚上的努力终于在stm32+ucgui+sdio上成功移植FreeType2,下面是几张照片,字库是从电脑上拷贝的SIMFANG.TTF
文件系统用的是Fatfs,不过FreeType2需要开辟很大的堆空间,目前还没找到好的优化方法,移植了个FT2,ucgui我只分配了5K的动态内存,


还带旋转:
freetype_fatfs.jpg





离线

#13 2018-12-25 12:59:23

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,138
积分: 1090.5

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

晕哥 说:

http://bbs.21ic.com/icview-586134-1-1.html

今天发现了Freetype与文件系统相关的接口定义
在ftstdlib.h 这个头中

#include <string.h>

#define ft_memchr   memchr
#define ft_memcmp   memcmp
#define ft_memcpy   memcpy
#define ft_memmove  memmove
#define ft_memset   memset
#define ft_strcat   strcat
#define ft_strcmp   strcmp
#define ft_strcpy   strcpy
#define ft_strlen   strlen
#define ft_strncmp  strncmp
#define ft_strncpy  strncpy
#define ft_strrchr  strrchr
#define ft_strstr   strstr
这些是内存管理

#include <stdio.h>

#define FT_FILE     FILE
#define ft_fclose   fclose
#define ft_fopen    fopen
#define ft_fread    fread
#define ft_fseek    fseek
#define ft_ftell    ftell
#define ft_sprintf  sprintf
这些是输入输出的接口

个人感觉,需要移植的接口就是以上内容,现在的问题是要如何将那些源码加载到工程中
尽管我在Docs文件加下打开了一个叫做INSTALL.any的文件
里面提示了如何添加源码,但是我按照其操作依然错误很多,有些想放弃了。
* DO NOT COMPILE ALL C FILES!  Rather, compile the following ones.

    -- base components (required)

      src/base/ftsystem.c
      src/base/ftinit.c
      src/base/ftdebug.c

      src/base/ftbase.c

      src/base/ftbbox.c       -- recommended, see <freetype/ftbbox.h>
      src/base/ftglyph.c      -- recommended, see <freetype/ftglyph.h>

      src/base/ftbdf.c        -- optional, see <freetype/ftbdf.h>
      src/base/ftbitmap.c     -- optional, see <freetype/ftbitmap.h>
      src/base/ftcid.c        -- optional, see <freetype/ftcid.h>
      src/base/ftfstype.c     -- optional
      src/base/ftgasp.c       -- optional, see <freetype/ftgasp.h>
      src/base/ftgxval.c      -- optional, see <freetype/ftgxval.h>
      src/base/ftlcdfil.c     -- optional, see <freetype/ftlcdfil.h>
      src/base/ftmm.c         -- optional, see <freetype/ftmm.h>
      src/base/ftotval.c      -- optional, see <freetype/ftotval.h>
      src/base/ftpatent.c     -- optional
      src/base/ftpfr.c        -- optional, see <freetype/ftpfr.h>
      src/base/ftstroke.c     -- optional, see <freetype/ftstroke.h>
      src/base/ftsynth.c      -- optional, see <freetype/ftsynth.h>
      src/base/fttype1.c      -- optional, see <freetype/t1tables.h>
      src/base/ftwinfnt.c     -- optional, see <freetype/ftwinfnt.h>
      src/base/ftxf86.c       -- optional, see <freetype/ftxf86.h>

      src/base/ftmac.c        -- only on the Macintosh

    -- font drivers (optional; at least one is needed)

      src/bdf/bdf.c           -- BDF font driver
      src/cff/cff.c           -- CFF/OpenType font driver
      src/cid/type1cid.c      -- Type 1 CID-keyed font driver
      src/pcf/pcf.c           -- PCF font driver
      src/pfr/pfr.c           -- PFR/TrueDoc font driver
      src/sfnt/sfnt.c         -- SFNT files support
                                 (TrueType & OpenType)
      src/truetype/truetype.c -- TrueType font driver
      src/type1/type1.c       -- Type 1 font driver
      src/type42/type42.c     -- Type 42 font driver
      src/winfonts/winfnt.c   -- Windows FONT / FNT font driver

    -- rasterizers (optional; at least one is needed for vector
       formats)

      src/raster/raster.c     -- monochrome rasterizer
      src/smooth/smooth.c     -- anti-aliasing rasterizer

    -- auxiliary modules (optional)

      src/autofit/autofit.c   -- auto hinting module
      src/cache/ftcache.c     -- cache sub-system (in beta)
      src/gzip/ftgzip.c       -- support for compressed fonts (.gz)
      src/lzw/ftlzw.c         -- support for compressed fonts (.Z)
      src/gxvalid/gxvalid.c   -- TrueTypeGX/AAT table validation
      src/otvalid/otvalid.c   -- OpenType table validation
      src/psaux/psaux.c       -- PostScript Type 1 parsing
      src/pshinter/pshinter.c -- PS hinting module
      src/psnames/psnames.c   -- PostScript glyph names support


    Notes:

      `ftcache.c'  needs `ftglyph.c'
      `ftfstype.c' needs `fttype1.c'
      `ftglyph.c'  needs `ftbitmap.c'
      `ftstroke.c' needs `ftglyph.c'
      `ftsynth.c'  needs `ftbitmap.c'

      `cff.c'      needs `sfnt.c', `pshinter.c', and `psnames.c'
      `truetype.c' needs `sfnt.c' and `psnames.c'
      `type1.c'    needs `psaux.c' `pshinter.c', and `psnames.c'
      `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c'
      `type42.c'   needs `truetype.c'



感觉把下面这些接口实现了就可以操作 freetype了, 21ic 上面有朋友把fatfs弄上去整合就可以用了:

#define ft_fclose   fclose
#define ft_fopen    fopen
#define ft_fread    fread
#define ft_fseek    fseek
#define ft_ftell    ftell
#define ft_sprintf  sprintf
这些是输入输出的接口




14楼:

经过三个晚上的努力终于在stm32+ucgui+sdio上成功移植FreeType2,下面是几张照片,字库是从电脑上拷贝的SIMFANG.TTF
文件系统用的是Fatfs,不过FreeType2需要开辟很大的堆空间,目前还没找到好的优化方法,移植了个FT2,ucgui我只分配了5K的动态内存,


还带旋转:
https://whycan.cn/files/members/3/freetype_fatfs.jpg

谢谢晕哥,我已经用xboot的标准C库跑了起来,显示中文正常了

离线

#14 2018-12-25 14:49:05

a32425262
会员
注册时间: 2018-05-06
已发帖子: 104
积分: 401

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

给力给力,学习了

离线

楼主 #15 2019-01-14 21:57:26

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

/**
 * @file lv_freetype.c
 * 
 */

/*********************
 *      INCLUDES
 *********************/
#include "lv_freetype.h"
#include "lv_font.h"
#include <wchar.h>
#include <pthread.h>

static pthread_mutex_t ft_mutex = PTHREAD_MUTEX_INITIALIZER;

/**
 * Freetype2 set fonts size
 */
uint8_t lv_font_size(uint8_t sz)
{
	static uint8_t size=0;
	
	if( 0 == sz || size == sz ) {
		// printf("[debug] size = %d\n", size);
		return size;
	}
	pthread_mutex_lock( &ft_mutex);
	size = sz;
	
	FT_Set_Pixel_Sizes( lv_font_freetype2.handle.face, size, 0 );
	pthread_mutex_unlock( &ft_mutex);
	// printf("[debug] size = %d\n", size);
	
	return size;
}
/**
 * Initialize the built-in fonts
 */
void lv_font_init_freetype2(char *fontname)
{
	int error;
	if( fontname == NULL )
		return ;
	pthread_mutex_lock( &ft_mutex);
	lv_font_freetype2.handle.ft_path = fontname;
	printf("%s < %s\n", __func__, lv_font_freetype2.handle.ft_path);
	error = FT_Init_FreeType( &lv_font_freetype2.handle.library ); /* initialize library */
	
	error = FT_New_Face( lv_font_freetype2.handle.library, lv_font_freetype2.handle.ft_path, 0, &lv_font_freetype2.handle.face );

	pthread_mutex_unlock( &ft_mutex);
	lv_font_size(24);
}


/**
 * Generic bitmap get function used in 'font->get_bitmap' when the font contains all characters in the range
 * @param font pointer to font
 * @param unicode_letter an unicode letter which bitmap should be get
 * @return pointer to the bitmap or NULL if not found
 */
static uint32_t last_letter = 0;
const uint8_t * lv_font_get_bitmap_freetype2(const lv_font_t * font, uint32_t unicode_letter)
{
	pthread_mutex_lock( &ft_mutex);
	FT_GlyphSlot  slot;
	int error;
	slot = lv_font_freetype2.handle.face->glyph;
	if( last_letter == unicode_letter ) {
		lv_font_freetype2.handle.top =  slot->bitmap_top;
		pthread_mutex_unlock( &ft_mutex);
		// printf("%x [ %c%c%c ] < top %d left %d row %d col %d >\n", unicode_letter, unicode_letter&0xff, unicode_letter>>8, unicode_letter>>16, slot->bitmap_top, slot->bitmap_left, slot->bitmap.rows, slot->bitmap.width);
		return slot->bitmap.buffer;
	}
	last_letter = unicode_letter;
	error = FT_Load_Char( lv_font_freetype2.handle.face, unicode_letter, FT_LOAD_RENDER );
	if (error)
	{
		printf("FT_Load_Char error\n");
		pthread_mutex_unlock( &ft_mutex);
		return NULL;
	}
	lv_font_freetype2.handle.top =  slot->bitmap_top;

	pthread_mutex_unlock( &ft_mutex);
    return slot->bitmap.buffer;
}

/**
 * Generic glyph width get function used in 'font->get_width' when the font contains all characters in the range
 * @param font pointer to font
 * @param unicode_letter an unicode letter which width should be get
 * @return width of the gylph or -1 if not found
 */
const int16_t lv_font_get_width_freetype2(const lv_font_t * font, uint32_t unicode_letter)
{
	pthread_mutex_lock( &ft_mutex);
	FT_GlyphSlot  slot;
	int error;
	slot = lv_font_freetype2.handle.face->glyph;
	if( last_letter == unicode_letter ) {
		pthread_mutex_unlock( &ft_mutex);
		if( slot->bitmap.width == 0 ) {
			if( unicode_letter == 0x09 )
				return lv_font_size(0)*2;
			else
				return lv_font_size(0)/2;
		}
		return slot->bitmap.width;
	}
	last_letter = unicode_letter;
	error = FT_Load_Char( lv_font_freetype2.handle.face, unicode_letter, FT_LOAD_RENDER );
	if (error)
	{
		printf("FT_Load_Char error\n");
		pthread_mutex_unlock( &ft_mutex);
		return 0;
	}

	// for get rows
	lv_font_freetype2.h_px = lv_font_size(0); // slot->bitmap.rows;
	lv_font_freetype2.bpp = 8;
	
	pthread_mutex_unlock( &ft_mutex);
	if( slot->bitmap.width == 0 ) {
		if( unicode_letter == 0x09 )
			return lv_font_size(0)*2;
		else
			return lv_font_size(0)/2;
	}
    return slot->bitmap.width;
}

lv_font_t lv_font_freetype2 = {	
    .unicode_first = 0,    /*First Unicode letter in this font*/
    .unicode_last = 0,    /*Last Unicode letter in this font*/
    .h_px = 0,             /*Font height in pixels*/
    .glyph_bitmap = NULL, /*Bitmap of glyphs*/
    .glyph_dsc = NULL,       /*Description of glyphs*/
    .unicode_list = NULL,   /*Every character in the font from 'unicode_first' to 'unicode_last'*/
    .get_bitmap = lv_font_get_bitmap_freetype2,    /*Function pointer to get glyph's bitmap*/
    .get_width = lv_font_get_width_freetype2,  /*Function pointer to get glyph's width*/
    .bpp = 8,               /*Bit per pixel*/
    .type = FONT_TYPE_BUILT_FREETYPE2,
    .handle.ft_size = lv_font_size,
    .next_page = NULL,      /*Pointer to a font extension*/
};

以上是 @assert 发给我的release_static_freetype.c 代码.





离线

#16 2019-01-17 15:59:24

KingJin
会员
注册时间: 2018-04-12
已发帖子: 106
积分: 101

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

之前在ucgui 上移植过freetype,其实不麻烦

离线

#17 2019-01-17 16:52:10

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

LittlevGL + RT-Thread + FreeType
修改LV部分代码,显示没问题
IMG_20190117_114320.jpg

最近编辑记录 yywyai (2019-01-17 16:55:19)

离线

#18 2019-01-17 16:59:20

山无棱
会员
注册时间: 2017-10-23
已发帖子: 116
积分: 116

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

这个厉害了, STM32F7/STM32H7 吗?

离线

#19 2019-01-17 17:01:17

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

GD32F450

离线

#20 2019-01-17 17:04:02

basicdev
会员
注册时间: 2017-10-02
已发帖子: 159
积分: 159

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

yywyai 说:

GD32F450

方便分享 littlevgl 与 fretype 对接的代码吗?

离线

#21 2019-01-17 17:17:53

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

最近编辑记录 yywyai (2019-01-17 17:20:21)

离线

楼主 #22 2019-01-17 17:25:24

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

yywyai 说:

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

非常感谢分享!





离线

#23 2019-01-17 19:15:13

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

LittlevGL 在 RT-Thread 下的显示驱动在 http://bbs.21ic.com/icview-2617900-1-1.html

离线

#24 2019-01-17 19:18:24

smartcar
会员
注册时间: 2018-02-19
已发帖子: 735
积分: 735

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

yywyai 说:

LittlevGL 在 RT-Thread 下的显示驱动在 http://bbs.21ic.com/icview-2617900-1-1.html

优秀!学习!

离线

#25 2019-01-31 11:58:40

mathildawyx
会员
注册时间: 2019-01-31
已发帖子: 2
积分: 2

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

yywyai 说:

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

请问这样的话渲染后的字体文件是用freetype得到bitmap后再通过结构体中的get_bitmap被使用吗?

离线

#26 2019-02-27 15:16:18

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

mathildawyx 说:
yywyai 说:

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

请问这样的话渲染后的字体文件是用freetype得到bitmap后再通过结构体中的get_bitmap被使用吗?

littlevgl 5.2 5.3中是先调用get_width,然后调用get_bitmap,所以可以在get_width中获得bitmap

离线

#27 2019-03-06 18:07:59

mathildawyx
会员
注册时间: 2019-01-31
已发帖子: 2
积分: 2

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

是这样没错,但因为Littlevgl在显示期间会多次获取width,这样其实一个字也load了好几次呢 smile

yywyai 说:
mathildawyx 说:
yywyai 说:

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

请问这样的话渲染后的字体文件是用freetype得到bitmap后再通过结构体中的get_bitmap被使用吗?

littlevgl 5.2 5.3中是先调用get_width,然后调用get_bitmap,所以可以在get_width中获得bitmap

离线

#28 2019-03-10 11:09:22

tink
会员
注册时间: 2019-03-09
已发帖子: 32
积分: 32

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

mark

离线

#29 2019-03-14 09:37:49

yt101
会员
注册时间: 2019-03-13
已发帖子: 1
积分: 1

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

mark一下,      LittlevGL 是怎么调用FreeType2的?   能不能说下 步骤?  不胜感激!谢谢!

离线

#30 2019-04-10 00:01:34

Hinsun
会员
注册时间: 2019-04-09
已发帖子: 2
积分: 2

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

yywyai 说:

static const uint8_t*
lv_font_get_bitmap_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{   
  return bitmap;
}

static int16_t
lv_font_get_width_freetype(const struct _lv_font_struct *font, uint32_t unicode_letter)
{
  /*Check the range*/
  if(unicode_letter < font->unicode_first || unicode_letter > font->unicode_last) return -1;
   
  FT_Error err  = FT_Load_Char(face, unicode_letter, FT_LOAD_RENDER);
  if (err == 0) {
    lv_font_freetype.bpp = 8;
    lv_font_freetype.bitmap_dx = face->glyph->bitmap_left;
    lv_font_freetype.bitmap_dy = lv_font_freetype.monospace - face->glyph->bitmap_top;
    lv_font_freetype.bitmap_row = face->glyph->bitmap.rows;
    bitmap = face->glyph->bitmap.buffer;
   
    return face->glyph->bitmap.width;
  }

  bitmap = NULL;
  return -1;
}

代码很简单的,但是修改了部分的LV代码

你好,感谢你的分享,请教下littlevgl修改的部分是?最近也在移植中文显示,借鉴下楼主的方法。谢谢。

离线

#31 2019-04-10 13:59:04

yywyai
会员
注册时间: 2019-01-17
已发帖子: 64
积分: 104

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

不修改也可以的。

你好,感谢你的分享,请教下littlevgl修改的部分是?最近也在移植中文显示,借鉴下楼主的方法。谢谢。

离线

#32 2019-05-13 08:33:02

oldersu
会员
注册时间: 2019-05-09
已发帖子: 50
积分: 50

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

freetype好用吗?最近也再搞字库

离线

#33 2019-05-24 19:12:46

oldersu
会员
注册时间: 2019-05-09
已发帖子: 50
积分: 50

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

晕哥,移植这个freetype的源码能提供下吗?最近也在移植,没有思路

离线

楼主 #34 2019-05-25 20:45:34

晕哥
管理员
注册时间: 2017-09-06
已发帖子: 9,343
积分: 9202

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

oldersu 说:

晕哥,移植这个freetype的源码能提供下吗?最近也在移植,没有思路

https://whycan.cn/t_741.html
https://whycan.cn/t_2475.html





离线

#35 2020-01-12 11:50:00

我思故我在
会员
注册时间: 2019-09-03
已发帖子: 244
积分: 243.5

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

lilo 说:

对接是指如何调用吗?
调用方法可以参考晕哥这个帖子: https://whycan.cn/t_741.html

文件系统改改代码估计未必需要, 把需要的字扣出来, 存到另外一个 ttf 文件里面, 然后把文件存数组。

剪裁ttf字库可以参考 中科世为 这个套路: https://developer.flythings.cn/docs/zh/font_cut_tool

噢, 这个好思路, 正愁我的微软雅黑太大呢, 其实也就用几个字而已。

离线

#36 2020-01-12 22:23:19

好想做个有钱人
会员
注册时间: 2019-12-19
已发帖子: 40
积分: 40

Re: @assert 分享的在littlevgl 调用freetye显示文字, 而不用通过字模软件生成

lilo 说:

对接是指如何调用吗?
调用方法可以参考晕哥这个帖子: https://whycan.cn/t_741.html

文件系统改改代码估计未必需要, 把需要的字扣出来, 存到另外一个 ttf 文件里面, 然后把文件存数组。

剪裁ttf字库可以参考 中科世为 这个套路: https://developer.flythings.cn/docs/zh/font_cut_tool

链接炸了, 不知道这个能不能用: https://blog.csdn.net/DumpDoctorWang/article/details/86704625

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn