From 8a937163a8df3b9f0ce751eebabc9eff9cfbe046 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 17 Feb 2021 12:43:51 -0600 Subject: [PATCH] made a small dummy slide that is customizable --- src/build.onyx | 1 + src/canvas.onyx | 48 +++++++++++++++++++++++++ src/prez.onyx | 93 +++++++++++++++++++------------------------------ src/slides.onyx | 63 ++++++++++++++++++++++++++++++--- 4 files changed, 143 insertions(+), 62 deletions(-) create mode 100644 src/canvas.onyx diff --git a/src/build.onyx b/src/build.onyx index 84315f8..e5f5cde 100644 --- a/src/build.onyx +++ b/src/build.onyx @@ -9,3 +9,4 @@ use package build_opts as build_opts #load "src/prez" #load "src/events" #load "src/slides" +#load "src/canvas" diff --git a/src/canvas.onyx b/src/canvas.onyx new file mode 100644 index 0000000..d0ec3bc --- /dev/null +++ b/src/canvas.onyx @@ -0,0 +1,48 @@ +use package core + +Canvas :: struct { + Handle :: #type u32 + + init :: (id: str) -> Handle #foreign "canvas" "init" --- + clear :: (handle: Handle, r: f32, g: f32, b: f32, a := 1.0f) -> Handle #foreign "canvas" "clear" --- + + get_width :: (handle: Handle) -> u32 #foreign "canvas" "get_width" --- + get_height :: (handle: Handle) -> u32 #foreign "canvas" "get_height" --- + + set_size :: (handle: Handle, width: u32, height: u32) -> void #foreign "canvas" "set_size" --- + + set_font :: (handle: Handle, font_name: str) -> u32 #foreign "canvas" "setFont" --- + + TextMetrics :: struct { + width : f32; + box : Box; + + Box :: struct { + left, right : f32; + top, bottom : f32; + } + } + + measure_text :: (handle: Handle, text: str, measurements: ^TextMetrics) -> void #foreign "canvas" "measureText" --- + + fill_rect :: (handle: Handle, + x: f32, y: f32, w: f32, h: f32, + r: f32, g: f32, b: f32, a := 1.0f) -> void #foreign "canvas" "fillRect" --- + + fill_text :: (handle: Handle, text: str, x: f32, y: f32, max_width: f32 = -1.0f) -> void #foreign "canvas" "fillText" --- +} + +// :GlobalVariable +canvas: Canvas.Handle + +setup_canvas :: () { + use Canvas + + canvas = init("prez_canvas"); + assert(canvas != -1, "Failed to set up canvas."); + + clear(canvas, 0.1, 0.1, 0.1); + + set_font(canvas, "bold 72px Arial"); +} + diff --git a/src/prez.onyx b/src/prez.onyx index c5b7ec1..6f810aa 100644 --- a/src/prez.onyx +++ b/src/prez.onyx @@ -1,52 +1,7 @@ use package core use package event as event -Canvas :: struct { - Handle :: #type u32 - - init :: (id: str) -> Handle #foreign "canvas" "init" --- - clear :: (handle: Handle, r: f32, g: f32, b: f32, a := 1.0f) -> Handle #foreign "canvas" "clear" --- - - get_width :: (handle: Handle) -> u32 #foreign "canvas" "get_width" --- - get_height :: (handle: Handle) -> u32 #foreign "canvas" "get_height" --- - - set_size :: (handle: Handle, width: u32, height: u32) -> void #foreign "canvas" "set_size" --- - - set_font :: (handle: Handle, font_name: str) -> u32 #foreign "canvas" "setFont" --- - - TextMetrics :: struct { - width : f32; - box : Box; - - Box :: struct { - left, right : f32; - top, bottom : f32; - } - } - - measure_text :: (handle: Handle, text: str, measurements: ^TextMetrics) -> void #foreign "canvas" "measureText" --- - - fill_rect :: (handle: Handle, - x: f32, y: f32, w: f32, h: f32, - r: f32, g: f32, b: f32, a := 1.0f) -> void #foreign "canvas" "fillRect" --- - - fill_text :: (handle: Handle, text: str, x: f32, y: f32, max_width: f32 = -1.0f) -> void #foreign "canvas" "fillText" --- -} - -// :GlobalVariable -canvas: Canvas.Handle - -setup_canvas :: () { - use Canvas - - canvas = init("prez_canvas"); - assert(canvas != -1, "Failed to set up canvas."); - - clear(canvas, 0.1, 0.1, 0.1); - - set_font(canvas, "bold 72px Arial"); -} - +// @Cleanup: Move this elsewhere draw_centered_text :: (text: str, y_baseline: f32) { use Canvas @@ -60,7 +15,11 @@ draw_centered_text :: (text: str, y_baseline: f32) { fill_text(canvas, text, x, y_baseline * height); } -dirty_display := true +// 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 +// when needed prevents this issue. +redraw := 0 poll_events :: () { use event.DomEventKind @@ -69,7 +28,7 @@ poll_events :: () { while event.poll(^ev) do switch ev.kind { case Resize { printf("New window size: %i, %i\n", ev.resize.width, ev.resize.height); - dirty_display = true; + redraw = 2; use Canvas set_size(canvas, ev.resize.width, ev.resize.height); @@ -77,9 +36,6 @@ poll_events :: () { case MouseDown { printf("Mouse down: %i, %i\n", ev.mouse.pos_x, ev.mouse.pos_y); - - use Canvas - fill_rect(canvas, ~~ ev.mouse.pos_x, ~~ ev.mouse.pos_y, 32, 32, 1, 0, 0); } } } @@ -87,15 +43,34 @@ poll_events :: () { loop :: () -> void #export "loop" { poll_events(); - if dirty_display { - dirty_display = false; + if redraw > 0 { + current_slide := slideshow_get_current_slide(^the_slideshow); + slide_render(current_slide); - Canvas.clear(canvas, 0.1, 0.1, 0.1); - Canvas.set_font(canvas, "bold 72px Arial"); - draw_centered_text("Hello, World! This is a long title!", .3); + redraw -= 1; + } +} - Canvas.set_font(canvas, "bold 48px Arial"); - draw_centered_text("This is some more text.", 170); +the_slideshow : Slideshow; + +create_dummy_show :: () { + the_slideshow = slideshow_make(); + + { // Slide 1 + slide := slideshow_insert_slide(^the_slideshow); + slide_init(slide, background_color = Color.{ 0.1, 0.1, 0.2 }, item_count = 2); + + slide.items[0] = slideshow_make_item(^the_slideshow); + 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[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"; } } @@ -103,6 +78,8 @@ main :: (args: [] cstr) { setup_canvas(); event.init(); + create_dummy_show(); + start_loop :: () -> void #foreign "host" "start_loop" --- start_loop(); } diff --git a/src/slides.onyx b/src/slides.onyx index 2808212..52a3c4f 100644 --- a/src/slides.onyx +++ b/src/slides.onyx @@ -1,7 +1,8 @@ use package core Color :: struct { - r, g, b, a: f32; + r, g, b: f32; + a: f32 = 1; } Slideshow :: struct { @@ -16,8 +17,7 @@ Slideshow :: struct { } Slide :: struct { - foreground, background: Color; - font_name : str; + background: Color; items : [] ^Slide_Item; } @@ -28,7 +28,7 @@ Slide_Item :: struct #union { Text; } - base: Slide_Item_Base; + use base: Slide_Item_Base; text: Slide_Item_Text; } @@ -39,6 +39,14 @@ Slide_Item_Base :: struct { Slide_Item_Text :: struct { use base : Slide_Item_Base; + color : Color; + + font_name : str; + font_size : u32; + font_attr : FontAttributes; + + FontAttributes :: enum #flags { Bold; Italic; Underline; } + Justify :: enum { Left; Center; Right; } text : str; @@ -64,3 +72,50 @@ slideshow_get_current_slide :: (use s: ^Slideshow) -> ^Slide { return ^slides[current_slide]; } + +slideshow_insert_slide :: (use s: ^Slideshow, at := -1) -> ^Slide { + // @Robustness: not checking the return values on these calls + + if at > 0 { + array.insert_empty(^slides, at); + return ^slides[at]; + } + + array.ensure_capacity(^slides, slides.count + 1); + return ^slides[at]; +} + +slideshow_make_item :: (use s: ^Slideshow) -> ^Slide_Item { + allocator := alloc.arena.make_allocator(^arena); + return new(Slide_Item, allocator = allocator); +} + +slide_init :: (use slide: ^Slide, background_color := Color.{0, 0, 0, 1}, item_count := 4) { + background = background_color; + + items = memory.make_slice(#type ^Slide_Item, item_count); + memory.set(items.data, 0, items.count * sizeof ^Slide_Item); +} + +slide_render :: (use slide: ^Slide) { + // I would like to alias Canvas to C here, but right now + // this does not work: + // + // C :: Canvas + // + Canvas.clear(canvas, background.r, background.g, background.b, background.a); + + for item: items do if item != null do slide_item_render(item, slide); +} + +slide_item_render :: (use slide_item: ^Slide_Item, slide: ^Slide) { + use Canvas + use Slide_Item.Kind + + switch kind { + case Text { + set_font(canvas, text.font_name); + draw_centered_text(text.text, text.y_pos); + } + } +} -- 2.25.1