рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдЯреЗрдХреНрд╕реНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдЪрд░рд┐рддреНрд░ рдпрд╛ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдзреБрдирд┐рдХ рдкрд╛рда рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирддрд╛ рд╣реВрдВред
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо FreeType рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддреАрдХ рд░реЗрдВрдбрд░рд░ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗред рдФрд░
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИред
рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯрдЕрдк
- рдореЗрд░рд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо:
Ubuntu 18.04.2 LTS (bionic)
- рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░:
clang version 6.0.0-1ubuntu2
рдлреНрд░реА рдЯрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
Ubuntu рдкрд░, рдЖрдкрдХреЛ FreeType рдФрд░ libpng рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
$ sudo apt install libfreetype6 libfreetype6-dev $ sudo apt install libpng16-16 libpng-dev
- рдореЗрд░реЗ рдкрд╛рд╕ FreeType рд╕рдВрд╕реНрдХрд░рдг
2.8.1-2ubuntu2
, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, FreeType-2.10.1
рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг FreeType-2.10.1
, рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- libpng рд╕рдВрд╕реНрдХрд░рдг
(1.6.34-1ubuntu0.18.04.2)
рдХрдВрд╕реЛрд▓ рд░реЗрдВрдбрд░рд░
C рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ main.c
)
#include <stdio.h> int main() { printf("Hello, world\n"); return 0; }
$ clang -Wall -Werror -o main main.c $ ./main Hello, world
рд╣рдо рдлреНрд░реА рдЯрд╛рдЗрдк рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
рд╢рд╛рдорд┐рд▓ рдкрде рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛рдиреА, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм FreeType рдХреЗ рд▓рд┐рдП
#include
рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЦреЛрдЬрддреЗ рд╣реИрдВ), рдЪрд▓рд╛рдПрдБ:
$ pkg-config --cflags freetype2 -I/usr/include/freetype2 -I/usr/include/libpng16
рд▓рд╛рдЗрди
-I/usr/include/freetype2 -I/usr/include/libpng16
рдореЗрдВ C рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ
-I/usr/include/freetype2 -I/usr/include/libpng16
рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
#include <stdio.h> #include <freetype2/ft2build.h> #include FT_FREETYPE_H int main() { printf("Hello, world\n"); return 0; }
$ clang -I/usr/include/freetype2 \ -I/usr/include/libpng16 \ -Wall -Werror \ -o main \ main.c $ ./main Hello, world
рд╣рдо FreeType рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ
main()
рдЕрдВрджрд░
main()
FreeType рдХреЛ
FT_Init_FreeType(&ft)
рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░реЗрдВ (рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ рддреЛ FreeType рдлрд╝рдВрдХреНрд╢рди 0 рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ)ред
(рдЕрдм рд╕реЗ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рдВрд╕
FreeType API рдХреА
рдорджрдж рд╕реЗ рд▓рд┐рдП рдЬрд╛рдПрдВрдЧреЗ)ред
FT_Library ft; FT_Error err = FT_Init_FreeType(&ft); if (err != 0) { printf("Failed to initialize FreeType\n"); exit(EXIT_FAILURE); }
рдлрд┐рд░ FT_Library_Version рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
FT_Int major, minor, patch; FT_Library_Version(ft, &major, &minor, &patch); printf("FreeType's version is %d.%d.%d\n", major, minor, patch);
рдпрджрд┐ рдЕрдВрддрд┐рдо рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд▓рд┐рдВрдХрд░ рддреНрд░реБрдЯрд┐ рдкреЙрдк рдЕрдк рд╣реЛрдЧреА:
/tmp/main-d41304.o: In function `main': main.c:(.text+0x14): undefined reference to `FT_Init_FreeType' main.c:(.text+0x54): undefined reference to `FT_Library_Version' clang: error: linker command failed with exit code 1 (use -v to see invocation)
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
-lfreetype
рдЬреЛрдбрд╝реЗрдВред
$ clang -I/usr/include/freetype2 \ -I/usr/include/libpng16 \ -Wall -Werror \ -o main \ -lfreetype \ main.c $ ./main FreeType's version is 2.8.1
рдлрд╝реЙрдиреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб
рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЪрд░рдг рдПрдХ рдлрд╝реЙрдиреНрдЯ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рдореИрдВ
ubuntu рдореЛрдиреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдПрдХ рдлрд╝реЙрдиреНрдЯ рдЪреЗрд╣рд░реЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг, рдПрдХ рдлрд╝реЙрдиреНрдЯ рдкрд░рд┐рд╡рд╛рд░ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЙрдиреНрдЯ рдХреЗ рдмреАрдЪ рд╕рдЯреАрдХ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП,
рдлреНрд░реА рдЯрд╛рдЗрдк рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВ ред
рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЛ
рдлреЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝реЙрдиреНрдЯ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ рдореЗрдВ рдХрдИ рдЪреЗрд╣рд░реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реЙрдиреНрдЯ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрд╣рд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 0 рдХрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ред
FT_Face face; err = FT_New_Face(ft, "./UbuntuMono.ttf", 0, &face); if (err != 0) { printf("Failed to load face\n"); exit(EXIT_FAILURE); }
рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВ
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо FreeType рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ рдмрддрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FreeType рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рдорд╛рди," рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 32px рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╡рд░реНрдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 10px рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ 16px рдХреА рдКрдБрдЪрд╛рдИ рдХреЗ рд╕рд╛рдеред
рдпрд╣ рдСрдкрд░реЗрд╢рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдлрд╝реЙрдиреНрдЯ рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрдореЛрдЬреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред
err = FT_Set_Pixel_Sizes(face, 0, 32); if (err != 0) { printf("Failed to set pixel size\n"); exit(EXIT_FAILURE); }
рдЪрд░рд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
рдлреНрд░реАрдЯрд╛рдЗрдк рдкреНрд░рд▓реЗрдЦрди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░реЗрдВред рдПрдХ рдкреНрд░рддреАрдХ рдПрдХ
рдЧреНрд▓рд┐рдлрд╝ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдПрдХ рдЪрд░рд┐рддреНрд░ рд╡рд╣ рд╣реИ рдЬреЛ
char
рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЧреНрд▓рд┐рдлрд╝ рдПрдХ рдЫрд╡рд┐ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрд╕ рдЪрд░рд┐рддреНрд░ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИред рдпрд╣ рд╕рдВрдмрдВрдз рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рд░ рдХрдИ рдЧреНрд▓рд┐рдлрд╝ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрд░реНрдерд╛рддреН рдЙрдЪреНрдЪрд╛рд░рдгред рдПрдХ рдЧреНрд▓рд┐рдлрд╝ рдХрдИ рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╡рд╣ рд╣реИ, рд▓рд┐рдЧреБрд░рд┐рдВрдЧреНрд╕, рдЬрд╣рд╛рдВ -> рдХреЛ рдПрдХрд▓ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЪрд░рд┐рддреНрд░ рдХреЗ рдЕрдиреБрд░реВрдк рдЧреНрд▓рд┐рдлрд╝ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
FT_Get_Char_Index
рдЙрдкрдпреЛрдЧ
FT_Get_Char_Index
ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдорд┐рд▓рд╛рди рд╡рд░реНрдг рдФрд░ рдЧреНрд▓рд┐рдлрд╝ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдПрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо
рд╣рд░реНрдлрд╝рдмрдЬрд╝ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВрдЧреЗред
FT_UInt glyph_index = FT_Get_Char_Index(face, 'a');
рдЪреЗрд╣рд░реЗ рд╕реЗ рдПрдХ рдЧреНрд▓рд┐рдлрд╝ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдЧреНрд▓рд┐рдлрд╝_рдЗрдВрдбреЗрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдЪреЗрд╣рд░реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧреНрд▓рд┐рдлрд╝ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рднрд╡рд┐рд╖реНрдп рдХреА рдХрд┐рд╕реНрдд рдореЗрдВ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдбрд╛рдЙрдирд▓реЛрдб рдлреНрд▓реИрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡реЗ рдЖрдкрдХреЛ рд╣рд┐рдиреНрдЯрд┐рдВрдЧ рдФрд░ рдмрд┐рдЯрдореИрдк рдлреЛрдВрдЯ рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗрдВрдЧреЗред
FT_Int32 load_flags = FT_LOAD_DEFAULT; err = FT_Load_Glyph(face, glyph_index, load_flags); if (err != 0) { printf("Failed to load glyph\n"); exit(EXIT_FAILURE); }
рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рдЧреНрд▓рд┐рдлрд╝ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ (рдЧреНрд▓рд┐рдлрд╝ рд╕реНрд▓реЙрдЯ)
рдЕрдм рд╣рдо рдЕрдВрдд рдореЗрдВ рдЕрдкрдиреЗ рдЧреНрд▓рд┐рдлрд╝ рдХреЛ рдЙрд╕рдХреЗ рдХрдВрдЯреЗрдирд░ (рд╕реНрд▓реЙрдЯ) рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ
face->glyph
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред
рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлреНрд▓реИрдЧ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрд▓рд╕реАрдбреА- (рдпрд╛ рд╕рдм-рдкрд┐рдХреНрд╕рд▓) рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдПрдВрдЯреАрд▓рд┐рдПрдЬрд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
FT_Int32 render_flags = FT_RENDER_MODE_NORMAL; err = FT_Render_Glyph(face->glyph, render_flags); if (err != 0) { printf("Failed to render the glyph\n"); exit(EXIT_FAILURE); }
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдг рдЖрдЙрдЯрдкреБрдЯ
рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЧреНрд▓рд┐рдлрд╝ рдХрд╛ рдмрд┐рдЯрдореИрдк
face->glyph->bitmap.buffer
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
face->glyph->bitmap.buffer
, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорд╛рди 0 рд╕реЗ 255 рддрдХ рд╣реЛрддрд╛ рд╣реИред
рдмрдлрд░ рдХреЛ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ 2D рдЫрд╡рд┐ рд╣реИред J-th рдХреЙрд▓рдо рдХреА i-th рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
column * row_width + row
рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐
bitmap.buffer[i * face->glyph->bitmap.pitch + j]
рдореЗрдВ рд╣реИред
bitmap.buffer[i * face->glyph->bitmap.pitch + j]
ред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд░реЗ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рд╣рдордиреЗ рдПрдХ рд▓реВрдк рдФрд░
bitmap.width
рдореЗрдВ
bitmap.width
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдХреНрд╕рд▓ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ
bitmap.width
рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдлрд░ рдХреА "рдЪреМрдбрд╝рд╛рдИ"
bitmap.pitch
ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ, рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдгреЛрдВ рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
for (size_t i = 0; i < face->glyph->bitmap.rows; i++) { for (size_t j = 0; j < face->glyph->bitmap.width; j++) { unsigned char pixel_brightness = face->glyph->bitmap.buffer[i * face->glyph->bitmap.pitch + j]; if (pixel_brightness > 169) { printf("*"); } else if (pixel_brightness > 84) { printf("."); } else { printf(" "); } } printf("\n"); }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯред
$ clang -I/usr/include/freetype2 \ -I/usr/include/libpng16 \ -Wall -Werror \ -o main \ -lfreetype \ main.c && ./main FreeType's version is 2.8.1 .*****. .********. .********* . ***. *** *** .******** *********** .**. *** *** *** *** *** ***. *** .*********** *********** .*******..
тЖТ рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИрдирд┐рд╖реНрдХрд░реНрд╖
рд╣рдордиреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдмреЗрд╕рд┐рдХ рдХреИрд░реЗрдХреНрдЯрд░ рд░реЗрдВрдбрд░ рдмрдирд╛рдпрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдореЛрдЬреА, рд╕рдм-рдкрд┐рдХреНрд╕реЗрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ, рд▓рд┐рдЧрдЪрд░ рдФрд░ рдЕрдиреНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирдЬреАрдПрд▓ рдЯреЗрдХреНрд╕рдЪрд░ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░) рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрд▓рд╕реАрдбреА рд╕рдмрдкрд┐рдХреНрд╕рд▓ рд╕реНрдореВрджрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдЧреНрд░реЗ, рдЙрдирдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рд░рдВрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИред
рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВред