diff --git a/sysdata/libraries/render/src/lib.hb b/sysdata/libraries/render/src/lib.hb index 3bb56c3c..9227f528 100644 --- a/sysdata/libraries/render/src/lib.hb +++ b/sysdata/libraries/render/src/lib.hb @@ -1,4 +1,3 @@ -.{memory} := @use("../../stn/src/lib.hb") software := @use("software.hb") image := @use("image.hb") @@ -7,34 +6,11 @@ mode := software init := mode.init doublebuffer := mode.doublebuffer - -Surface := struct { - buf: ^Color, - width: int, - height: int, -} - -new_surface := fn(width: int, height: int): Surface { - return .( - @inline(memory.alloc, Color, width * height * @bitcast(@sizeof(Color))), - width, - height, - ) -} - -surface_from_ptr := fn(ptr: ^Color, width: int, height: int): Surface { - return .( - ptr, - width, - height, - ) -} - -clone_surface := fn(surface: Surface): Surface { - new := new_surface(surface.width, surface.height) - @inline(memory.copy, Color, surface.buf, new.buf, @intcast(surface.width * surface.height)) - return new -} +Surface := mode.Surface +new_surface := mode.new_surface +surface_from_ptr := mode.surface_from_ptr +clone_surface := mode.clone_surface +free_surface := mode.free_surface // Colours Color := packed struct {b: u8, g: u8, r: u8, a: u8} @@ -68,10 +44,4 @@ put_vline := mode.put_vline put_hline := mode.put_hline // Display -// width := mode.width -// height := mode.height -// dimensions := mode.dimensions -// set_height := mode.set_height -// set_width := mode.set_width -// set_dimensions := mode.set_dimensions sync := mode.sync \ No newline at end of file diff --git a/sysdata/libraries/render/src/software.hb b/sysdata/libraries/render/src/software.hb index ae8905b6..8cd0b744 100644 --- a/sysdata/libraries/render/src/software.hb +++ b/sysdata/libraries/render/src/software.hb @@ -1,14 +1,47 @@ .{math, memory, dt} := @use("../../stn/src/lib.hb"); -.{Color, Surface, new_surface} := @use("lib.hb"); +.{Color} := @use("lib.hb"); .{Vec2} := math +Surface := struct { + buf: ^Color, + width: int, + height: int, +} + +new_surface := fn(width: int, height: int): Surface { + return .( + @inline(memory.alloc, Color, width * height), + width, + height, + ) +} + +surface_from_ptr := fn(ptr: ^Color, width: int, height: int): Surface { + return .( + ptr, + width, + height, + ) +} + +clone_surface := fn(surface: ^Surface): Surface { + new := new_surface(surface.width, surface.height) + @inline(memory.copy, Color, surface.buf, new.buf, @intcast(surface.width * surface.height)) + return new +} + +free_surface := fn(surface: ^Surface): void { + // todo + return +} + framebuffer := @as(^Color, idk) -init := fn(double_buffer: bool): Surface { +init := fn(doublebuffer: bool): Surface { framebuffer = dt.get(^Color, "framebuffer/fb0/ptr\0") width := dt.get(int, "framebuffer/fb0/width\0") height := dt.get(int, "framebuffer/fb0/height\0") - if double_buffer { + if doublebuffer { return new_surface(width, height) } else { return .(framebuffer, width, height) diff --git a/sysdata/libraries/stn/src/memory.hb b/sysdata/libraries/stn/src/memory.hb index 9b89cbea..b51c5ad3 100644 --- a/sysdata/libraries/stn/src/memory.hb +++ b/sysdata/libraries/stn/src/memory.hb @@ -1,8 +1,8 @@ PAGE_SIZE := 4096 MAX_ALLOC := 0xFF -alloc := fn($Expr: type, bytes: int): ^Expr { - pages := 1 + bytes / PAGE_SIZE +alloc := fn($Expr: type, num: int): ^Expr { + pages := 1 + @bitcast(@sizeof(Expr)) * num / PAGE_SIZE if pages <= MAX_ALLOC { return @bitcast(@inline(request_page, pages)) } @@ -19,6 +19,11 @@ alloc := fn($Expr: type, bytes: int): ^Expr { return @bitcast(ptr) } +free := fn($Expr: type, ptr: ^Expr, num: int): void { + // todo + return +} + request_page := fn(page_count: u8): ^u8 { msg := "\{00}\{01}xxxxxxxx\0" msg_page_count := msg + 1; diff --git a/sysdata/programs/render_example/src/examples/surface.hb b/sysdata/programs/render_example/src/examples/surface.hb index 191c8ad8..a3b75ac9 100644 --- a/sysdata/programs/render_example/src/examples/surface.hb +++ b/sysdata/programs/render_example/src/examples/surface.hb @@ -16,13 +16,14 @@ example := fn(): void { pos_inner := Vec2(int).((image.width - side) / 2, (image.height - side) / 2) color := random.range(render.Color, render.black, render.white) loop { - render.clear(image, render.black) render.clear(screen, render.black) - + // color += .(1, 1, 1, 1) render.put_filled_rect(image, pos_inner, .(side, side), color) - render.put_rect(image, .(0, 0), .(image.width - 1, image.height - 1), render.white) + render.put_rect(image, pos_inner, .(side, side), render.black) + render.put_rect(image, .(0, 0), .(image.width - 1, image.height - 1), color) render.put_surface(screen, image, pos) + render.put_rect(image, pos_inner, .(side, side), color) render.sync(screen) if pos_inner.x == 0 | pos_inner.x == image.width - side { diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml index 835b3fda..e5deef95 100644 --- a/sysdata/system_config.toml +++ b/sysdata/system_config.toml @@ -31,17 +31,17 @@ resolution = "1024x768x24" # [boot.limine.ableos.modules.diskio_driver] # path = "boot:///diskio_driver.hbf" -# [boot.limine.ableos.modules.render_example] -# path = "boot:///render_example.hbf" +[boot.limine.ableos.modules.render_example] +path = "boot:///render_example.hbf" # [boot.limine.ableos.modules.serial_driver_test] # path = "boot:///serial_driver_test.hbf" -[boot.limine.ableos.modules.horizon] -path = "boot:///horizon.hbf" +# [boot.limine.ableos.modules.horizon] +# path = "boot:///horizon.hbf" -[boot.limine.ableos.modules.horizon_testing_program] -path = "boot:///horizon_testing_program.hbf" +# [boot.limine.ableos.modules.horizon_testing_program] +# path = "boot:///horizon_testing_program.hbf" # [boot.limine.ableos.modules.dt_buffer_test] # path = "boot:///dt_buffer_test.hbf"