freetype
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ft] Help finding glyphs in TTF files


From: Michael Franklin
Subject: Re: [ft] Help finding glyphs in TTF files
Date: Sat, 30 Mar 2013 18:44:49 -0700 (PDT)

I compiled with FT_DEBUG_LEVEL_TRACE to try and find out what's going on.  I 
know, I should have done that earlier, but I'm still trying to get familiar 
with this library.  Anyway, I'm getting the following messages for all of my 
fonts.

tt_face_build_cmaps: broken cmap sub-table ignored
tt_face_build_cmaps: unsupported cmap sub-table ignored

These two messages appear once or multiple times depending on the font file.  

Since I'm now suspecting my build as part of the problem, here's some more 
information that may be relevant.
Build computer: Windows 8 Pro
Tool chain: Sourcery CodeBench Lite (GCC 4.7.2) arm-none-eabi
IDE: CodeLite
Target: STM32F4 (ARM Cortex-m4)
Compiler flags:  arm-none-eabi-gcc -MD -Wall -mthumb -mcpu=cortex-m4 
-mtune=cortex-m4  
-mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mlittle-endian -ffunction-sections 
-fsingle-precision-constant -fmessage-length=0 -Wa,-EL
Defines:  FT2_BUILD_LIBRARY;FT_DEBUG_LEVEL_TRACE


Again, please offer your suggestions.

Thank you,
Mike



----- Original Message -----
From: suzuki toshiya <address@hidden>
To: Michael Franklin <address@hidden>
Cc: "address@hidden" <address@hidden>
Sent: Saturday, March 30, 2013 10:09 PM
Subject: Re: [ft] Help finding glyphs in TTF files

Hi,

What kind of text[] is passed to FT_Load_Char()?
And what kind of the error is returned?

Regards,
mpsuzuki

Michael Franklin wrote:
> 
> Hello,
> 
> First of all, let me say thanks for FreeType.  I was thrilled when text first 
> appeared (clean and crisp) on my embedded system for the fist time even if it 
> wasn't the text I hoped for.  And I'm hoping you can help me with that.
> 
> I'm creating an embedded system using a Cortex-M4 processor and the Sourcery 
> Codebench Lite (GCC 4.7.2) toolchain.
> 
> I'm trying to do a simple glyph to bitmap rendering as demonstrated in the 
> FreeType Tutorial 1.  I have successfully displayed glyphs from Verdana.ttf 
> (stolen from my Windows 8 computer) and FreeMono.ttf (stolen from my Mint 
> Linux computer).  However, with both of these fonts, I can't get the correct 
> glyphs unless I subtract 29 from the character code as shown below.
> 
> error = FT_Load_Char(face, text[i] - 29, FT_LOAD_RENDER);   //this works
> error = FT_Load_Char(face, text[i], FT_LOAD_RENDER);   //this doesn't work
> 
> Verdana.ttf reports 1 charmap (platform: 0, encoding: 1) and Mono.ttf reports 
> 0 charmaps, which also seems strange.
> 
> I also tried a few other fonts (Arial.ttf from my Windows 8 computer and a 
> few others), but they all return various errors after calling FT_Load_Char.  
> Sometimes FT_Err_Invalid_Opcode and sometimes FT_Err_ENDF_In_Exec_Stream 
> depending on the file.
> 
> At first I suspected my disk I/O routines, but these have all been working 
> well in my libpng port, so I'm fairly confident they are working well.  Also, 
>  FT_New_Face doesn't give me any errors.
> 
> Here's my source code.  Please let me know if you have any suggestions.
> 
> Thanks.
> 
> DrawText(const Point& p, const uint8_t size, const File& file, const Color& 
> color, const char* text, ...)
> {
>     FT_Library library;
> 
>     FT_Error error = FT_Init_FreeType(&library);
>     if (error)
>     {
>         printf("FT_Init_FreeType failed\r]n");
>         return;
>     }
> 
>     printf("FT_Init_FreeType finished\r\n");
> 
>     FT_Face face;
>     error = FT_New_Face( library, "/arialbi.ttf", 0, &face ); 
>     if ( error == FT_Err_Unknown_File_Format ) 
>     { 
>         printf("FT_New_Face failed\r\n");
>         //... the font file could be opened and read, but it appears 
>         //... that its font format is unsupported 
>     } 
>     else if ( error ) 
>     { 
>         printf("FT_New_Face failed 2: %d\r\n", error);
>         //... another error code means that the font file could not 
>         //... be opened or read, or simply that it is broken... 
>     }
>     else
>     {
>         printf("FT_New_Face finished\r\n");
> 
>         printf("%d charmaps exist\r\n", face->num_charmaps);
>         for (int n = 0; n < face->num_charmaps; n++ ) 
>         { 
>             FT_CharMap charmap = face->charmaps[n]; 
>             printf("charmap: %d, %d\r\n", charmap->platform_id, 
>charmap->encoding_id);
>         }
> 
>         error = FT_Set_Char_Size( 
>             face,      // handle to face object  
>             0,         // char_width in 1/64th of points  
>             size << 6, // char_height in 1/64th of points  
>             72,        // horizontal device resolution in dots per inch
>             72);       // vertical device resolution 
> 
>         if (error)
>         {
>             printf("FT_Set_Char_Size failed\r\n");
>         }
>         else
>         {
>             printf("FT_Set_Char_Size finished\r\n");
> 
>             int i = 0;
>             int16_t x = 200;
>             int16_t y = 200;
>             while (text[i] != '\0')
>             {
>                 error = FT_Load_Char(face, text[i] - 29, FT_LOAD_RENDER);
>                 if (error)
>                 {
>                     printf("Missing Glyph for char %c: %d\r\n", text[i], 
>error);
>                 }
>                 else
>                 {
>                     printf("FT_Load_Char[%c] succeeded\r\n", text[i]);
>                     FT_Draw_Bitmap(&face->glyph->bitmap, 
>face->glyph->bitmap_left + x, y - face->glyph->bitmap_top);
> 
>                     //Move cursor to position for next character
>                     x += (face->glyph->advance.x >> 6);  //int 1/64th units, 
>so shift by 6
>                     y += (face->glyph->advance.y >> 6);
> 
>                     printf("%d,%d\r\n", x, y);
>                 }
> 
>                 i++;
>             }
>         }
> 
>         error = FT_Done_Face(face);
>         if (error)
>         {
>             printf("FT_Done_Face failed\r\n");
>         }
>     }
> 
>     error = FT_Done_FreeType(library);
>     if (error)
>     {
>         printf("FT_Done_FreeType failed\r\n");
>     }
> }
> 
> void FT_Draw_Bitmap( FT_Bitmap*  bitmap, FT_Int x, FT_Int y)
> {
>     FT_Int  i, j, p, q;
>     FT_Int  x_max = x + bitmap->width;
>     FT_Int  y_max = y + bitmap->rows;
> 
>     for ( i = x, p = 0; i < x_max; i++, p++ )
>     {
>         for ( j = y, q = 0; j < y_max; j++, q++ )
>         {
>             uint8_t alpha = bitmap->buffer[q * bitmap->width + p];
>             SetPixel({i, j}, Color(alpha, alpha, alpha));
>         }
>     }
> }                                                                             
>                                
> 
> _______________________________________________
> Freetype mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/freetype



reply via email to

[Prev in Thread] Current Thread [Next in Thread]