// test.c
// gcc -o test test.c `freetype-config --cflags` `freetype-config --libs`
#include <freetype2/ft2build.h>
#include <freetype2/freetype.h>
static FT_Library library;
static FT_Face face;
int LoadChar(wchar_t cvalue, int textsize, int *x, int* bitmap_left,
int* bitmap_top, int* rows, int* width, unsigned char** buf)
{
int ret = FT_Load_Char(face, cvalue, FT_LOAD_RENDER); //0=SUCCESS, otherwise=FAIL
*x = face->glyph->advance.x;
*bitmap_left = face->glyph->bitmap_left;
*bitmap_top = face->glyph->bitmap_top;
*rows = face->glyph->bitmap.rows;
*width = face->glyph->bitmap.width;
*buf = face->glyph->bitmap.buffer;
printf("%s(%s)\n", __FILE__, __FUNCTION__);
printf("-------------------------\n");
printf("%15s = %ld\n", "advance.x", face->glyph->advance.x);
printf("%15s = %d\n", "bitmap_left", face->glyph->bitmap_left);
printf("%15s = %d\n", "bitmap_top", face->glyph->bitmap_top);
printf("%15s = %d\n", "bitmap.rows", face->glyph->bitmap.rows);
printf("%15s = %d\n", "bitmap.width", face->glyph->bitmap.width);
printf("%15s = %ld\n", "bitmap.buffer", sizeof(face->glyph->bitmap.buffer));
printf("%15s = %ld\n", "bitmap_buffer", strlen(face->glyph->bitmap.buffer));
printf("-------------------------\n");
unsigned char* buffer;
buffer = face->glyph->bitmap.buffer;
int i=0, j=0;
int height = *rows;
int wid = *width;
for(j = 0; j < height; j++)
{
for(i = 0; i < wid ; i++)
{
printf("%02x ", buffer[i + wid*j]);
}
printf("\n");
}
return 1;
}
int main(int argc, char** argv)
{
printf("%s(%s)\n", __FILE__, __FUNCTION__);
int bError = FT_Init_FreeType(&library);
if(bError) return 0;
bError = FT_New_Face(library,(char*)"[ins]/mnt/hgfs/D/Downloads/msyh.ttf[/ins]",0, &face);
if(bError) return 0;
int textHeight = 20;
FT_Set_Pixel_Sizes(face, textHeight, 0);
int left, top, rows, width, x;
unsigned char* buf;
wchar_t ch = 'W';
LoadChar(ch, textHeight, &x, &left, &top, &rows, &width, &buf);
return 0;
}
W输出:
hexing@ubuntu:/tmp$ ./test
test.c(main)
test.c(LoadChar)
-------------------------
advance.x = 1280
bitmap_left = 0
bitmap_top = 15
bitmap.rows = 15
bitmap.width = 20
bitmap.buffer = 8
bitmap_buffer = 3
-------------------------
de ff 1f 00 00 00 00 00 29 ff ff 29 00 00 00 00 00 1e ff dd
9a ff 5d 00 00 00 00 00 7a ff ff 7b 00 00 00 00 00 5b ff 99
56 ff 9b 00 00 00 00 00 cc ff ff cd 00 00 00 00 00 98 ff 55
13 fd d9 00 00 00 00 1e ff e3 e7 ff 1f 00 00 00 00 d5 fd 12
00 cd ff 18 00 00 00 6f ff a6 af ff 71 00 00 00 13 fe cc 00
00 89 ff 56 00 00 00 c0 ff 50 5a ff c3 00 00 00 4e ff 88 00
00 45 ff 94 00 00 15 fc f0 07 0b f4 fd 17 00 00 8b ff 44 00
00 08 f7 d2 00 00 63 ff 9e 00 00 a5 ff 67 00 00 c8 f7 08 00
00 00 bc fe 12 00 b5 ff 44 00 00 4b ff b9 00 0a fa bb 00 00
00 00 78 ff 4f 0d f8 e7 03 00 00 05 ec fa 10 42 ff 77 00 00
00 00 34 ff 8d 58 ff 91 00 00 00 00 97 ff 5e 7e ff 33 00 00
00 00 02 ed c7 a7 ff 38 00 00 00 00 3c ff ae b9 ec 02 00 00
00 00 00 ab ee e9 de 00 00 00 00 00 01 e0 ea e9 aa 00 00 00
00 00 00 67 ff ff 85 00 00 00 00 00 00 88 ff ff 66 00 00 00
00 00 00 22 ff ff 2c 00 00 00 00 00 00 2d ff ff 22 00 00 00
T输出:
hexing@ubuntu:/tmp$ ./test
test.c(main)
test.c(LoadChar)
-------------------------
advance.x = 704
bitmap_left = 1
bitmap_top = 15
bitmap.rows = 15
bitmap.width = 10
bitmap.buffer = 8
bitmap_buffer = 20
-------------------------
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
00 00 00 00 ff ff 00 00 00 00
在线
stm32上能用不?
离线
stm32上能用不?
我见多F4的项目用了。随着现在芯片越来越强大越来越便宜,矢量字体应该会流行
离线
stm32上 字体太大时 耗时好多啊
比如正常的一个循环延时100ms用delay_ms(100),但是绘大字体后,delay_ms(90),才能让一个循环是100ms
离线
谢谢分享!
离线
文件下载: freetype-2_9_1_20190125.7z
工程路径: freetype-2.9.1\builds\windows\vc2010\freetype.sln
可以用 VC2015 打开/编译/调试
离线
@晕哥,你这个demo有两个问题请教:
1、FT_Set_Pixel_Sizes(face, textHeight, 0); 这里应该是笔误哈,textHeight和0这两个参数位置要互换?
2、设置的像素高度为20px,但为什么字模点阵里面只有16行的高呢?
是不是freetype有特殊处理,只获取了字的完全高度?如果我想把转换为20px的点阵,有接口支持么?谢谢。
离线
这生成的点阵数据和16位置是什么对应关系?
按照这个数据描点,文字有毛刺
离线
晕哥,请教下,Makefile不是很懂,这两个是什么作用'freetype-config --cflags` `freetype-config --libs`
离线
晕哥,请教下,Makefile不是很懂,这两个是什么作用'freetype-config --cflags` `freetype-config --libs`
用来生成这个命令行: gcc -o test test.c `freetype-config --cflags` `freetype-config --libs`
$ freetype-config --cflags --libs
-I/usr/include/freetype2 -I/usr/include/libpng16 -lfreetype
$ pkg-config freetype2 --cflags --libs
-I/usr/include/freetype2 -I/usr/include/libpng16 -lfreetype
其实 /usr/bin/freetype-config 就是一个脚本, 实际上还是调用 pkg-config:
$ whereis freetype-config
freetype-config: /usr/bin/freetype-config /usr/share/man/man1/freetype-config.1.gz
$ cat /usr/bin/freetype-config
#! /bin/sh
#
# Copyright 2000-2017 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.
LC_ALL=C
export LC_ALL
# if `pkg-config' is available, use values from `freetype2.pc'
/usr/bin/pkg-config --atleast-pkgconfig-version 0.24 >/dev/null 2>&1
if test $? -eq 0 ; then
# note that option `--variable' is not affected by the
# PKG_CONFIG_SYSROOT_DIR environment variable
if test "x$SYSROOT" != "x" ; then
PKG_CONFIG_SYSROOT_DIR="$SYSROOT"
export PKG_CONFIG_SYSROOT_DIR
fi
prefix=`/usr/bin/pkg-config --variable prefix freetype2`
exec_prefix=`/usr/bin/pkg-config --variable exec_prefix freetype2`
includedir=`/usr/bin/pkg-config --variable includedir freetype2`
libdir=`/usr/bin/pkg-config --variable libdir freetype2`
version=`/usr/bin/pkg-config --modversion freetype2`
cflags=`/usr/bin/pkg-config --cflags freetype2`
dynamic_libs=`/usr/bin/pkg-config --libs freetype2`
static_libs=`/usr/bin/pkg-config --static --libs freetype2`
else
prefix="/usr"
exec_prefix="/usr"
includedir="/usr/include"
version=21.0.15
cflags="-I${SYSROOT}$includedir/freetype2"
dynamic_libs="-lfreetype"
static_libs="-lfreetype -lz -lpng16 -lm -lz -lm -lz"
fi
orig_prefix=$prefix
orig_exec_prefix=$exec_prefix
orig_includedir=$includedir
include_suffix=`echo $includedir | sed "s|$prefix||"`
usage()
{
cat <<EOF
Usage: freetype-config [OPTION]...
Get FreeType compilation and linking information.
Options:
--prefix display \`--prefix' value used for building the
FreeType library
--prefix=PREFIX override \`--prefix' value with PREFIX
--exec-prefix display \`--exec-prefix' value used for building
the FreeType library
--exec-prefix=EPREFIX override \`--exec-prefix' value with EPREFIX
--version display libtool version of the FreeType library
--ftversion display FreeType version number
--libs display flags for linking with the FreeType library
--libtool display library name for linking with libtool
--cflags display flags for compiling with the FreeType
library
--static make command line options display flags
for static linking
--help display this help and exit
EOF
exit $1
}
if test $# -eq 0 ; then
usage 1 1>&2
fi
while test $# -gt 0 ; do
case "$1" in
-*=*)
optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
;;
*)
optarg=
;;
esac
case $1 in
--prefix=*)
prefix=$optarg
local_prefix=yes
;;
--prefix)
echo_prefix=yes
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
local_prefix=yes
;;
--exec-prefix)
echo_exec_prefix=yes
;;
--version)
echo_version=yes
break
;;
--ftversion)
echo_ft_version=yes
;;
--cflags)
echo_cflags=yes
;;
--libs)
echo_libs=yes
;;
--libtool)
echo 2>&1 "The use of libfreetype6.la is deprecated in Debian."
exit 1
;;
--static)
show_static=yes
;;
--help)
usage 0
;;
*)
usage 1 1>&2
;;
esac
shift
done
if test "$local_prefix" = "yes" ; then
if test "$exec_prefix_set" != "yes" ; then
exec_prefix=$prefix
fi
fi
if test "$local_prefix" = "yes" ; then
includedir=${prefix}${include_suffix}
fi
if test "$echo_version" = "yes" ; then
echo $version
fi
if test "$echo_prefix" = "yes" ; then
echo ${SYSROOT}$prefix
fi
if test "$echo_exec_prefix" = "yes" ; then
echo ${SYSROOT}$exec_prefix
fi
if test "$echo_ft_version" = "yes" ; then
major=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
| grep FREETYPE_MAJOR \
| sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'`
minor=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
| grep FREETYPE_MINOR \
| sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'`
patch=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
| grep FREETYPE_PATCH \
| sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'`
echo $major.$minor.$patch
fi
if test "$echo_cflags" = "yes" ; then
echo $cflags | sed "s|$orig_includedir/freetype2|$includedir/freetype2|"
fi
if test "$echo_libs" = "yes" ; then
if test "$show_static" = "yes" ; then
libs="$static_libs"
else
libs="$dynamic_libs"
fi
echo $libs
fi
# EOF
在线
懂了,谢谢晕哥!!!
离线
感觉不错,不知道整个代码有多大,可以考虑下代价。
离线