Font italics and bold working on Windows
parent
e7d8aae42e
commit
16c002fe7c
|
@ -15,6 +15,7 @@
|
||||||
// NOTE(allen): A description of an available font.
|
// NOTE(allen): A description of an available font.
|
||||||
struct Font_Loadable_Stub{
|
struct Font_Loadable_Stub{
|
||||||
b32 load_from_path;
|
b32 load_from_path;
|
||||||
|
b32 in_font_folder;
|
||||||
i32 len;
|
i32 len;
|
||||||
char name[256];
|
char name[256];
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,23 +33,56 @@ font_ft_flags(b32 use_hinting){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
font_ft_get_face(FT_Library ft, Font_Loadable_Stub *stub, FT_Face *face){
|
font_ft_get_face(FT_Library ft, Font_Loadable_Stub *stub, Font_Parameters *parameters, FT_Face *face){
|
||||||
b32 success = true;
|
b32 success = true;
|
||||||
|
b32 do_transform = false;
|
||||||
if (stub->load_from_path){
|
if (stub->load_from_path){
|
||||||
|
// TODO(allen): Look for italics/bold stuff?
|
||||||
FT_Error error = FT_New_Face(ft, stub->name, 0, face);
|
FT_Error error = FT_New_Face(ft, stub->name, 0, face);
|
||||||
success = (error == 0);
|
success = (error == 0);
|
||||||
|
do_transform = success;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Font_Raw_Data data = system_font_data(stub->name);
|
switch (system_font_method){
|
||||||
if (data.size > 0){
|
case SystemFontMethod_FilePath:
|
||||||
FT_Error error = FT_New_Memory_Face(ft, data.data, data.size, 0, face);
|
{
|
||||||
success = (error == 0);
|
Font_Path path = system_font_path(stub->name, parameters);
|
||||||
|
if (path.len > 0){
|
||||||
|
FT_Error error = FT_New_Face(ft, path.name, 0, face);
|
||||||
|
success = (error == 0);
|
||||||
|
do_transform = (success && path.used_base_file);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
end_temp_memory(path.temp);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case SystemFontMethod_RawData:
|
||||||
|
{
|
||||||
|
Font_Raw_Data data = system_font_data(stub->name, parameters);
|
||||||
|
if (data.size > 0){
|
||||||
|
FT_Error error = FT_New_Memory_Face(ft, data.data, data.size, 0, face);
|
||||||
|
success = (error == 0);
|
||||||
|
do_transform = (success && data.used_base_file);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
end_temp_memory(data.temp);
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
end_temp_memory(data.temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (do_transform && parameters != 0){
|
||||||
|
if (parameters->italics || parameters->bold){
|
||||||
|
FT_Matrix matrix = {0};
|
||||||
|
FT_Set_Transform(face, &matrix, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return(success);
|
return(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +95,7 @@ font_load_name(Font_Loadable_Stub *stub, char *buffer, i32 capacity){
|
||||||
FT_Init_FreeType(&ft);
|
FT_Init_FreeType(&ft);
|
||||||
|
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
if (font_ft_get_face(ft, stub, &face)){
|
if (font_ft_get_face(ft, stub, 0, &face)){
|
||||||
char *name = face->family_name;
|
char *name = face->family_name;
|
||||||
i32 name_len = str_size(name);
|
i32 name_len = str_size(name);
|
||||||
if (name_len < capacity){
|
if (name_len < capacity){
|
||||||
|
@ -84,14 +117,21 @@ font_load_page_layout(Font_Settings *settings, Font_Metrics *metrics, Glyph_Page
|
||||||
page->has_layout = true;
|
page->has_layout = true;
|
||||||
|
|
||||||
u32 pt_size = settings->parameters.pt_size;
|
u32 pt_size = settings->parameters.pt_size;
|
||||||
|
b32 italics = settings->parameters.italics;
|
||||||
|
b32 bold = settings->parameters.bold;
|
||||||
|
b32 underline = settings->parameters.underline;
|
||||||
b32 use_hinting = settings->parameters.use_hinting;
|
b32 use_hinting = settings->parameters.use_hinting;
|
||||||
|
|
||||||
|
AllowLocal(italics);
|
||||||
|
AllowLocal(bold);
|
||||||
|
AllowLocal(underline);
|
||||||
|
|
||||||
// TODO(allen): Stop redoing all this init for each call.
|
// TODO(allen): Stop redoing all this init for each call.
|
||||||
FT_Library ft;
|
FT_Library ft;
|
||||||
FT_Init_FreeType(&ft);
|
FT_Init_FreeType(&ft);
|
||||||
|
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
b32 has_a_good_face = font_ft_get_face(ft, &settings->stub, &face);
|
b32 has_a_good_face = font_ft_get_face(ft, &settings->stub, &settings->parameters, &face);
|
||||||
|
|
||||||
if (has_a_good_face){
|
if (has_a_good_face){
|
||||||
FT_Size_RequestRec_ size = {};
|
FT_Size_RequestRec_ size = {};
|
||||||
|
@ -176,15 +216,22 @@ font_load_page_pixels(Partition *part, Font_Settings *settings, Glyph_Page *page
|
||||||
Assert(page->has_layout);
|
Assert(page->has_layout);
|
||||||
Assert(page->page_number == page_number);
|
Assert(page->page_number == page_number);
|
||||||
|
|
||||||
i32 pt_size = settings->parameters.pt_size;
|
u32 pt_size = settings->parameters.pt_size;
|
||||||
|
b32 italics = settings->parameters.italics;
|
||||||
|
b32 bold = settings->parameters.bold;
|
||||||
|
b32 underline = settings->parameters.underline;
|
||||||
b32 use_hinting = settings->parameters.use_hinting;
|
b32 use_hinting = settings->parameters.use_hinting;
|
||||||
|
|
||||||
|
AllowLocal(italics);
|
||||||
|
AllowLocal(bold);
|
||||||
|
AllowLocal(underline);
|
||||||
|
|
||||||
// TODO(allen): Stop redoing all this init for each call.
|
// TODO(allen): Stop redoing all this init for each call.
|
||||||
FT_Library ft;
|
FT_Library ft;
|
||||||
FT_Init_FreeType(&ft);
|
FT_Init_FreeType(&ft);
|
||||||
|
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
b32 has_a_good_face = font_ft_get_face(ft, &settings->stub, &face);
|
b32 has_a_good_face = font_ft_get_face(ft, &settings->stub, &settings->parameters, &face);
|
||||||
u32 *pixels = 0;
|
u32 *pixels = 0;
|
||||||
|
|
||||||
if (has_a_good_face){
|
if (has_a_good_face){
|
||||||
|
@ -292,7 +339,7 @@ font_load(System_Functions *system, Font_Settings *settings, Font_Metrics *metri
|
||||||
FT_Init_FreeType(&ft);
|
FT_Init_FreeType(&ft);
|
||||||
|
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
b32 success = font_ft_get_face(ft, &settings->stub, &face);
|
b32 success = font_ft_get_face(ft, &settings->stub, &settings->parameters, &face);
|
||||||
|
|
||||||
if (success){
|
if (success){
|
||||||
FT_Size_RequestRec_ size = {};
|
FT_Size_RequestRec_ size = {};
|
||||||
|
@ -707,6 +754,7 @@ system_font_get_local_stubs(Partition *part){
|
||||||
sll_push(list.first, list.last, setup);
|
sll_push(list.first, list.last, setup);
|
||||||
|
|
||||||
setup->stub.load_from_path = true;
|
setup->stub.load_from_path = true;
|
||||||
|
setup->stub.in_font_folder = true;
|
||||||
memcpy(&setup->stub.name[0], directory, dir_len);
|
memcpy(&setup->stub.name[0], directory, dir_len);
|
||||||
memcpy(&setup->stub.name[dir_len], filename, len + 1);
|
memcpy(&setup->stub.name[dir_len], filename, len + 1);
|
||||||
setup->stub.len = dir_len + len;
|
setup->stub.len = dir_len + len;
|
||||||
|
@ -775,7 +823,17 @@ system_font_init(Font_Functions *font_links, u32 pt_size, b32 use_hinting, Font_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name_good){
|
if (name_good){
|
||||||
memcpy(&loadable->stub, stub, sizeof(*stub));
|
if (stub->in_font_folder){
|
||||||
|
memcpy(&loadable->stub, stub, sizeof(*stub));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
stub->load_from_path = false;
|
||||||
|
stub->in_font_folder = false;
|
||||||
|
stub->len = loadable->display_len;
|
||||||
|
memset(loadable->stub.name, 0, sizeof(stub->name));
|
||||||
|
memcpy(loadable->stub.name, loadable->display_name, stub->len);
|
||||||
|
}
|
||||||
|
|
||||||
loadable->valid = true;
|
loadable->valid = true;
|
||||||
++fontvars.loadable_count;
|
++fontvars.loadable_count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,17 +76,38 @@ struct Font_Setup_List{
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE(allen): Procedures to be implemented per-OS for the freetype font provider.
|
// NOTE(allen): Procedures to be implemented per-OS for the freetype font provider.
|
||||||
|
struct Font_Path{
|
||||||
|
Temp_Memory temp;
|
||||||
|
char *name;
|
||||||
|
i32 len;
|
||||||
|
b32 used_base_file;
|
||||||
|
};
|
||||||
|
|
||||||
struct Font_Raw_Data{
|
struct Font_Raw_Data{
|
||||||
Temp_Memory temp;
|
Temp_Memory temp;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
i32 size;
|
i32 size;
|
||||||
|
b32 used_base_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define Sys_Font_Data(name) Font_Raw_Data system_font_data(char *name)
|
enum{
|
||||||
internal Sys_Font_Data(name);
|
SystemFontMethod_FilePath,
|
||||||
|
SystemFontMethod_RawData,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define Sys_Font_Path(name, parameters) Font_Path system_font_path(char *name, Font_Parameters *parameters)
|
||||||
|
internal Sys_Font_Path(name, parameters);
|
||||||
|
|
||||||
|
#define Sys_Font_Path_Not_Used \
|
||||||
|
internal Sys_Font_Path(n,p){ \
|
||||||
|
Font_Path path = {0}; LOG("there is no font path retrieval procedure available\n"); return(path);}
|
||||||
|
|
||||||
|
#define Sys_Font_Data(name, parameters) Font_Raw_Data system_font_data(char *name, Font_Parameters *parameters)
|
||||||
|
internal Sys_Font_Data(name, parameters);
|
||||||
|
|
||||||
#define Sys_Font_Data_Not_Used \
|
#define Sys_Font_Data_Not_Used \
|
||||||
internal Sys_Font_Data(name){Font_Raw_Data data = {0}; LOG("there is no font data retrieval procedure available\n"); return(data);}
|
internal Sys_Font_Data(n,p){ \
|
||||||
|
Font_Raw_Data data = {0}; LOG("there is no font data retrieval procedure available\n"); return(data);}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -458,12 +458,18 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "4ed_font_provider_freetype.h"
|
#include "4ed_font_provider_freetype.h"
|
||||||
|
global u32 system_font_method = SystemFontMethod_FilePath;
|
||||||
#include "4ed_font_provider_freetype.cpp"
|
#include "4ed_font_provider_freetype.cpp"
|
||||||
|
|
||||||
#undef internal
|
#undef internal
|
||||||
#include <fontconfig/fontconfig.h>
|
#include <fontconfig/fontconfig.h>
|
||||||
#define internal static
|
#define internal static
|
||||||
|
|
||||||
|
internal
|
||||||
|
Sys_Font_Path(name, parameters){
|
||||||
|
// TODO(allen)
|
||||||
|
}
|
||||||
|
|
||||||
Sys_Font_Data_Not_Used;
|
Sys_Font_Data_Not_Used;
|
||||||
|
|
||||||
internal char*
|
internal char*
|
||||||
|
|
|
@ -333,8 +333,14 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "4ed_font_provider_freetype.h"
|
#include "4ed_font_provider_freetype.h"
|
||||||
|
global u32 system_font_method = SystemFontMethod_FilePath;
|
||||||
#include "4ed_font_provider_freetype.cpp"
|
#include "4ed_font_provider_freetype.cpp"
|
||||||
|
|
||||||
|
internal
|
||||||
|
Sys_Font_Path(name, parameters){
|
||||||
|
// TODO(allen)
|
||||||
|
}
|
||||||
|
|
||||||
Sys_Font_Data_Not_Used;
|
Sys_Font_Data_Not_Used;
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
|
|
@ -511,19 +511,27 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "4ed_font_provider_freetype.h"
|
#include "4ed_font_provider_freetype.h"
|
||||||
|
global u32 system_font_method = SystemFontMethod_RawData;
|
||||||
#include "4ed_font_provider_freetype.cpp"
|
#include "4ed_font_provider_freetype.cpp"
|
||||||
|
|
||||||
|
Sys_Font_Path_Not_Used;
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Font_Data(name){
|
Sys_Font_Data(name, parameters){
|
||||||
Font_Raw_Data data = {0};
|
Font_Raw_Data data = {0};
|
||||||
|
|
||||||
|
int weight = FW_REGULAR;
|
||||||
|
if (parameters->bold){
|
||||||
|
weight = FW_BOLD;
|
||||||
|
}
|
||||||
|
|
||||||
HFONT hfont = CreateFontA(
|
HFONT hfont = CreateFontA(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
weight, // Weight
|
||||||
FALSE, // Italic
|
parameters->italics, // Italic
|
||||||
FALSE, // Underline
|
FALSE, // Underline
|
||||||
FALSE, // Strikeout
|
FALSE, // Strikeout
|
||||||
ANSI_CHARSET,
|
ANSI_CHARSET,
|
||||||
|
|
Loading…
Reference in New Issue