linux freetype tweaks

This commit is contained in:
insofaras 2016-06-21 17:27:26 +01:00
parent b4c221326d
commit b539c36f3a
1 changed files with 7 additions and 6 deletions

View File

@ -90,6 +90,7 @@ linux_font_load(Render_Font *rf, char *name, i32 pt_size, i32 tab_width){
FT_Init_FreeType(&ft); FT_Init_FreeType(&ft);
//NOTE(inso): i'm not sure the LCD filter looks better, and it doesn't work perfectly with the coloring stuff //NOTE(inso): i'm not sure the LCD filter looks better, and it doesn't work perfectly with the coloring stuff
// it will probably need shaders to work properly
#if ENABLE_LCD_FILTER #if ENABLE_LCD_FILTER
if(FT_Library_SetLcdFilter(ft, FT_LCD_FILTER_DEFAULT) == 0){ if(FT_Library_SetLcdFilter(ft, FT_LCD_FILTER_DEFAULT) == 0){
puts("LCD Filter on"); puts("LCD Filter on");
@ -102,7 +103,7 @@ linux_font_load(Render_Font *rf, char *name, i32 pt_size, i32 tab_width){
// set size & metrics // set size & metrics
FT_Size_RequestRec_ size = {}; FT_Size_RequestRec_ size = {};
size.type = FT_SIZE_REQUEST_TYPE_REAL_DIM; size.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
size.height = pt_size << 6; size.height = pt_size << 6;
FT_Request_Size(face, &size); FT_Request_Size(face, &size);
@ -134,7 +135,7 @@ linux_font_load(Render_Font *rf, char *name, i32 pt_size, i32 tab_width){
u32* pixels = (u32*) calloc(tex_width * tex_height, sizeof(u32)); u32* pixels = (u32*) calloc(tex_width * tex_height, sizeof(u32));
// XXX: test if AUTOHINT looks better or not // XXX: test if AUTOHINT looks better or not
const u32 ft_extra_flags = use_lcd_filter ? FT_LOAD_TARGET_LCD : FT_LOAD_FORCE_AUTOHINT; const u32 ft_extra_flags = use_lcd_filter ? FT_LOAD_TARGET_LCD : 0; // FT_LOAD_FORCE_AUTOHINT;
for(int i = 0; i < NUM_GLYPHS; ++i){ for(int i = 0; i < NUM_GLYPHS; ++i){
if(FT_Load_Char(face, i, FT_LOAD_RENDER | ft_extra_flags) != 0) continue; if(FT_Load_Char(face, i, FT_LOAD_RENDER | ft_extra_flags) != 0) continue;
@ -182,12 +183,11 @@ linux_font_load(Render_Font *rf, char *name, i32 pt_size, i32 tab_width){
int y = pen_y + j; int y = pen_y + j;
if(use_lcd_filter){ if(use_lcd_filter){
u8 r = face->glyph->bitmap.buffer[j * pitch + i * 3]; u8 a = face->glyph->bitmap.buffer[j * pitch + i * 3 + 1];
u8 g = face->glyph->bitmap.buffer[j * pitch + i * 3 + 1]; u8 r = face->glyph->bitmap.buffer[j * pitch + i * 3 + 0];
u8 b = face->glyph->bitmap.buffer[j * pitch + i * 3 + 2]; u8 b = face->glyph->bitmap.buffer[j * pitch + i * 3 + 2];
u8 a = (r + g + b) / 3.0f;
pixels[y * tex_width + x] = (a << 24) | (r << 16) | (g << 8) | b; pixels[y * tex_width + x] = (a << 24) | (b << 16) | (a << 8) | r;
} else { } else {
pixels[y * tex_width + x] = face->glyph->bitmap.buffer[j * pitch + i] * 0x1010101; pixels[y * tex_width + x] = face->glyph->bitmap.buffer[j * pitch + i] * 0x1010101;
} }
@ -201,6 +201,7 @@ linux_font_load(Render_Font *rf, char *name, i32 pt_size, i32 tab_width){
rf->chardata['\n'] = rf->chardata[' ']; rf->chardata['\n'] = rf->chardata[' '];
rf->chardata['\t'] = rf->chardata[' ']; rf->chardata['\t'] = rf->chardata[' '];
rf->chardata['\t'].xadvance *= tab_width; rf->chardata['\t'].xadvance *= tab_width;
rf->advance_data['\t'] = rf->advance_data[' '] * tab_width;
FT_Done_FreeType(ft); FT_Done_FreeType(ft);