// ---------------------------------------------------------------- display --- void display( void ) { glClearColor( 1.0, 1.0, 1.0, 1.0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glUseProgram( text_buffer->shader ); { glUniformMatrix4fv( glGetUniformLocation( text_buffer->shader, "model" ), 1, 0, model.data); glUniformMatrix4fv( glGetUniformLocation( text_buffer->shader, "view" ), 1, 0, view.data); glUniformMatrix4fv( glGetUniformLocation( text_buffer->shader, "projection" ), 1, 0, projection.data); text_buffer_render( text_buffer ); } glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); glBlendColor( 1.0, 1.0, 1.0, 1.0 ); glUseProgram( shader ); { glUniformMatrix4fv( glGetUniformLocation( shader, "model" ), 1, 0, model.data); glUniformMatrix4fv( glGetUniformLocation( shader, "view" ), 1, 0, view.data); glUniformMatrix4fv( glGetUniformLocation( shader, "projection" ), 1, 0, projection.data); vertex_buffer_render( buffer, GL_LINES ); } glutSwapBuffers( ); }
// ---------------------------------------------------------------- display --- void TextRender::display(const int _viewPortWidth, const int _viewPortHeight) { //glClearColor(0.40, 0.40, 0.45, 1.00); //glClearColor(1.0, 1.0, 1.0, 1.0); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_mutex.lock(); mat4_set_orthographic(&m_projection, 0, _viewPortWidth, 0, _viewPortHeight, -1, 1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glUseProgram(m_text_buffer->shader); { glUniformMatrix4fv(glGetUniformLocation(m_text_buffer->shader, "model"), 1, 0, m_model.data); glUniformMatrix4fv(glGetUniformLocation(m_text_buffer->shader, "view"), 1, 0, m_view.data); glUniformMatrix4fv(glGetUniformLocation(m_text_buffer->shader, "projection"), 1, 0, m_projection.data); text_buffer_render(m_text_buffer); } m_mutex.unlock(); }
// ---------------------------------------------------------------- display --- void display( void ) { glClearColor(0.40,0.40,0.45,1.00); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glColor4f(1.00,1.00,1.00,1.00); glUseProgram( buffer->shader ); { glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "model" ), 1, 0, model.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "view" ), 1, 0, view.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "projection" ), 1, 0, projection.data); text_buffer_render( buffer ); } glutSwapBuffers( ); }
// ----------------------------------------------------------- build_buffer --- void build_buffer( void ) { vec2 pen; texture_font_t *font; vec4 black = {{0.0, 0.0, 0.0, 1.0}}; vec4 white = {{1.0, 1.0, 1.0, 1.0}}; vec4 none = {{1.0, 1.0, 1.0, 0.0}}; vec4 color = white; if( p_invert ) { color = black; } markup_t markup = { .family = "Source Sans Pro", .size = 10.0, .bold = 0, .italic = 0, .rise = 0.0, .spacing = p_interval, .gamma = p_gamma, .foreground_color = color, .background_color = none, .underline = 0, .underline_color = color, .overline = 0, .overline_color = color, .strikethrough = 0, .strikethrough_color = color, .font = 0, }; text_buffer_clear( buffer ); texture_atlas_t * atlas = buffer->manager->atlas; texture_atlas_clear( atlas ); if( p_family == VERA) { font = texture_font_new_from_file( atlas, p_size, "fonts/Vera.ttf" ); } else if( p_family == VERA_MONO) { font = texture_font_new_from_file( atlas, p_size, "fonts/VeraMono.ttf" ); } else if( p_family == LUCKIEST_GUY) { font = texture_font_new_from_file( atlas, p_size, "fonts/LuckiestGuy.ttf" ); } else if( p_family == SOURCE_SANS ) { font = texture_font_new_from_file( atlas, p_size, "fonts/SourceSansPro-Regular.ttf" ); } else if( p_family == SOURCE_CODE ) { font = texture_font_new_from_file( atlas, p_size, "fonts/SourceCodePro-Regular.ttf" ); } else if( p_family == OLD_STANDARD ) { font = texture_font_new_from_file( atlas, p_size, "fonts/OldStandard-Regular.ttf" ); } else if( p_family == LOBSTER ) { font = texture_font_new_from_file( atlas, p_size, "fonts/Lobster-Regular.ttf" ); } else { fprintf( stderr, "Error : Unknown family type\n" ); return; } if (!font) return; markup.font = font; font->hinting = p_hinting; font->kerning = p_kerning; font->filtering = 1; float norm = 1.0/(p_primary + 2*p_secondary + 2*p_tertiary); font->lcd_weights[0] = (unsigned char)(p_tertiary*norm*256); font->lcd_weights[1] = (unsigned char)(p_secondary*norm*256); font->lcd_weights[2] = (unsigned char)(p_primary*norm*256); font->lcd_weights[3] = (unsigned char)(p_secondary*norm*256); font->lcd_weights[4] = (unsigned char)(p_tertiary*norm*256); pen.x = 10; pen.y = 600 - font->height - 10; text_buffer_printf( buffer, &pen, &markup, text, NULL ); // Post-processing for width and orientation vertex_buffer_t * vbuffer = buffer->buffer; size_t i; for( i=0; i < vector_size( vbuffer->items ); ++i ) { ivec4 *item = (ivec4 *) vector_get( vbuffer->items, i); glyph_vertex_t * v0 = /* x0,y0 */ (glyph_vertex_t *) vector_get( vbuffer->vertices, item->vstart+0 ); //glyph_vertex_t * v1 = /* x0,y1 */ // (glyph_vertex_t *) vector_get( vbuffer->vertices, item->vstart+1 ); glyph_vertex_t * v2 = /* x1,y1 */ (glyph_vertex_t *) vector_get( vbuffer->vertices, item->vstart+2 ); glyph_vertex_t * v3 = /* x1,y0 */ (glyph_vertex_t *) vector_get( vbuffer->vertices, item->vstart+3 ); float x0 = v0->x, y0 = v0->y; float x1 = v2->x, y1 = v2->y; v2->x = v3->x = x0 + (x1-x0)*p_width; float dy = abs(y1-y0); float dx = tan(p_faux_italic/180.0 * M_PI) * dy; v0->x += dx; v0->shift = fmod(v0->shift + dx-(int)(dx),1.0); v3->x += dx; v3->shift = fmod(v3->shift + dx-(int)(dx),1.0); } texture_font_delete( font ); } // ---------------------------------------------------------------- display --- void display( GLFWwindow* window ) { vec4 black = {{0.0, 0.0, 0.0, 1.0}}; vec4 white = {{1.0, 1.0, 1.0, 1.0}}; if( !p_invert ) { glClearColor( 0, 0, 0, 1 ); buffer->base_color = white; } else { glClearColor( 1, 1, 1, 1 ); buffer->base_color = black; } glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glUseProgram( buffer->shader ); { glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "model" ), 1, 0, model.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "view" ), 1, 0, view.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "projection" ), 1, 0, projection.data); text_buffer_render( buffer ); } TwDraw( ); glfwSwapBuffers( window ); }
void init() { buffer = text_buffer_new( LCD_FILTERING_ON ); vec4 black = {{0.0, 0.0, 0.0, 1.0}}; vec4 white = {{1.0, 1.0, 1.0, 1.0}}; vec4 yellow = {{1.0, 1.0, 0.0, 1.0}}; vec4 grey = {{0.5, 0.5, 0.5, 1.0}}; vec4 none = {{1.0, 1.0, 1.0, 0.0}}; char *f_normal = match_description("Droid Serif", 24, 0, 0); char *f_bold = match_description("Droid Serif", 24, 1, 0); char *f_italic = match_description("Droid Serif", 24, 0, 1); char *f_japanese = match_description("Droid Sans Japanese", 18, 0, 0); char *f_math = match_description("DejaVu Sans", 24, 0, 0); markup_t normal = { .family = f_normal, .size = 24.0, .bold = 0, .italic = 0, .rise = 0.0, .spacing = 0.0, .gamma = 2., .foreground_color = white, .background_color = none, .underline = 0, .underline_color = white, .overline = 0, .overline_color = white, .strikethrough = 0, .strikethrough_color = white, .font = 0, }; markup_t highlight = normal; highlight.background_color = grey; markup_t reverse = normal; reverse.foreground_color = black; reverse.background_color = white; reverse.gamma = 1.0; markup_t overline = normal; overline.overline = 1; markup_t underline = normal; underline.underline = 1; markup_t small = normal; small.size = 10.0; markup_t big = normal; big.size = 48.0; big.italic = 1; big.foreground_color = yellow; markup_t bold = normal; bold.bold = 1; bold.family = f_bold; markup_t italic = normal; italic.italic = 1; italic.family = f_italic; markup_t japanese = normal; japanese.family = f_japanese; japanese.size = 18.0; markup_t math = normal; math.family = f_math; vec2 pen = {{20, 200}}; text_buffer_printf( buffer, &pen, &underline, "The", &normal, " Quick", &big, " brown ", &reverse, " fox \n", &italic, "jumps over ", &bold, "the lazy ", &normal, "dog.\n", &small, "Now is the time for all good men " "to come to the aid of the party.\n", &italic, "Ég get etið gler án þess að meiða mig.\n", &japanese, "私はガラスを食べられます。 それは私を傷つけません\n", &math, "ℕ ⊆ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ", NULL ); mat4_set_identity( &projection ); mat4_set_identity( &model ); mat4_set_identity( &view ); } // ---------------------------------------------------------------- display --- void display( GLFWwindow* window ) { glClearColor(0.40,0.40,0.45,1.00); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glColor4f(1.00,1.00,1.00,1.00); glUseProgram( buffer->shader ); { glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "model" ), 1, 0, model.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "view" ), 1, 0, view.data); glUniformMatrix4fv( glGetUniformLocation( buffer->shader, "projection" ), 1, 0, projection.data); text_buffer_render( buffer ); } glfwSwapBuffers( window ); }