/* calculate the overall length of the font, only used to create the picture for the google wiki */ size_t u8g2_GetFontSize(const uint8_t *font_arg) { uint16_t e; const uint8_t *font = font_arg; font += U8G2_FONT_DATA_STRUCT_SIZE; for(;;) { if ( u8x8_pgm_read( font + 1 ) == 0 ) break; font += u8x8_pgm_read( font + 1 ); } /* continue with unicode section */ font += 2; /* skip unicode lookup table */ font += u8g2_font_get_word(font, 0); for(;;) { e = u8x8_pgm_read( font ); e <<= 8; e |= u8x8_pgm_read( font + 1 ); if ( e == 0 ) break; font += u8x8_pgm_read( font + 2 ); } return (font - font_arg) + 2; }
/* new font format */ void u8g2_read_font_info(u8g2_font_info_t *font_info, const uint8_t *font) { /* offset 0 */ font_info->glyph_cnt = u8g2_font_get_byte(font, 0); font_info->bbx_mode = u8g2_font_get_byte(font, 1); font_info->bits_per_0 = u8g2_font_get_byte(font, 2); font_info->bits_per_1 = u8g2_font_get_byte(font, 3); /* offset 4 */ font_info->bits_per_char_width = u8g2_font_get_byte(font, 4); font_info->bits_per_char_height = u8g2_font_get_byte(font, 5); font_info->bits_per_char_x = u8g2_font_get_byte(font, 6); font_info->bits_per_char_y = u8g2_font_get_byte(font, 7); font_info->bits_per_delta_x = u8g2_font_get_byte(font, 8); /* offset 9 */ font_info->max_char_width = u8g2_font_get_byte(font, 9); font_info->max_char_height = u8g2_font_get_byte(font, 10); font_info->x_offset = u8g2_font_get_byte(font, 11); font_info->y_offset = u8g2_font_get_byte(font, 12); /* offset 13 */ font_info->ascent_A = u8g2_font_get_byte(font, 13); font_info->descent_g = u8g2_font_get_byte(font, 14); font_info->ascent_para = u8g2_font_get_byte(font, 15); font_info->descent_para = u8g2_font_get_byte(font, 16); /* offset 17 */ font_info->start_pos_upper_A = u8g2_font_get_word(font, 17); font_info->start_pos_lower_a = u8g2_font_get_word(font, 19); /* offset 21 */ #ifdef U8G2_WITH_UNICODE font_info->start_pos_unicode = u8g2_font_get_word(font, 21); #endif }
/* Description: Find the starting point of the glyph data. Args: encoding: Encoding (ASCII or Unicode) of the glyph Return: Address of the glyph data or NULL, if the encoding is not avialable in the font. */ const uint8_t *u8g2_font_get_glyph_data(u8g2_t *u8g2, uint16_t encoding) { const uint8_t *font = u8g2->font; font += U8G2_FONT_DATA_STRUCT_SIZE; if ( encoding <= 255 ) { if ( encoding >= 'a' ) { font += u8g2->font_info.start_pos_lower_a; } else if ( encoding >= 'A' ) { font += u8g2->font_info.start_pos_upper_A; } for(;;) { if ( u8x8_pgm_read( font + 1 ) == 0 ) break; if ( u8x8_pgm_read( font ) == encoding ) { return font+2; /* skip encoding and glyph size */ } font += u8x8_pgm_read( font + 1 ); } } #ifdef U8G2_WITH_UNICODE else { uint16_t e; const uint8_t *unicode_lookup_table; // removed, there is now the new index table //#ifdef __unix__ // if ( u8g2->last_font_data != NULL && encoding >= u8g2->last_unicode ) // { // font = u8g2->last_font_data; // } // else //#endif font += u8g2->font_info.start_pos_unicode; unicode_lookup_table = font; /* issue 596: search for the glyph start in the unicode lookup table */ do { font += u8g2_font_get_word(unicode_lookup_table, 0); e = u8g2_font_get_word(unicode_lookup_table, 2); unicode_lookup_table+=4; } while( e < encoding ); for(;;) { e = u8x8_pgm_read( font ); e <<= 8; e |= u8x8_pgm_read( font + 1 ); // removed, there is now the new index table //#ifdef __unix__ // if ( encoding < e ) // break; //#endif if ( e == 0 ) break; if ( e == encoding ) { // removed, there is now the new index table //#ifdef __unix__ // u8g2->last_font_data = font; // u8g2->last_unicode = encoding; //#endif return font+3; /* skip encoding and glyph size */ } font += u8x8_pgm_read( font + 2 ); } } #endif return NULL; }