u8g2_uint_t u8g2_DrawExtUTF8(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, uint8_t to_left, const uint16_t *kerning_table, const char *str) { u8g2->u8x8.next_cb = u8x8_utf8_next; uint16_t e_prev = 0x0ffff; uint16_t e; u8g2_uint_t delta, sum, k; u8x8_utf8_init(u8g2_GetU8x8(u8g2)); sum = 0; for(;;) { e = u8g2->u8x8.next_cb(u8g2_GetU8x8(u8g2), (uint8_t)*str); if ( e == 0x0ffff ) break; str++; if ( e != 0x0fffe ) { delta = u8g2_GetGlyphWidth(u8g2, e); if ( to_left ) { k = u8g2_GetKerningByTable(u8g2, kerning_table, e, e_prev); delta -= k; x -= delta; } else { k = u8g2_GetKerningByTable(u8g2, kerning_table, e_prev, e); delta -= k; } e_prev = e; if ( to_left ) { } else { x += delta; } u8g2_DrawGlyph(u8g2, x, y, e); if ( to_left ) { } else { //x += delta; //x -= k; } sum += delta; } } return sum; }
static u8g2_uint_t u8g2_draw_string(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const char *str) { uint16_t e; u8g2_uint_t delta, sum; u8x8_utf8_init(u8g2_GetU8x8(u8g2)); sum = 0; for(;;) { e = u8g2->u8x8.next_cb(u8g2_GetU8x8(u8g2), (uint8_t)*str); if ( e == 0x0ffff ) break; str++; if ( e != 0x0fffe ) { delta = u8g2_DrawGlyph(u8g2, x, y, e); #ifdef U8G2_WITH_FONT_ROTATION switch(u8g2->font_decode.dir) { case 0: x += delta; break; case 1: y += delta; break; case 2: x -= delta; break; case 3: y -= delta; break; } #else x += delta; #endif sum += delta; } } return sum; }
static u8g2_uint_t u8g2_string_width(u8g2_t *u8g2, const char *str) { uint16_t e; u8g2_uint_t w, dx; u8g2->font_decode.glyph_width = 0; u8x8_utf8_init(u8g2_GetU8x8(u8g2)); /* reset the total width to zero, this will be expanded during calculation */ w = 0; dx = 0; // printf("str=<%s>\n", str); for(;;) { e = u8g2->u8x8.next_cb(u8g2_GetU8x8(u8g2), (uint8_t)*str); if ( e == 0x0ffff ) break; str++; if ( e != 0x0fffe ) { dx = u8g2_GetGlyphWidth(u8g2, e); /* delta x value of the glyph */ w += dx; } } /* adjust the last glyph, check for issue #16: do not adjust if width is 0 */ if ( u8g2->font_decode.glyph_width != 0 ) { w -= dx; w += u8g2->font_decode.glyph_width; /* the real pixel width of the glyph, sideeffect of GetGlyphWidth */ /* issue #46: we have to add the x offset also */ w += u8g2->glyph_x_offset; /* this value is set as a side effect of u8g2_GetGlyphWidth() */ } // printf("w=%d \n", w); return w; }