Updates for getting get_font_vertical_metrics, + other cleanup
This commit is contained in:
parent
cdf0f3e3bd
commit
93e43c2b19
@ -486,13 +486,17 @@ measure_text_size :: proc( ctx : ^Context, font : FontID, text_utf8 : string ) -
|
||||
return shaped.size
|
||||
}
|
||||
|
||||
get_font_vertical_metrics :: #force_inline proc ( ctx : ^Context, font : FontID ) -> ( ascent, descent, line_gap : i32 )
|
||||
get_font_vertical_metrics :: #force_inline proc ( ctx : ^Context, font : FontID ) -> ( ascent, descent, line_gap : f32 )
|
||||
{
|
||||
assert( ctx != nil )
|
||||
assert( font >= 0 && int(font) < len(ctx.entries) )
|
||||
|
||||
entry := & ctx.entries[ font ]
|
||||
ascent, descent, line_gap = parser_get_font_vertical_metrics( & entry.parser_info )
|
||||
ascent_i32, descent_i32, line_gap_i32 := parser_get_font_vertical_metrics( & entry.parser_info )
|
||||
|
||||
ascent = ceil(f32(ascent_i32) * entry.size_scale)
|
||||
descent = ceil(f32(descent_i32) * entry.size_scale)
|
||||
line_gap = ceil(f32(line_gap_i32) * entry.size_scale)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -86,72 +86,6 @@ atlas_bbox :: proc( atlas : ^Atlas, region : AtlasRegionKind, local_idx : i32 )
|
||||
return
|
||||
}
|
||||
|
||||
// decide_codepoint_region :: proc( ctx : ^Context, entry : ^Entry, glyph_index : Glyph
|
||||
// ) -> (region_kind : AtlasRegionKind, region : ^AtlasRegion, over_sample : Vec2)
|
||||
// {
|
||||
// if parser_is_glyph_empty( & entry.parser_info, glyph_index ) {
|
||||
// region_kind = .None
|
||||
// }
|
||||
|
||||
// bounds_0, bounds_1 := parser_get_glyph_box( & entry.parser_info, glyph_index )
|
||||
// bounds_width := f32(bounds_1.x - bounds_0.x)
|
||||
// bounds_height := f32(bounds_1.y - bounds_0.y)
|
||||
|
||||
// atlas := & ctx.atlas
|
||||
// glyph_buffer := & ctx.glyph_buffer
|
||||
|
||||
// glyph_padding := f32(atlas.glyph_padding) * 2
|
||||
|
||||
// bounds_width_scaled := cast(u32) (bounds_width * entry.size_scale + glyph_padding)
|
||||
// bounds_height_scaled := cast(u32) (bounds_height * entry.size_scale + glyph_padding)
|
||||
|
||||
// if bounds_width_scaled <= atlas.region_a.width && bounds_height_scaled <= atlas.region_a.height
|
||||
// {
|
||||
// // Region A for small glyphs. These are good for things such as punctuation.
|
||||
// region_kind = .A
|
||||
// region = & atlas.region_a
|
||||
// }
|
||||
// else if bounds_width_scaled <= atlas.region_b.width && bounds_height_scaled <= atlas.region_b.height
|
||||
// {
|
||||
// // Region B for tall glyphs. These are good for things such as european alphabets.
|
||||
// region_kind = .B
|
||||
// region = & atlas.region_b
|
||||
// }
|
||||
// else if bounds_width_scaled <= atlas.region_c.width && bounds_height_scaled <= atlas.region_c.height
|
||||
// {
|
||||
// // Region C for big glyphs. These are good for things such as asian typography.
|
||||
// region_kind = .C
|
||||
// region = & atlas.region_c
|
||||
// }
|
||||
// else if bounds_width_scaled <= atlas.region_d.width && bounds_height_scaled <= atlas.region_d.height
|
||||
// {
|
||||
// // Region D for huge glyphs. These are good for things such as titles and 4k.
|
||||
// region_kind = .D
|
||||
// region = & atlas.region_d
|
||||
// }
|
||||
// else if bounds_width_scaled <= glyph_buffer.width && bounds_height_scaled <= glyph_buffer.height
|
||||
// {
|
||||
// // Region 'E' for massive glyphs. These are rendered uncached and un-oversampled.
|
||||
// region_kind = .E
|
||||
// region = nil
|
||||
// if bounds_width_scaled <= glyph_buffer.width / 2 && bounds_height_scaled <= glyph_buffer.height / 2 {
|
||||
// over_sample = { 2.0, 2.0 }
|
||||
// }
|
||||
// else {
|
||||
// over_sample = { 1.0, 1.0 }
|
||||
// }
|
||||
// return
|
||||
// }
|
||||
// else {
|
||||
// region_kind = .None
|
||||
// return
|
||||
// }
|
||||
|
||||
// over_sample = glyph_buffer.over_sample
|
||||
// assert(region != nil)
|
||||
// return
|
||||
// }
|
||||
|
||||
decide_codepoint_region :: proc(ctx : ^Context, entry : ^Entry, glyph_index : Glyph
|
||||
) -> (region_kind : AtlasRegionKind, region : ^AtlasRegion, over_sample : Vec2)
|
||||
{
|
||||
|
@ -661,34 +661,6 @@ flush_glyph_buffer_to_atlas :: proc( ctx : ^Context )
|
||||
}
|
||||
}
|
||||
|
||||
// flush_glyph_buffer_to_atlas :: proc( ctx : ^Context )
|
||||
// {
|
||||
// // profile(#procedure)
|
||||
// // Flush drawcalls to draw list
|
||||
// if len(ctx.glyph_buffer.clear_draw_list.calls) > 0 {
|
||||
// merge_draw_list( & ctx.draw_list, & ctx.glyph_buffer.clear_draw_list)
|
||||
// clear_draw_list( & ctx.glyph_buffer.clear_draw_list)
|
||||
// }
|
||||
|
||||
// if len(ctx.glyph_buffer.draw_list.calls) > 0 {
|
||||
// merge_draw_list( & ctx.draw_list, & ctx.glyph_buffer.draw_list)
|
||||
// clear_draw_list( & ctx.glyph_buffer.draw_list)
|
||||
// }
|
||||
|
||||
// // Clear glyph_update_FBO
|
||||
// if ctx.glyph_buffer.batch_x != 0
|
||||
// {
|
||||
// call := DrawCall {
|
||||
// pass = .Glyph,
|
||||
// start_index = 0,
|
||||
// end_index = 0,
|
||||
// clear_before_draw = true,
|
||||
// }
|
||||
// append( & ctx.draw_list.calls, call)
|
||||
// ctx.glyph_buffer.batch_x = 0
|
||||
// }
|
||||
// }
|
||||
|
||||
// ve_fontcache_merge_drawlist
|
||||
merge_draw_list :: proc( dst, src : ^DrawList )
|
||||
{
|
||||
|
@ -87,18 +87,19 @@ render_mode_2d_workspace :: proc( screen_extent : Vec2, cam : Camera, input : In
|
||||
}
|
||||
|
||||
// Visualize view bounds
|
||||
when true
|
||||
when false
|
||||
{
|
||||
render_set_view_space(screen_extent)
|
||||
// render_set_camera(cam)
|
||||
render_set_view_space(screen_extent)
|
||||
render_set_camera(cam) // This should apply the necessary transformation
|
||||
|
||||
view_bounds := view_get_bounds()
|
||||
view_bounds.min *= 0.9
|
||||
view_bounds.max *= 0.9
|
||||
draw_rect( view_bounds, { 0, 0, 180, 30 } )
|
||||
view_bounds := view_get_bounds()
|
||||
|
||||
render_flush_gp()
|
||||
}
|
||||
// Draw the view bounds (should now appear as a rectangle covering the whole screen)
|
||||
draw_rect(view_bounds, {0, 0, 180, 30})
|
||||
|
||||
render_flush_gp()
|
||||
gp.reset_transform()
|
||||
}
|
||||
|
||||
render_set_view_space(screen_extent)
|
||||
render_set_camera(cam)
|
||||
@ -110,7 +111,7 @@ render_mode_2d_workspace :: proc( screen_extent : Vec2, cam : Camera, input : In
|
||||
}
|
||||
when UI_Render_Method == .Depth_First
|
||||
{
|
||||
render_ui_via_box_tree( ui.root, screen_extent, ve_ctx, ve_render, & cam )
|
||||
render_ui_via_box_tree( ui, screen_extent, ve_ctx, ve_render, & cam )
|
||||
}
|
||||
}
|
||||
|
||||
@ -259,7 +260,7 @@ render_mode_screenspace :: proc( screen_extent : Extents2, screen_ui : ^UI_State
|
||||
if true {
|
||||
state.config.font_size_canvas_scalar = 2
|
||||
zoom_adjust_size := 16 * state.project.workspace.cam.zoom
|
||||
over_sample := zoom_adjust_size < 12 ? 1.0 : f32(state.config.font_size_canvas_scalar)
|
||||
over_sample := f32(state.config.font_size_canvas_scalar)
|
||||
debug_text("font_size_canvas_scalar: %v", config.font_size_canvas_scalar)
|
||||
ve_id, resolved_size := font_provider_resolve_draw_id( default_font, zoom_adjust_size * over_sample )
|
||||
debug_text("font_size resolved: %v px", resolved_size)
|
||||
@ -282,7 +283,7 @@ render_screen_ui :: proc( screen_extent : Extents2, ui : ^UI_State, ve_ctx : ^ve
|
||||
}
|
||||
when UI_Render_Method == .Depth_First
|
||||
{
|
||||
render_ui_via_box_tree( ui.root, screen_extent, ve_ctx, ve_render )
|
||||
render_ui_via_box_tree( ui, screen_extent, ve_ctx, ve_render )
|
||||
}
|
||||
}
|
||||
|
||||
@ -307,6 +308,9 @@ render_text_layer :: proc( screen_extent : Vec2, ve_ctx : ^ve.Context, render :
|
||||
|
||||
ve.flush_draw_list_layer( ve_ctx )
|
||||
|
||||
screen_width := u32(screen_extent.x * 2)
|
||||
screen_height := u32(screen_extent.y * 2)
|
||||
|
||||
for & draw_call in calls_layer_slice
|
||||
{
|
||||
watch := draw_call
|
||||
@ -334,8 +338,8 @@ render_text_layer :: proc( screen_extent : Vec2, ve_ctx : ^ve.Context, render :
|
||||
}
|
||||
gfx.begin_pass( pass )
|
||||
|
||||
// sokol_gfx.apply_viewport( 0,0, width, height, origin_top_left = true )
|
||||
// sokol_gfx.apply_scissor_rect( 0,0, width, height, origin_top_left = true )
|
||||
gfx.apply_viewport( 0,0, width, height, origin_top_left = true )
|
||||
gfx.apply_scissor_rect( 0,0, width, height, origin_top_left = true )
|
||||
|
||||
gfx.apply_pipeline( glyph_pipeline )
|
||||
|
||||
@ -370,8 +374,8 @@ render_text_layer :: proc( screen_extent : Vec2, ve_ctx : ^ve.Context, render :
|
||||
}
|
||||
gfx.begin_pass( pass )
|
||||
|
||||
// sokol_gfx.apply_viewport( 0, 0, width, height, origin_top_left = true )
|
||||
// sokol_gfx.apply_scissor_rect( 0, 0, width, height, origin_top_left = true )
|
||||
gfx.apply_viewport( 0, 0, width, height, origin_top_left = true )
|
||||
gfx.apply_scissor_rect( 0, 0, width, height, origin_top_left = true )
|
||||
|
||||
gfx.apply_pipeline( atlas_pipeline )
|
||||
|
||||
@ -407,10 +411,8 @@ render_text_layer :: proc( screen_extent : Vec2, ve_ctx : ^ve.Context, render :
|
||||
pass.swapchain = sokol_glue.swapchain()
|
||||
gfx.begin_pass( pass )
|
||||
|
||||
// width := u32(screen_extent.x * 2)
|
||||
// height := u32(screen_extent.y * 2)
|
||||
// sokol_gfx.apply_viewport( 0, 0, width, height, origin_top_left = true )
|
||||
// sokol_gfx.apply_scissor_rect( 0, 0, width, height, origin_top_left = true )
|
||||
gfx.apply_viewport( 0, 0, screen_width, screen_height, origin_top_left = true )
|
||||
gfx.apply_scissor_rect( 0, 0, screen_width, screen_height, origin_top_left = true )
|
||||
|
||||
gfx.apply_pipeline( screen_pipeline )
|
||||
|
||||
@ -453,7 +455,7 @@ render_text_layer :: proc( screen_extent : Vec2, ve_ctx : ^ve.Context, render :
|
||||
}
|
||||
}
|
||||
|
||||
render_ui_via_box_tree :: proc( root : ^UI_Box, screen_extent : Vec2, ve_ctx : ^ve.Context, ve_render : VE_RenderData, cam : ^Camera = nil )
|
||||
render_ui_via_box_tree :: proc( ui : ^UI_State, screen_extent : Vec2, ve_ctx : ^ve.Context, ve_render : VE_RenderData, cam : ^Camera = nil )
|
||||
{
|
||||
debug := get_state().debug
|
||||
default_font := get_state().default_font
|
||||
@ -464,8 +466,14 @@ render_ui_via_box_tree :: proc( root : ^UI_Box, screen_extent : Vec2, ve_ctx : ^
|
||||
text_enqueued : b32 = false
|
||||
shape_enqueued : b32 = false
|
||||
|
||||
render_set_view_space(screen_extent)
|
||||
if cam != nil {
|
||||
// gp.reset_transform()
|
||||
// render_set_camera(cam^) // This should apply the necessary transformation
|
||||
}
|
||||
|
||||
previous_layer : i32 = 0
|
||||
for box := root.first; box != nil; box = ui_box_tranverse_next_depth_first( box )
|
||||
for box := ui.root.first; box != nil; box = ui_box_tranverse_next_depth_first( box, bypass_intersection_test = false, ctx = ui )
|
||||
{
|
||||
if box.ancestors != previous_layer {
|
||||
if shape_enqueued do render_flush_gp()
|
||||
@ -474,6 +482,10 @@ render_ui_via_box_tree :: proc( root : ^UI_Box, screen_extent : Vec2, ve_ctx : ^
|
||||
text_enqueued = false
|
||||
}
|
||||
|
||||
if ! intersects_range2(ui_view_bounds(ui), box.computed.bounds) {
|
||||
continue
|
||||
}
|
||||
|
||||
border_width := box.layout.border_width
|
||||
computed := box.computed
|
||||
font_size := box.layout.font_size
|
||||
@ -482,11 +494,11 @@ render_ui_via_box_tree :: proc( root : ^UI_Box, screen_extent : Vec2, ve_ctx : ^
|
||||
|
||||
using computed
|
||||
|
||||
// profile("enqueue box")
|
||||
profile("enqueue box")
|
||||
|
||||
GP_Render:
|
||||
{
|
||||
// profile("draw_shapes")
|
||||
profile("draw_shapes")
|
||||
if style.bg_color.a != 0
|
||||
{
|
||||
draw_rect( bounds, style.bg_color )
|
||||
@ -682,7 +694,7 @@ draw_text_string_pos_extent :: proc( content : string, id : FontID, size : f32,
|
||||
|
||||
draw_text_string_pos_extent_zoomed :: proc( content : string, id : FontID, size : f32, pos : Vec2, cam : Camera, color := Color_White )
|
||||
{
|
||||
// profile(#procedure)
|
||||
profile(#procedure)
|
||||
state := get_state(); using state
|
||||
|
||||
cam_offset := Vec2 {
|
||||
@ -701,7 +713,7 @@ draw_text_string_pos_extent_zoomed :: proc( content : string, id : FontID, size
|
||||
zoom_adjust_size := size * cam.zoom
|
||||
|
||||
// Over-sample font-size for any render under a camera
|
||||
over_sample : f32 = zoom_adjust_size <= 8 ? 1.0 : f32(state.config.font_size_canvas_scalar)
|
||||
over_sample : f32 = f32(state.config.font_size_canvas_scalar)
|
||||
zoom_adjust_size *= over_sample
|
||||
|
||||
ve_id, resolved_size := font_provider_resolve_draw_id( id, zoom_adjust_size )
|
||||
|
@ -99,7 +99,7 @@ font_load :: proc(path_file : string,
|
||||
def.path_file = path_file
|
||||
def.default_size = default_size
|
||||
|
||||
for font_size : i32 = clamp( Font_Size_Interval, 10, Font_Size_Interval ); font_size <= Font_Largest_Px_Size; font_size += Font_Size_Interval
|
||||
for font_size : i32 = clamp( Font_Size_Interval, 2, Font_Size_Interval ); font_size <= Font_Largest_Px_Size; font_size += Font_Size_Interval
|
||||
{
|
||||
// logf("Loading at size %v", font_size)
|
||||
id := (font_size / Font_Size_Interval) + (font_size % Font_Size_Interval)
|
||||
@ -121,7 +121,7 @@ font_provider_resolve_draw_id :: proc( id : FontID, size := Font_Use_Default_Siz
|
||||
def := hmap_chained_get( font_cache, id.key )
|
||||
size := size == 0.0 ? f32(def.default_size) : size
|
||||
even_size := math.round(size * (1.0 / f32(Font_Size_Interval))) * f32(Font_Size_Interval)
|
||||
resolved_size = clamp( i32( even_size), 12, Font_Largest_Px_Size )
|
||||
resolved_size = clamp( i32( even_size), 2, Font_Largest_Px_Size )
|
||||
|
||||
id := (resolved_size / Font_Size_Interval) + (resolved_size % Font_Size_Interval)
|
||||
ve_id = def.size_table[ id - 1 ]
|
||||
@ -134,3 +134,10 @@ measure_text_size :: proc( text : string, font : FontID, font_size := Font_Use_D
|
||||
measured := ve.measure_text_size( & get_state().font_provider_ctx.ve_ctx, ve_id, text )
|
||||
return measured
|
||||
}
|
||||
|
||||
get_font_vertical_metrics :: #force_inline proc ( font : FontID, font_size := Font_Use_Default_Size ) -> ( ascent, descent, line_gap : f32 )
|
||||
{
|
||||
ve_id, size := font_provider_resolve_draw_id( font, font_size )
|
||||
ascent, descent, line_gap = ve.get_font_vertical_metrics( & get_state().font_provider_ctx.ve_ctx, ve_id )
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user