// ---------------------------------------------------------------------------- void text_buffer_add_text( text_buffer_t * self, vec2 * pen, markup_t * markup, const char * text, size_t length ) { font_manager_t * manager = self->manager; size_t i; const char * prev_character = NULL; if( markup == NULL ) { return; } if( !markup->font ) { markup->font = font_manager_get_from_markup( manager, markup ); if( ! markup->font ) { fprintf( stderr, "Houston, we've got a problem !\n" ); exit( EXIT_FAILURE ); } } if( length == 0 ) { length = utf8_strlen(text); } if( vertex_buffer_size( self->buffer ) == 0 ) { self->origin = *pen; self->line_left = pen->x; self->bounds.left = pen->x; self->bounds.top = pen->y; } else { if (pen->x < self->origin.x) { self->origin.x = pen->x; } if (pen->y != self->last_pen_y) { text_buffer_finish_line(self, pen, false); } } for( i = 0; utf8_strlen( text + i ) && length; i += utf8_surrogate_len( text + i ) ) { text_buffer_add_char( self, pen, markup, text + i, prev_character ); prev_character = text + i; length--; } self->last_pen_y = pen->y; }
// ------------------------------------------------------------ utf8_strlen --- size_t ftgl::utf8_strlen( const char* string ) { const char* ptr = string; size_t result = 0; while (*ptr) { ptr += utf8_surrogate_len(ptr); result++; } return result; }