рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЖрдзреБрдирд┐рдХ рдкрд╛рда рдкреНрд░рддрд┐рдкрд╛рджрди: рднрд╛рдЧ 1

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

рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо 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 .*****. .********. .********* . ***. *** *** .******** *********** .**. *** *** *** *** *** ***. *** .*********** *********** .*******.. 

тЖТ рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдордиреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдмреЗрд╕рд┐рдХ рдХреИрд░реЗрдХреНрдЯрд░ рд░реЗрдВрдбрд░ рдмрдирд╛рдпрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдореЛрдЬреА, рд╕рдм-рдкрд┐рдХреНрд╕реЗрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ, рд▓рд┐рдЧрдЪрд░ рдФрд░ рдЕрдиреНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирдЬреАрдПрд▓ рдЯреЗрдХреНрд╕рдЪрд░ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░) рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрд▓рд╕реАрдбреА рд╕рдмрдкрд┐рдХреНрд╕рд▓ рд╕реНрдореВрджрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдЧреНрд░реЗ, рдЙрдирдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рд░рдВрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИред

рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi461497/


All Articles