added font properties
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 17 Feb 2021 20:51:30 +0000 (14:51 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 17 Feb 2021 20:51:30 +0000 (14:51 -0600)
src/canvas.onyx
src/prez.onyx
src/slides.onyx

index d0ec3bc1dfcd2aacd86b291c6569f66c49068dc9..c047bd4869394e8a39531f6576c7b122eef6be28 100644 (file)
@@ -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);
+}
+
index eb3da2ce5992f29e783f656ea5d01972efa46057..e99dc9c3b186ba61f55ca302a99197081a0f8ef8 100644 (file)
@@ -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;
     }
 }
 
index 30a63347725d892d5b8bb06914e2fbf526b963f0..273a526c148b28362f7761650c4d138ad3d0fade 100644 (file)
@@ -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;
 }