From 4ae7afd6c8ea8695666df3f6bdbe0105d1947925 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 17 Feb 2021 14:51:30 -0600 Subject: [PATCH] added font properties --- src/canvas.onyx | 13 ++++++++++ src/prez.onyx | 57 +++++++++++++++++++++++++----------------- src/slides.onyx | 66 ++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 110 insertions(+), 26 deletions(-) diff --git a/src/canvas.onyx b/src/canvas.onyx index d0ec3bc..c047bd4 100644 --- a/src/canvas.onyx +++ b/src/canvas.onyx @@ -46,3 +46,16 @@ setup_canvas :: () { set_font(canvas, "bold 72px Arial"); } +draw_centered_text :: (text: str, y_baseline: f32) { + use Canvas + + width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas); + + font_metrics: TextMetrics; + measure_text(canvas, text, ^font_metrics); + + x := (width - font_metrics.width) / 2; + + fill_text(canvas, text, x, y_baseline * height); +} + diff --git a/src/prez.onyx b/src/prez.onyx index eb3da2c..e99dc9c 100644 --- a/src/prez.onyx +++ b/src/prez.onyx @@ -1,20 +1,6 @@ use package core use package event as event -// @Cleanup: Move this elsewhere -draw_centered_text :: (text: str, y_baseline: f32) { - use Canvas - - width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas); - - font_metrics: TextMetrics; - measure_text(canvas, text, ^font_metrics); - - x := (width - font_metrics.width) / 2; - - fill_text(canvas, text, x, y_baseline * height); -} - // This is an integer, not a boolean, because I was noticing an issue // where the slide would redraw, but the screen would still be blank // because the window was still resizing. Having it do multiple redraws @@ -24,11 +10,12 @@ redraw := 0 poll_events :: () { use event.DomEventKind + redraw = 2; + ev: event.Event; while event.poll(^ev) do switch ev.kind { case Resize { printf("New window size: %i, %i\n", ev.resize.width, ev.resize.height); - redraw = 2; use Canvas set_size(canvas, ev.resize.width, ev.resize.height); @@ -42,9 +29,19 @@ poll_events :: () { case Right do slideshow_advance_slide(^the_slideshow, -1); case #default do slideshow_advance_slide(^the_slideshow, 1); } + } + + case KeyDown { + printf("Keydown: %i\n", ev.keyboard.keycode); - redraw = 2; + switch ev.keyboard.keycode { + case 0x25 do slideshow_advance_slide(^the_slideshow, -1); + case 0x27 do slideshow_advance_slide(^the_slideshow, 1); + } } + + } else { + redraw = 0; } } @@ -72,13 +69,20 @@ create_dummy_show :: () { slide.items[0].kind = Slide_Item.Kind.Text; slide.items[0].text.text = "Hello, World!"; slide.items[0].text.y_pos = .5; - slide.items[0].text.font_name = "bold 72px Arail"; + slide.items[0].text.font_name = "Arail"; + slide.items[0].text.font_size = 72; + slide.items[0].text.font_attr = Slide_Item_Text.FontAttributes.Bold; + slide.items[0].text.justify = Slide_Item_Text.Justify.Center; slide.items[1] = slideshow_make_item(^the_slideshow); slide.items[1].kind = Slide_Item.Kind.Text; slide.items[1].text.text = "Another, smaller, line of text below the first!"; slide.items[1].text.y_pos = .6; - slide.items[1].text.font_name = "italic 36px Arail"; + slide.items[1].text.font_name = "Arail"; + slide.items[1].text.font_size = 36; + slide.items[1].text.font_attr = Slide_Item_Text.FontAttributes.Italic; + slide.items[1].text.padding = .07; + slide.items[1].text.justify = Slide_Item_Text.Justify.Right; } { // Slide 2 @@ -89,19 +93,28 @@ create_dummy_show :: () { slide.items[0].kind = Slide_Item.Kind.Text; slide.items[0].text.text = "The Second Slide! Duh duh duhhhh"; slide.items[0].text.y_pos = .2; - slide.items[0].text.font_name = "bold 72px Arail"; + slide.items[0].text.font_name = "Arail"; + slide.items[0].text.font_size = 72; + slide.items[0].text.font_attr = Slide_Item_Text.FontAttributes.Bold; + slide.items[0].text.justify = Slide_Item_Text.Justify.Center; slide.items[1] = slideshow_make_item(^the_slideshow); slide.items[1].kind = Slide_Item.Kind.Text; slide.items[1].text.text = "Here is some monospace text."; slide.items[1].text.y_pos = .4; - slide.items[1].text.font_name = "36px monospace"; + slide.items[1].text.font_name = "monospace"; + slide.items[1].text.font_size = 36; + slide.items[1].text.padding = .07; + slide.items[1].text.justify = Slide_Item_Text.Justify.Left; slide.items[2] = slideshow_make_item(^the_slideshow); slide.items[2].kind = Slide_Item.Kind.Text; slide.items[2].text.text = "Here is a block of much longer text that will not wrap correctly, which is annoying but I think the best thing to do is... I don't know yet."; - slide.items[2].text.y_pos = .7; - slide.items[2].text.font_name = "36px Calibri"; + slide.items[2].text.y_pos = .45; + slide.items[2].text.font_name = "Calibri"; + slide.items[2].text.font_size = 36; + slide.items[2].text.padding = .07; + slide.items[2].text.justify = Slide_Item_Text.Justify.Left; } } diff --git a/src/slides.onyx b/src/slides.onyx index 30a6334..273a526 100644 --- a/src/slides.onyx +++ b/src/slides.onyx @@ -47,11 +47,12 @@ Slide_Item_Text :: struct { FontAttributes :: enum #flags { Bold; Italic; Underline; } - Justify :: enum { Left; Center; Right; } - text : str; y_pos : f32; // Between 0 and 1 + padding : f32; // Between 0 and 1 justify : Justify; + + Justify :: enum { Left; Center; Right; } } @@ -130,8 +131,65 @@ slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide) { switch kind { case Text { - set_font(canvas, text.font_name); - draw_centered_text(text.text, text.y_pos); + set_font_for_text(slide_item); + + use Slide_Item_Text.Justify + switch text.justify { + case Center do draw_centered_text(text.text, text.y_pos); + + case Left { + use Canvas + + width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas); + x, y := text.padding * width, text.y_pos * height; + fill_text(canvas, text.text, x, y); + } + + case Right { + use Canvas + + width, height := cast(f32) get_width(canvas), cast(f32) get_height(canvas); + + font_metrics: TextMetrics; + measure_text(canvas, text.text, ^font_metrics); + + x, y := width - font_metrics.width - text.padding * width, text.y_pos * height; + fill_text(canvas, text.text, x, y); + } + } } } + + + set_font_for_text :: (use slide_item: ^Slide_Item) { + use Slide_Item_Text.FontAttributes + use Canvas + + bold_str := ""; + italic_str := ""; + underline_str := ""; + + if text.font_attr & Bold != ~~ 0 do bold_str = "bold"; + if text.font_attr & Italic != ~~ 0 do italic_str = "italic"; + if text.font_attr & Underline != ~~ 0 do underline_str = "underline"; + + formatted_name := aprintf( + context.allocator, + "%s %s %s %ipx %s", + bold_str, italic_str, underline_str, + text.font_size, text.font_name); + defer cfree(formatted_name.data); + + set_font(canvas, formatted_name); + } +} + +// @Cleanup: this should be part of the standard library. +aprintf :: (allocator: Allocator, format: str, va: ...) -> str { + // @Robustness: Same potential overflow bug. + buffer: [2048] u8; + formatted := conv.str_format_va(format, ~~buffer, va); + + output := string.alloc_copy(formatted, allocator = allocator); + return output; } -- 2.25.1