| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				@@ -1,3 +1,98 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				package sectr
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				import "codebase:font/VEFontCache"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				import "core:os"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				import ve        "codebase:font/VEFontCache"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				import sokol_gfx "thirdparty:sokol/gfx"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Provider_Use_Freetype :: false
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Largest_Px_Size       :: 72
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Size_Interval         :: 2
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Default            :: FontID { 0, "" }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Default_Point_Size :: 18.0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Load_Use_Default_Size :: -1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Font_Load_Gen_ID           :: ""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				FontID  :: struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					key   : u64,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					label : string,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				FontDef :: struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					path_file : string,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ve_id     : ve.FontID,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				FontProviderData :: struct
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ve_font_cache : ve.Context,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					font_cache    : HMapChained(FontDef),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					gfx_bindings  : sokol_gfx.Bindings,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					gfx_pipeline  : sokol_gfx.Pipeline,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					gfx_v_buffer  : sokol_gfx.Buffer,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					gfx_uv_buffer : sokol_gfx.Buffer,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					gfx_sampler   : sokol_gfx.Sampler,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				font_provider_startup :: proc()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					profile(#procedure)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					state := get_state()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					provider_data := state.font_provider_data; using provider_data
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					error : AllocatorError
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					font_cache, error = make( HMapChained(FontDef), hmap_closest_prime(1 * Kilo), persistent_allocator() /*dbg_name = "font_cache"*/ )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					verify( error == AllocatorError.None, "Failed to allocate font_cache" )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ve.init( & provider_data.ve_font_cache, allocator = persistent_slab_allocator() )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					log("VEFontCached initialized")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// TODO(Ed): Setup sokol hookup for VEFontCache
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				font_provider_shutdown :: proc()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					state := get_state()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					provider_data := state.font_provider_data; using provider_data
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ve.shutdown( & provider_data.ve_font_cache )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				font_load :: proc(path_file : string,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					default_size : f32    = Font_Load_Use_Default_Size,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					desired_id   : string = Font_Load_Gen_ID
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				) -> FontID
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					profile(#procedure)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					logf("Loading font: %v", path_file)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					provider_data := & get_state().font_provider_data; using provider_data
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					font_data, read_succeded : = os.read_entire_file( path_file )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					verify( b32(read_succeded), str_fmt("Failed to read font file for: %v", path_file) )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					font_data_size := cast(i32) len(font_data)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					desired_id := desired_id
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// Use file name as key
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(desired_id) == 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						// NOTE(Ed): This should never be used except for laziness so I'll be throwing a warning everytime.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						log("desired_key not provided, using file name. Give it a proper name!", LogLevel.Warning)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						// desired_id = cast(FontID) file_name_from_path(path_file)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						desired_id = file_name_from_path(path_file)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					key            := cast(u64) crc32( transmute([]byte) desired_id )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					def, set_error := hmap_chained_set(font_cache, key, FontDef{})
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					verify( set_error == AllocatorError.None, "Failed to add new font entry to cache" )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					// TODO(Ed): Load even sizes from 8px to upper bound.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					def.ve_id = ve.load_font( & provider_data.ve_font_cache, desired_id, font_data, default_size )
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					fid := FontID { key, desired_id }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return fid
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					
					| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				 
 |