// ---------------------------------------------------------------------------- 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; }
// ---------------------------------------------------------------------------- int text_buffer_add_text( text_buffer_t * self, vec2 * pen, markup_t * markup, texture_font_t * font, wchar_t * text ) { vertex_buffer_t * buffer = self->buffer; if( 0 == vertex_buffer_size( self->buffer ) ) self->origin = *pen; if( font->ascender > self->line_ascender ) { size_t i, j; float dy = (int)(font->ascender - self->line_ascender); for( i=self->line_start; i < vector_size( buffer->items ); ++i ) { ivec4 *item = (ivec4 *) vector_get( buffer->items, i); for( j=item->vstart; j<item->vstart+item->vcount; ++j) { glyph_vertex_t * vertex = (glyph_vertex_t *) vector_get( buffer->vertices, j ); vertex->pos.y -= dy; } } self->line_ascender = font->ascender; pen->y -= dy; } if( font->descender < self->line_descender ) { self->line_descender = font->descender; } if(!text[0]) return 0; int rc; if(0 != (rc = text_buffer_add_wchar( self, pen, markup, font, text[0], 0 ))) { return rc; } size_t i; for( i=1; text[i]; ++i ) { if(0 != (rc = text_buffer_add_wchar( self, pen, markup, font, text[i], text[i-1] ))) { return rc; } } return 0; }
// ---------------------------------------------------------------------------- void text_buffer_add_text( text_buffer_t * self, vec2 * pen, markup_t * markup, wchar_t * text, size_t length ) { font_manager_t * manager = self->manager; size_t i; 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 = wcslen(text); } if( vertex_buffer_size( self->buffer ) == 0 ) { self->origin = *pen; } text_buffer_add_wchar( self, pen, markup, text[0], 0 ); for( i=1; i<length; ++i ) { text_buffer_add_wchar( self, pen, markup, text[i], text[i-1] ); } }
// ---------------------------------------------------------------------------- void text_buffer_printf( text_buffer_t * self, vec2 *pen, ... ) { markup_t *markup; wchar_t *text; va_list args; if( vertex_buffer_size( self->buffer ) == 0 ) { self->origin = *pen; } va_start ( args, pen ); do { markup = va_arg( args, markup_t * ); if( markup == NULL ) { return; } text = va_arg( args, wchar_t * ); text_buffer_add_text( self, pen, markup, text, wcslen(text) ); } while( markup != 0 ); va_end ( args ); }
size_t sen_render_flush(int clear_buff) { // gl_check_error(); //_logfi("1"); blend_group_t* bg; khint_t i,k,j; size_t total = 0; khash_t(hmsp)* tgs; camera_t* cam = sen_camera(); tex_group_t* tg; khash_t(hmsp)* sgs; shader_group_t* sg; vector_clear(zsorter); for (k = kh_begin(g_bgs); k != kh_end(g_bgs); ++k) { if (!kh_exist(g_bgs,k)) continue; bg = kh_val(g_bgs, k); if (bg->num == 0) { kh_del(hmip,g_bgs,k); continue; } tgs = bg->tgs; // set_blending( (blend_func) (kh_key(g_bgs, k)) ); for (i = kh_begin(tgs); i != kh_end(tgs); ++i) { if (!kh_exist(tgs,i)) continue; tg = kh_val(tgs, i); if (tg->num == 0) { kh_del(hmsp,tgs,i); continue; } /* if (tg->tex) sen_texture_bind(tg->tex); else if (tg->font) sen_font_bind(tg->font); */ sgs = tg->sgs; for (j = kh_begin(sgs); j != kh_end(sgs); ++j) { if (!kh_exist(sgs,j)) continue; sg = kh_val(sgs, j); if (sg->num == 0 || !sg->buff) { kh_del(hmsp,sgs,j); continue; } if (sg->buff) { /* sen_shader_use(sg->program); { if (tg->tex || tg->font) sen_uniform_1iN(sg->program, "u_tex0", 0); sen_uniform_m4fN(sg->program, "u_mvp", cam->view_proj.data); vertex_buffer_render( sg->buff, GL_TRIANGLES); total+=vertex_buffer_size(sg->buff); if (clear_buff) vertex_buffer_clear( sg->buff ); //sen_shader_use(NULL); }*/ vector_push_back( zsorter, &sg ); } sg->num = 0; } tg->num = 0; } bg->num = 0; } if (zsorter->size > 0) vector_sort(zsorter, zcmp); for (j = 0; j < zsorter->size; j++) { shader_group_t* sg = *(shader_group_t**)vector_get(zsorter, j); // _logfi("%s %d",sg->name, sg->z); set_blending( (blend_func) (sg->bg->key) ); if (sg->tg->tex) sen_texture_bind(sg->tg->tex); else if (sg->tg->font) sen_font_bind(sg->tg->font); sen_shader_use(sg->program); { if (sg->tg->tex || sg->tg->font) sen_uniform_1iN(sg->program, "u_tex0", 0); sen_uniform_m4fN(sg->program, "u_mvp", sg->z > 9500 ? cam->proj.data : cam->view_proj.data); vertex_buffer_render( sg->buff, GL_TRIANGLES); total+=vertex_buffer_size(sg->buff); if (clear_buff) vertex_buffer_clear( sg->buff ); //sen_shader_use(NULL); } } // _logfi("-------------------------------------------------"); return total; }
// ---------------------------------------------------------------------------- void text_buffer_add_text( text_buffer_t * self, vec2 * pen, markup_t * markup, wchar_t * text, size_t length ) { vertex_buffer_t * buffer = self->buffer; font_manager_t * manager = self->manager; 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 = wcslen(text); } if( vertex_buffer_size( self->buffer ) == 0 ) { self->origin = *pen; } if( markup->font->ascender > self->line_ascender ) { size_t i, j; float dy = (int)(markup->font->ascender - self->line_ascender); for( i=self->line_start; i < vector_size( buffer->items ); ++i ) { ivec4 *item = (ivec4 *) vector_get( buffer->items, i); for( j=item->vstart; j<item->vstart+item->vcount; ++j) { glyph_vertex_t * vertex = (glyph_vertex_t *) vector_get( buffer->vertices, j ); vertex->y -= dy; } } self->line_ascender = markup->font->ascender; pen->y -= dy; } if( markup->font->descender < self->line_descender ) { self->line_descender = markup->font->descender; } text_buffer_add_wchar( self, pen, markup, text[0], 0 ); size_t i; for( i=1; i<length; ++i ) { text_buffer_add_wchar( self, pen, markup, text[i], text[i-1] ); } }