From 4fb25d1d4937e3c3a3a53b532376687b53547989 Mon Sep 17 00:00:00 2001 From: Reuben Dunnington Date: Sun, 17 Sep 2023 21:31:09 -0700 Subject: [PATCH] wip zig orca bindings --- samples/zig-sample/data/orca_jumping.jpg | Bin 0 -> 156721 bytes samples/zig-sample/src/main.zig | 132 +- src/app/app.c | 2 +- src/graphics/graphics.h | 6 +- src/graphics/graphics_common.c | 6 +- src/orca.zig | 1477 +++++++++++++++++----- 6 files changed, 1258 insertions(+), 365 deletions(-) create mode 100644 samples/zig-sample/data/orca_jumping.jpg diff --git a/samples/zig-sample/data/orca_jumping.jpg b/samples/zig-sample/data/orca_jumping.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50e1c35d2cebad278cab55c9b6af0437954c0eb5 GIT binary patch literal 156721 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뒧^b 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 literal 0 HcmV?d00001 diff --git a/samples/zig-sample/src/main.zig b/samples/zig-sample/src/main.zig index 5c0162e..5a9540e 100644 --- a/samples/zig-sample/src/main.zig +++ b/samples/zig-sample/src/main.zig @@ -2,49 +2,71 @@ const std = @import("std"); const oc = @import("orca"); const Vec2 = oc.Vec2; +const Mat2x3 = oc.Mat2x3; var surface: oc.Surface = undefined; var canvas: oc.Canvas = undefined; +var font: oc.Font = undefined; +var orca_image: oc.Image = undefined; var counter: u32 = 0; -var lastSeconds: f64 = 0; +var last_seconds: f64 = 0; +var frame_size: Vec2 = .{ .x = 0, .y = 0 }; + +var rotation_demo: f32 = 0; export fn oc_on_init() void { - oc.windowSetTitle("zig calc"); + oc.windowSetTitle("zig sample"); oc.windowSetSize(Vec2{ .x = 480, .y = 640 }); - oc.logInfo("current platform: {}", .{oc.getHostPlatform()}, @src()); + oc.log.info("current platform: {}", .{oc.getHostPlatform()}, @src()); surface = oc.Surface.canvas(); canvas = oc.Canvas.create(); oc.assert(oc.Canvas.nil().isNil() == true, "nil canvas should be nil", .{}, @src()); oc.assert(canvas.isNil() == false, "created canvas should not be nil", .{}, @src()); + + var ranges = oc.UnicodeRange.range(&[_]oc.UnicodeRange.Enum{ + .BasicLatin, + .C1ControlsAndLatin1Supplement, + .LatinExtendedA, + .LatinExtendedB, + .Specials, + }); + font = oc.Font.createFromPath("/zig.ttf", &ranges); + oc.assert(font.isNil() == false, "created font should not be nil", .{}, @src()); + + orca_image = oc.Image.createFromPath(surface, oc.Str8.fromSlice("/orca_jumping.jpg"), false); + oc.assert(orca_image.isNil() == false, "created image should not be nil", .{}, @src()); } export fn oc_on_resize(width: u32, height: u32) void { - oc.logInfo("frame resize: {}, {}", .{ width, height }, @src()); + frame_size = Vec2{ .x = @floatFromInt(width), .y = @floatFromInt(height) }; + oc.log.info("frame resize: {d:.2}, {d:.2}", .{ frame_size.x, frame_size.y }, @src()); } export fn oc_on_mouse_down(button: oc.MouseButton) void { - oc.logInfo("mouse down! {}", .{button}, @src()); + oc.log.info("mouse down! {}", .{button}, @src()); } export fn oc_on_mouse_up(button: oc.MouseButton) void { - oc.logInfo("mouse up! {}", .{button}, @src()); + oc.log.info("mouse up! {}", .{button}, @src()); } -export fn oc_on_key_down(key: oc.KeyCode) void { - oc.logInfo("key down: {}", .{key}, @src()); +export fn oc_on_key_down(scan: oc.ScanCode, key: oc.KeyCode) void { + oc.log.info("key down: {} {}", .{ scan, key }, @src()); } -export fn oc_on_key_up(key: oc.KeyCode) void { - oc.logInfo("key up: {}", .{key}, @src()); +export fn oc_on_key_up(scan: oc.ScanCode, key: oc.KeyCode) void { + oc.log.info("key up: {} {}", .{ scan, key }, @src()); switch (key) { oc.KeyCode.Escape => oc.requestQuit(), oc.KeyCode.B => oc.abort("aborting", .{}, @src()), oc.KeyCode.A => oc.assert(false, "test assert failed", .{}, @src()), + oc.KeyCode.W => oc.log.warn("logging a test warning", .{}, @src()), + oc.KeyCode.E => oc.log.err("logging a test error", .{}, @src()), else => {}, } } @@ -54,29 +76,28 @@ export fn oc_on_frame_refresh() void { const secs: f64 = oc.clockTime(oc.ClockKind.Date); - if (lastSeconds != @floor(secs)) { - lastSeconds = @floor(secs); - oc.logInfo("seconds since Jan 1, 1970: {d:.0}", .{secs}, @src()); + if (last_seconds != @floor(secs)) { + last_seconds = @floor(secs); + oc.log.info("seconds since Jan 1, 1970: {d:.0}", .{secs}, @src()); } - _ = canvas.setCurrent(); - surface.select(); + _ = canvas.select(); oc.setColorRgba(0.05, 0.05, 0.05, 1.0); oc.clear(); oc.setColorRgba(1.0, 0.05, 0.05, 1.0); { - const translation: oc.Mat2x3 = .{ .m = [_]f32{ 1, 0, 50, 0, 1, 50 } }; - translation.push(); - defer oc.Mat2x3.pop(); + const translation: Mat2x3 = .{ .m = [_]f32{ 1, 0, 50, 0, 1, 50 } }; + Mat2x3.push(translation); + defer Mat2x3.pop(); - oc.assert(std.meta.eql(oc.matrixTop(), translation), "top of matrix stack should be what we pushed", .{}, @src()); + oc.assert(std.meta.eql(Mat2x3.top(), translation), "top of matrix stack should be what we pushed", .{}, @src()); oc.setWidth(1); - oc.rectangleFill(50, 50, 10, 10); - oc.rectangleStroke(70, 50, 10, 10); - oc.roundedRectangleFill(90, 50, 10, 10, 3); - oc.roundedRectangleStroke(110, 50, 10, 10, 3); + oc.rectangleFill(50, 0, 10, 10); + oc.rectangleStroke(70, 0, 10, 10); + oc.roundedRectangleFill(90, 0, 10, 10, 3); + oc.roundedRectangleStroke(110, 0, 10, 10, 3); const green = oc.Color{ .Flat = .{ .r = 0.05, .g = 1, .b = 0.05, .a = 1 } }; oc.setColor(green); @@ -84,18 +105,69 @@ export fn oc_on_frame_refresh() void { oc.setTolerance(1); oc.setJoint(.Bevel); - oc.ellipseFill(140, 55, 10, 5); - oc.ellipseStroke(170, 55, 10, 5); - oc.circleFill(195, 55, 5); - oc.circleStroke(215, 55, 5); + oc.ellipseFill(140, 5, 10, 5); + oc.ellipseStroke(170, 5, 10, 5); + oc.circleFill(195, 5, 5); + oc.circleStroke(215, 5, 5); - oc.arc(230, 55, 5, 0, std.math.pi); + oc.arc(230, 5, 5, 0, std.math.pi); } - surface.render(canvas); + { + rotation_demo += 0.03; + + const rot = Mat2x3.rotate(rotation_demo); + const trans = Mat2x3.translate(285, 55); + Mat2x3.push(Mat2x3.mul_m(trans, rot)); + defer Mat2x3.pop(); + + oc.rectangleFill(-5, -5, 10, 10); + } + + { + const str = oc.Str8.fromSlice("Hello from Zig!"); + const font_size = 18; + const text_rect = font.textMetrics(font_size, str).ink; + + const center_x = frame_size.x / 2; + const text_begin_x = center_x - text_rect.Flat.w / 2; + + oc.log.info("text rect width: {d}", .{text_rect.Flat.w}, @src()); + oc.log.info("center_x: {d}", .{center_x}, @src()); + oc.log.info("text_begin_x: {d}", .{text_begin_x}, @src()); + + Mat2x3.push(Mat2x3.translate(text_begin_x, 150)); + defer Mat2x3.pop(); + + oc.setColorRgba(1.0, 0.05, 0.05, 1.0); + + oc.setFont(font); + oc.setFontSize(font_size); + oc.moveTo(0, 0); + oc.textOutlines(str); + oc.fill(); + } + + { + const trans = Mat2x3.translate(0, 200); + const scale = Mat2x3.scaleUniform(0.25); + Mat2x3.push(Mat2x3.mul_m(trans, scale)); + defer Mat2x3.pop(); + + const size = orca_image.size(); + + orca_image.draw(oc.Rect.xywh(0, 0, size.x, size.y)); + + var half_size = orca_image.size(); + half_size.x /= 2; + orca_image.drawRegion(oc.Rect.xywh(0, 0, half_size.x, half_size.y), oc.Rect.xywh(size.x + 10, 0, half_size.x, half_size.y)); + } + + surface.select(); + canvas.render(); surface.present(); } export fn oc_on_terminate() void { - oc.logInfo("byebye {}", .{counter}, @src()); + oc.log.info("byebye {}", .{counter}, @src()); } diff --git a/src/app/app.c b/src/app/app.c index a704722..030f02d 100644 --- a/src/app/app.c +++ b/src/app/app.c @@ -188,7 +188,7 @@ oc_key_code oc_scancode_to_keycode(oc_scan_code scanCode) return (oc_appData.keyMap[scanCode]); } -#define OC_DEFAULT_KEYMAP_ENTRY(sc, sv, ...) [(int) sc] = (oc_key_code)sc, +#define OC_DEFAULT_KEYMAP_ENTRY(sc, sv, kc, ...) [(int) sc] = OC_VA_NOPT(sv, ##__VA_ARGS__) __VA_ARGS__, oc_key_code oc_defaultKeyMap[OC_SCANCODE_COUNT] = { OC_KEY_TABLE(OC_DEFAULT_KEYMAP_ENTRY) diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index 0b0e970..00cd6ab 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -227,9 +227,9 @@ ORCA_API void oc_render(oc_canvas canvas); //DOC: renders all canvas ORCA_API oc_font oc_font_nil(void); ORCA_API bool oc_font_is_nil(oc_font font); -ORCA_API oc_font oc_font_create_from_memory(oc_str8 mem, u32 rangeCount, oc_unicode_range* ranges); -ORCA_API oc_font oc_font_create_from_file(oc_file file, u32 rangeCount, oc_unicode_range* ranges); -ORCA_API oc_font oc_font_create_from_path(oc_str8 path, u32 rangeCount, oc_unicode_range* ranges); +ORCA_API oc_font oc_font_create_from_memory(oc_str8 mem, u32 rangeCount, const oc_unicode_range* ranges); +ORCA_API oc_font oc_font_create_from_file(oc_file file, u32 rangeCount, const oc_unicode_range* ranges); +ORCA_API oc_font oc_font_create_from_path(oc_str8 path, u32 rangeCount, const oc_unicode_range* ranges); ORCA_API void oc_font_destroy(oc_font font); diff --git a/src/graphics/graphics_common.c b/src/graphics/graphics_common.c index 2ce3900..9658ddd 100644 --- a/src/graphics/graphics_common.c +++ b/src/graphics/graphics_common.c @@ -369,7 +369,7 @@ oc_font_data* oc_font_data_from_handle(oc_font handle) return (data); } -oc_font oc_font_create_from_memory(oc_str8 mem, u32 rangeCount, oc_unicode_range* ranges) +oc_font oc_font_create_from_memory(oc_str8 mem, u32 rangeCount, const oc_unicode_range* ranges) { if(!oc_graphicsData.init) { @@ -552,7 +552,7 @@ oc_font oc_font_create_from_memory(oc_str8 mem, u32 rangeCount, oc_unicode_range return (fontHandle); } -oc_font oc_font_create_from_file(oc_file file, u32 rangeCount, oc_unicode_range* ranges) +oc_font oc_font_create_from_file(oc_file file, u32 rangeCount, const oc_unicode_range* ranges) { oc_font font = oc_font_nil(); oc_arena_scope scratch = oc_scratch_begin(); @@ -574,7 +574,7 @@ oc_font oc_font_create_from_file(oc_file file, u32 rangeCount, oc_unicode_range* return (font); } -oc_font oc_font_create_from_path(oc_str8 path, u32 rangeCount, oc_unicode_range* ranges) +oc_font oc_font_create_from_path(oc_str8 path, u32 rangeCount, const oc_unicode_range* ranges) { oc_font font = oc_font_nil(); diff --git a/src/orca.zig b/src/orca.zig index 05f01a6..dbad795 100644 --- a/src/orca.zig +++ b/src/orca.zig @@ -1,16 +1,4 @@ const std = @import("std"); -const orca_c = @cImport({ - @cDefine("__ORCA__", ""); - @cInclude("orca.h"); -}); - -pub const Str8 = orca_c.oc_str8; -pub const Str32 = orca_c.oc_str32; -pub const Utf32 = orca_c.oc_utf32; -pub const Vec2 = extern struct { - x: f32, - y: f32, -}; //------------------------------------------------------------------------------------------ // [PLATFORM] @@ -25,28 +13,52 @@ extern fn oc_get_host_platform() Platform; pub const getHostPlatform = oc_get_host_platform; //------------------------------------------------------------------------------------------ -// [DEBUG] +// [DEBUG] Logging //------------------------------------------------------------------------------------------ -pub fn logInfo(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { - logExt(orca_c.OC_LOG_LEVEL_INFO, fmt, args, source); -} +pub const log = struct { + pub const Level = enum(c_uint) { + Error, + Warning, + Info, + }; -pub fn logWarning(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { - logExt(orca_c.OC_LOG_LEVEL_WARNING, fmt, args, source); -} + pub const Output = opaque {}; -pub fn logError(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { - logExt(orca_c.OC_LOG_LEVEL_ERROR, fmt, args, source); -} + extern var OC_LOG_DEFAULT_OUTPUT: ?*Output; + extern fn oc_log_set_level(level: Level) void; + extern fn oc_log_set_output(output: *Output) void; + extern fn oc_log_ext(level: Level, function: [*]const u8, file: [*]const u8, line: c_int, fmt: [*]const u8, ...) void; -pub fn logExt(comptime level: orca_c.oc_log_level, comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { - var format_buf: [512:0]u8 = undefined; - _ = std.fmt.bufPrintZ(&format_buf, fmt, args) catch 0; // just discard NoSpaceLeft error for now - var line: c_int = @intCast(source.line); + const DEFAULT_OUTPUT = OC_LOG_DEFAULT_OUTPUT; - orca_c.oc_log_ext(level, source.fn_name.ptr, source.file.ptr, line, format_buf[0..].ptr); -} + pub fn info(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { + ext(Level.Info, fmt, args, source); + } + + pub fn warn(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { + ext(Level.Warning, fmt, args, source); + } + + pub fn err(comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { + ext(Level.Error, fmt, args, source); + } + + pub fn ext(comptime level: Level, comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { + var format_buf: [512:0]u8 = undefined; + _ = std.fmt.bufPrintZ(&format_buf, fmt, args) catch 0; // just discard NoSpaceLeft error for now + var line: c_int = @intCast(source.line); + + oc_log_ext(level, source.fn_name.ptr, source.file.ptr, line, format_buf[0..].ptr); + } +}; + +//------------------------------------------------------------------------------------------ +// [DEBUG] Assert/Abort +//------------------------------------------------------------------------------------------ + +extern fn oc_abort_ext(file: [*]const u8, function: [*]const u8, line: c_int, fmt: [*]const u8, ...) void; +extern fn oc_assert_fail(file: [*]const u8, function: [*]const u8, line: c_int, src: [*]const u8, fmt: [*]const u8, ...) void; pub fn assert(condition: bool, comptime fmt: []const u8, args: anytype, source: std.builtin.SourceLocation) void { if (condition == false) { @@ -54,7 +66,7 @@ pub fn assert(condition: bool, comptime fmt: []const u8, args: anytype, source: _ = std.fmt.bufPrintZ(&format_buf, fmt, args) catch 0; var line: c_int = @intCast(source.line); - orca_c.oc_assert_fail(source.file.ptr, source.fn_name.ptr, line, "", format_buf[0..].ptr); + oc_assert_fail(source.file.ptr, source.fn_name.ptr, line, "", format_buf[0..].ptr); } } @@ -63,7 +75,7 @@ pub fn abort(comptime fmt: []const u8, args: anytype, source: std.builtin.Source _ = std.fmt.bufPrintZ(&format_buf, fmt, args) catch 0; var line: c_int = @intCast(source.line); - orca_c.oc_abort_ext(source.file.ptr, source.fn_name.ptr, line, format_buf[0..].ptr); + oc_abort_ext(source.file.ptr, source.fn_name.ptr, line, format_buf[0..].ptr); } //------------------------------------------------------------------------------------------ @@ -181,30 +193,279 @@ pub const ArenaOptions = extern struct { }; //------------------------------------------------------------------------------------------ -// [STRINGS] +// [STRINGS] u8 strings //------------------------------------------------------------------------------------------ +fn stringType(comptime CharType: type) type { + return extern struct { + const Self = @This(); + + ptr: ?[*]CharType, + len: usize, + + extern fn strncmp(a: ?[*]u8, b: ?[*]u8, len: usize) c_int; + + // extern fn oc_str8_push_buffer(arena: *Arena, len: u64, buffer: [*]u8) oc_str8; + // extern fn oc_str8_push_cstring(arena: *Arena, str: [*]const u8) oc_str8; + // extern fn oc_str8_push_copy(arena: *Arena, s: oc_str8) oc_str8; + // extern fn oc_str8_push_slice(arena: *Arena, s: oc_str8, start: u64, end: u64) oc_str8; + // // extern fn oc_str8_pushfv(arena: oc_arena*, char: const* format, args: va_list) oc_str8; + // // extern fn oc_str8_pushf(arena: oc_arena*, char: const* format, ...) oc_str8; + // extern fn oc_str8_cmp(s1: oc_str8, s2: oc_str8) c_int; + + // extern fn oc_str8_list_push(oc_arena* arena, oc_str8_list* list, oc_str8 str) void; + // extern fn oc_str8_list_pushf(oc_arena* arena, oc_str8_list* list, const char* format, ...) void; + + // extern fn oc_str8_list_collate(oc_arena* arena, oc_str8_list list, oc_str8 prefix, oc_str8 separator, oc_str8 postfix) oc_str8; + // extern fn oc_str8_list_join(oc_arena* arena, oc_str8_list list) oc_str8; + // extern fn oc_str8_split(oc_arena* arena, oc_str8 str, oc_str8_list separators) oc_str8_list; + + // extern fn oc_str16_from_buffer(u64 len, u16* buffer) oc_str16; + // extern fn oc_str16_slice(oc_str16 s, u64 start, u64 end) oc_str16; + + // extern fn oc_str16_push_buffer(oc_arena* arena, u64 len, u16* buffer) oc_str16; + // extern fn oc_str16_push_copy(oc_arena* arena, oc_str16 s) oc_str16; + // extern fn oc_str16_push_slice(oc_arena* arena, oc_str16 s, u64 start, u64 end) oc_str16; + // extern fn oc_str16_list_push(oc_arena* arena, oc_str16_list* list, oc_str16 str) void; + // extern fn oc_str16_list_join(oc_arena* arena, oc_str16_list list) oc_str16; + // extern fn oc_str16_split(oc_arena* arena, oc_str16 str, oc_str16_list separators) oc_str16_list; + // extern fn oc_str32_from_buffer(u64 len, u32* buffer) oc_str32; + // extern fn oc_str32_slice(oc_str32 s, u64 start, u64 end) oc_str32; + + // extern fn oc_str32_push_buffer(oc_arena* arena, u64 len, u32* buffer) oc_str32; + // extern fn oc_str32_push_copy(oc_arena* arena, oc_str32 s) oc_str32; + // extern fn oc_str32_push_slice(oc_arena* arena, oc_str32 s, u64 start, u64 end) oc_str32; + // extern fn oc_str32_list_push(oc_arena* arena, oc_str32_list* list, oc_str32 str) void; + // extern fn oc_str32_list_join(oc_arena* arena, oc_str32_list list) oc_str32; + // extern fn oc_str32_split(oc_arena* arena, oc_str32 str, oc_str32_list separators) oc_str32_list; + + pub fn fromSlice(str: []const CharType) Self { + return .{ + .ptr = @constCast(str.ptr), + .len = str.len, + }; + } + + pub fn slice(self: *const Self) []CharType { + if (self.ptr) |p| { + return p[0..self.len]; + } + + return &[_]CharType{}; + } + + pub fn sliceInner(self: *const Self, start: u64, end: u64) []CharType { + if (self.ptr) |p| { + assert(start <= end, "{}.sliceLen: start <= end", .{typename()}, @src()); + assert(end <= self.len, "{}.sliceLen: end <= self.len", .{typename()}, @src()); + return p[start..end]; + } + + return &[_]CharType{}; + } + + pub fn fromBuffer(len: u64, buffer: ?[]CharType) Self { + return .{ + .ptr = buffer, + .len = @intCast(len), + }; + } + + // pub fn cmp(a: *const Self, b: *const Self) std.math.Order { + // if (CharType != u8) { + // @compileError("cmp() is only supported for Str8"); + // } + // const value = strncmp(a.ptr, b.ptr, std.math.min(a.len, b.len)); + + // } + // TODO + + fn typename() []const u8 { + return switch (CharType) { + u8 => "Str8", + u16 => "Str16", + u32 => "Str32", + else => unreachable, + }; + } + }; +} + +fn stringListEltType(comptime StringType: type) type { + return extern struct { + list_elt: ListElt, + string: StringType, + }; +} + +fn stringListType() type { + return extern struct { + list: List, + elt_count: u64, + len: u64, + }; +} + +pub const Str8 = stringType(u8); +pub const Str16 = stringType(u16); +pub const Str32 = stringType(u32); + +pub const Str8ListElt = stringListEltType(Str8); +pub const Str16ListElt = stringListEltType(Str16); +pub const Str32ListElt = stringListEltType(Str32); + +pub const Str8List = stringListType(Str8); +pub const Str16List = stringListType(Str8); +pub const Str32List = stringListType(Str8); + +// pub const Str8 = extern struct { +// ptr: ?[*:0]u8, +// len: usize, + +// pub fn fromSlice(slice: [:0]const u8) Str8 { +// return .{ +// ptr: @constCast(slice.ptr), +// len: slice.len, +// }; +// } +// }; + +// typedef struct oc_str8 +// { +// char* ptr; +// size_t len; +// } oc_str8; + +// #define OC_STR8(s) ((oc_str8){ .ptr = (char*)s, .len = (s) ? strlen(s) : 0 }) + +//NOTE: this only works with string literals, but is sometimes necessary to generate compile-time constants +// #define OC_STR8_LIT(s) \ +// { \ +// (char*)(s), sizeof(s) - 1 \ +// } + +// #define oc_str8_lp(s) ((s).len), ((s).ptr) +// #define oc_str8_ip(s) (int)oc_str8_lp(s) + +// ORCA_API oc_str8 oc_str8_from_buffer(u64 len, char* buffer); +// ORCA_API oc_str8 oc_str8_slice(oc_str8 s, u64 start, u64 end); + +// ORCA_API oc_str8 oc_str8_push_buffer(oc_arena* arena, u64 len, char* buffer); +// ORCA_API oc_str8 oc_str8_push_cstring(oc_arena* arena, const char* str); +// ORCA_API oc_str8 oc_str8_push_copy(oc_arena* arena, oc_str8 s); +// ORCA_API oc_str8 oc_str8_push_slice(oc_arena* arena, oc_str8 s, u64 start, u64 end); + +// ORCA_API oc_str8 oc_str8_pushfv(oc_arena* arena, const char* format, va_list args); +// ORCA_API oc_str8 oc_str8_pushf(oc_arena* arena, const char* format, ...); + +// ORCA_API int oc_str8_cmp(oc_str8 s1, oc_str8 s2); + +// ORCA_API char* oc_str8_to_cstring(oc_arena* arena, oc_str8 string); + +// typedef struct oc_str8_elt +// { +// oc_list_elt listElt; +// oc_str8 string; +// } oc_str8_elt; + +// typedef struct oc_str8_list +// { +// oc_list list; +// u64 eltCount; +// u64 len; +// } oc_str8_list; + +// ORCA_API void oc_str8_list_push(oc_arena* arena, oc_str8_list* list, oc_str8 str); +// ORCA_API void oc_str8_list_pushf(oc_arena* arena, oc_str8_list* list, const char* format, ...); + +// ORCA_API oc_str8 oc_str8_list_collate(oc_arena* arena, oc_str8_list list, oc_str8 prefix, oc_str8 separator, oc_str8 postfix); +// ORCA_API oc_str8 oc_str8_list_join(oc_arena* arena, oc_str8_list list); +// ORCA_API oc_str8_list oc_str8_split(oc_arena* arena, oc_str8 str, oc_str8_list separators); + +// //---------------------------------------------------------------------------------- +// // [STRINGS] u16 strings +// //---------------------------------------------------------------------------------- +// typedef struct oc_str16 +// { +// u16* ptr; +// size_t len; +// } oc_str16; + +// ORCA_API oc_str16 oc_str16_from_buffer(u64 len, u16* buffer); +// ORCA_API oc_str16 oc_str16_slice(oc_str16 s, u64 start, u64 end); + +// ORCA_API oc_str16 oc_str16_push_buffer(oc_arena* arena, u64 len, u16* buffer); +// ORCA_API oc_str16 oc_str16_push_copy(oc_arena* arena, oc_str16 s); +// ORCA_API oc_str16 oc_str16_push_slice(oc_arena* arena, oc_str16 s, u64 start, u64 end); + +// typedef struct oc_str16_elt +// { +// oc_list_elt listElt; +// oc_str16 string; +// } oc_str16_elt; + +// typedef struct oc_str16_list +// { +// oc_list list; +// u64 eltCount; +// u64 len; +// } oc_str16_list; + +// ORCA_API void oc_str16_list_push(oc_arena* arena, oc_str16_list* list, oc_str16 str); +// ORCA_API oc_str16 oc_str16_list_join(oc_arena* arena, oc_str16_list list); +// ORCA_API oc_str16_list oc_str16_split(oc_arena* arena, oc_str16 str, oc_str16_list separators); + +// //---------------------------------------------------------------------------------- +// // [STRINGS] u32 strings +// //---------------------------------------------------------------------------------- +// typedef struct oc_str32 +// { +// u32* ptr; +// size_t len; +// } oc_str32; + +// ORCA_API oc_str32 oc_str32_from_buffer(u64 len, u32* buffer); +// ORCA_API oc_str32 oc_str32_slice(oc_str32 s, u64 start, u64 end); + +// ORCA_API oc_str32 oc_str32_push_buffer(oc_arena* arena, u64 len, u32* buffer); +// ORCA_API oc_str32 oc_str32_push_copy(oc_arena* arena, oc_str32 s); +// ORCA_API oc_str32 oc_str32_push_slice(oc_arena* arena, oc_str32 s, u64 start, u64 end); + +// typedef struct oc_str32_elt +// { +// oc_list_elt listElt; +// oc_str32 string; +// } oc_str32_elt; + +// typedef struct oc_str32_list +// { +// oc_list list; +// u64 eltCount; +// u64 len; +// } oc_str32_list; + +// ORCA_API void oc_str32_list_push(oc_arena* arena, oc_str32_list* list, oc_str32 str); +// ORCA_API oc_str32 oc_str32_list_join(oc_arena* arena, oc_str32_list list); +// ORCA_API oc_str32_list oc_str32_split(oc_arena* arena, oc_str32 str, oc_str32_list separators); + //------------------------------------------------------------------------------------------ // [UTF8] //------------------------------------------------------------------------------------------ -const UnicodeRange = extern struct { - first_code_point: Utf32, - count: u32, -}; +pub const Utf32 = u32; -const Utf8Dec = extern struct { - codepoint: Utf32, // decoded codepoint +pub const Utf8Dec = extern struct { + code_point: Utf32, // decoded codepoint size: u32, // size of corresponding oc_utf8 sequence }; -const Utf8 = struct { +pub const Utf8 = struct { // getting sizes / offsets / indices extern fn oc_utf8_size_from_leading_char(leadingChar: c_char) u32; - extern fn oc_utf8_codepoint_size(codePoint: Utf32) u32; + extern fn oc_utf8_codepoint_size(code_point: Utf32) u32; extern fn oc_utf8_codepoint_count_for_string(string: Str8) u64; - extern fn oc_utf8_byte_count_for_codepoints(codePoints: Str32) u64; + extern fn oc_utf8_byte_count_for_codepoints(code_points: Str32) u64; extern fn oc_utf8_next_offset(string: Str8, byteOffset: u64) u64; extern fn oc_utf8_prev_offset(string: Str8, byteOffset: u64) u64; @@ -218,11 +479,11 @@ const Utf8 = struct { // encoding / decoding extern fn oc_utf8_decode(string: Str8) Utf8Dec; //NOTE: decode a single oc_utf8 sequence at start of string extern fn oc_utf8_decode_at(string: Str8, offset: u64) Utf8Dec; //NOTE: decode a single oc_utf8 sequence starting at byte offset - extern fn oc_utf8_encode(dst: [*]u8, codePoint: Utf32) Str8; //NOTE: encode codepoint into backing buffer dst + extern fn oc_utf8_encode(dst: [*]u8, code_point: Utf32) Str8; //NOTE: encode codepoint into backing buffer dst extern fn oc_utf8_to_codepoints(maxCount: u64, backing: [*]Utf32, string: Str8) Str32; - extern fn oc_utf8_from_codepoints(maxBytes: u64, backing: [*]c_char, codePoints: Str32) Str8; + extern fn oc_utf8_from_codepoints(maxBytes: u64, backing: [*]c_char, code_points: Str32) Str8; extern fn oc_utf8_push_to_codepoints(arena: *Arena, string: Str8) Str32; - extern fn oc_utf8_push_from_codepoints(arena: *Arena, codePoints: Str32) Str8; + extern fn oc_utf8_push_from_codepoints(arena: *Arena, code_points: Str32) Str8; pub const decode = oc_utf8_decode; pub const decodeAt = oc_utf8_decode_at; @@ -233,6 +494,479 @@ const Utf8 = struct { pub const pushFromCodepoints = oc_utf8_push_from_codepoints; }; +//------------------------------------------------------------------------------------------ +// [UTF8] Unicode +//------------------------------------------------------------------------------------------ + +pub const UnicodeRange = extern struct { + first_code_point: Utf32, + count: u32, + + extern const OC_UNICODE_BASIC_LATIN: UnicodeRange; + extern const OC_UNICODE_C1_CONTROLS_AND_LATIN_1_SUPPLEMENT: UnicodeRange; + extern const OC_UNICODE_LATIN_EXTENDED_A: UnicodeRange; + extern const OC_UNICODE_LATIN_EXTENDED_B: UnicodeRange; + extern const OC_UNICODE_IPA_EXTENSIONS: UnicodeRange; + extern const OC_UNICODE_SPACING_MODIFIER_LETTERS: UnicodeRange; + extern const OC_UNICODE_COMBINING_DIACRITICAL_MARKS: UnicodeRange; + extern const OC_UNICODE_GREEK_COPTIC: UnicodeRange; + extern const OC_UNICODE_CYRILLIC: UnicodeRange; + extern const OC_UNICODE_CYRILLIC_SUPPLEMENT: UnicodeRange; + extern const OC_UNICODE_ARMENIAN: UnicodeRange; + extern const OC_UNICODE_HEBREW: UnicodeRange; + extern const OC_UNICODE_ARABIC: UnicodeRange; + extern const OC_UNICODE_SYRIAC: UnicodeRange; + extern const OC_UNICODE_THAANA: UnicodeRange; + extern const OC_UNICODE_DEVANAGARI: UnicodeRange; + extern const OC_UNICODE_BENGALI_ASSAMESE: UnicodeRange; + extern const OC_UNICODE_GURMUKHI: UnicodeRange; + extern const OC_UNICODE_GUJARATI: UnicodeRange; + extern const OC_UNICODE_ORIYA: UnicodeRange; + extern const OC_UNICODE_TAMIL: UnicodeRange; + extern const OC_UNICODE_TELUGU: UnicodeRange; + extern const OC_UNICODE_KANNADA: UnicodeRange; + extern const OC_UNICODE_MALAYALAM: UnicodeRange; + extern const OC_UNICODE_SINHALA: UnicodeRange; + extern const OC_UNICODE_THAI: UnicodeRange; + extern const OC_UNICODE_LAO: UnicodeRange; + extern const OC_UNICODE_TIBETAN: UnicodeRange; + extern const OC_UNICODE_MYANMAR: UnicodeRange; + extern const OC_UNICODE_GEORGIAN: UnicodeRange; + extern const OC_UNICODE_HANGUL_JAMO: UnicodeRange; + extern const OC_UNICODE_ETHIOPIC: UnicodeRange; + extern const OC_UNICODE_CHEROKEE: UnicodeRange; + extern const OC_UNICODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS: UnicodeRange; + extern const OC_UNICODE_OGHAM: UnicodeRange; + extern const OC_UNICODE_RUNIC: UnicodeRange; + extern const OC_UNICODE_TAGALOG: UnicodeRange; + extern const OC_UNICODE_HANUNOO: UnicodeRange; + extern const OC_UNICODE_BUHID: UnicodeRange; + extern const OC_UNICODE_TAGBANWA: UnicodeRange; + extern const OC_UNICODE_KHMER: UnicodeRange; + extern const OC_UNICODE_MONGOLIAN: UnicodeRange; + extern const OC_UNICODE_LIMBU: UnicodeRange; + extern const OC_UNICODE_TAI_LE: UnicodeRange; + extern const OC_UNICODE_KHMER_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_PHONETIC_EXTENSIONS: UnicodeRange; + extern const OC_UNICODE_LATIN_EXTENDED_ADDITIONAL: UnicodeRange; + extern const OC_UNICODE_GREEK_EXTENDED: UnicodeRange; + extern const OC_UNICODE_GENERAL_PUNCTUATION: UnicodeRange; + extern const OC_UNICODE_SUPERSCRIPTS_AND_SUBSCRIPTS: UnicodeRange; + extern const OC_UNICODE_CURRENCY_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_LETTERLIKE_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_NUMBER_FORMS: UnicodeRange; + extern const OC_UNICODE_ARROWS: UnicodeRange; + extern const OC_UNICODE_MATHEMATICAL_OPERATORS: UnicodeRange; + extern const OC_UNICODE_MISCELLANEOUS_TECHNICAL: UnicodeRange; + extern const OC_UNICODE_CONTROL_PICTURES: UnicodeRange; + extern const OC_UNICODE_OPTICAL_CHARACTER_RECOGNITION: UnicodeRange; + extern const OC_UNICODE_ENCLOSED_ALPHANUMERICS: UnicodeRange; + extern const OC_UNICODE_BOX_DRAWING: UnicodeRange; + extern const OC_UNICODE_BLOCK_ELEMENTS: UnicodeRange; + extern const OC_UNICODE_GEOMETRIC_SHAPES: UnicodeRange; + extern const OC_UNICODE_MISCELLANEOUS_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_DINGBATS: UnicodeRange; + extern const OC_UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A: UnicodeRange; + extern const OC_UNICODE_SUPPLEMENTAL_ARROWS_A: UnicodeRange; + extern const OC_UNICODE_BRAILLE_PATTERNS: UnicodeRange; + extern const OC_UNICODE_SUPPLEMENTAL_ARROWS_B: UnicodeRange; + extern const OC_UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B: UnicodeRange; + extern const OC_UNICODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS: UnicodeRange; + extern const OC_UNICODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS: UnicodeRange; + extern const OC_UNICODE_CJK_RADICALS_SUPPLEMENT: UnicodeRange; + extern const OC_UNICODE_KANGXI_RADICALS: UnicodeRange; + extern const OC_UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS: UnicodeRange; + extern const OC_UNICODE_CJK_SYMBOLS_AND_PUNCTUATION: UnicodeRange; + extern const OC_UNICODE_HIRAGANA: UnicodeRange; + extern const OC_UNICODE_KATAKANA: UnicodeRange; + extern const OC_UNICODE_BOPOMOFO: UnicodeRange; + extern const OC_UNICODE_HANGUL_COMPATIBILITY_JAMO: UnicodeRange; + extern const OC_UNICODE_KANBUN_KUNTEN: UnicodeRange; + extern const OC_UNICODE_BOPOMOFO_EXTENDED: UnicodeRange; + extern const OC_UNICODE_KATAKANA_PHONETIC_EXTENSIONS: UnicodeRange; + extern const OC_UNICODE_ENCLOSED_CJK_LETTERS_AND_MONTHS: UnicodeRange; + extern const OC_UNICODE_CJK_COMPATIBILITY: UnicodeRange; + extern const OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A: UnicodeRange; + extern const OC_UNICODE_YIJING_HEXAGRAM_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS: UnicodeRange; + extern const OC_UNICODE_YI_SYLLABLES: UnicodeRange; + extern const OC_UNICODE_YI_RADICALS: UnicodeRange; + extern const OC_UNICODE_HANGUL_SYLLABLES: UnicodeRange; + extern const OC_UNICODE_HIGH_SURROGATE_AREA: UnicodeRange; + extern const OC_UNICODE_LOW_SURROGATE_AREA: UnicodeRange; + extern const OC_UNICODE_PRIVATE_USE_AREA: UnicodeRange; + extern const OC_UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS: UnicodeRange; + extern const OC_UNICODE_ALPHABETIC_PRESENTATION_FORMS: UnicodeRange; + extern const OC_UNICODE_ARABIC_PRESENTATION_FORMS_A: UnicodeRange; + extern const OC_UNICODE_VARIATION_SELECTORS: UnicodeRange; + extern const OC_UNICODE_COMBINING_HALF_MARKS: UnicodeRange; + extern const OC_UNICODE_CJK_COMPATIBILITY_FORMS: UnicodeRange; + extern const OC_UNICODE_SMALL_FORM_VARIANTS: UnicodeRange; + extern const OC_UNICODE_ARABIC_PRESENTATION_FORMS_B: UnicodeRange; + extern const OC_UNICODE_HALFWIDTH_AND_FULLWIDTH_FORMS: UnicodeRange; + extern const OC_UNICODE_SPECIALS: UnicodeRange; + extern const OC_UNICODE_LINEAR_B_SYLLABARY: UnicodeRange; + extern const OC_UNICODE_LINEAR_B_IDEOGRAMS: UnicodeRange; + extern const OC_UNICODE_AEGEAN_NUMBERS: UnicodeRange; + extern const OC_UNICODE_OLD_ITALIC: UnicodeRange; + extern const OC_UNICODE_GOTHIC: UnicodeRange; + extern const OC_UNICODE_UGARITIC: UnicodeRange; + extern const OC_UNICODE_DESERET: UnicodeRange; + extern const OC_UNICODE_SHAVIAN: UnicodeRange; + extern const OC_UNICODE_OSMANYA: UnicodeRange; + extern const OC_UNICODE_CYPRIOT_SYLLABARY: UnicodeRange; + extern const OC_UNICODE_BYZANTINE_MUSICAL_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_MUSICAL_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_TAI_XUAN_JING_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS: UnicodeRange; + extern const OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B: UnicodeRange; + extern const OC_UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT: UnicodeRange; + extern const OC_UNICODE_TAGS: UnicodeRange; + extern const OC_UNICODE_VARIATION_SELECTORS_SUPPLEMENT: UnicodeRange; + extern const OC_UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A: UnicodeRange; + extern const OC_UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B: UnicodeRange; + + pub const Enum = enum { + BasicLatin, + C1ControlsAndLatin1Supplement, + LatinExtendedA, + LatinExtendedB, + IpaExtensions, + SpacingModifierLetters, + CombiningDiacriticalMarks, + GreekCoptic, + Cyrillic, + CyrillicSupplement, + Armenian, + Hebrew, + Arabic, + Syriac, + Thaana, + Devanagari, + BengaliAssamese, + Gurmukhi, + Gujarati, + Oriya, + Tamil, + Telugu, + Kannada, + Malayalam, + Sinhala, + Thai, + Lao, + Tibetan, + Myanmar, + Georgian, + HangulJamo, + Ethiopic, + Cherokee, + UnifiedCanadianAboriginalSyllabics, + Ogham, + Runic, + Tagalog, + Hanunoo, + Buhid, + Tagbanwa, + Khmer, + Mongolian, + Limbu, + TaiLe, + KhmerSymbols, + PhoneticExtensions, + LatinExtendedAdditional, + GreekExtended, + GeneralPunctuation, + SuperscriptsAndSubscripts, + CurrencySymbols, + CombiningDiacriticalMarksForSymbols, + LetterlikeSymbols, + NumberForms, + Arrows, + MathematicalOperators, + MiscellaneousTechnical, + ControlPictures, + OpticalCharacterRecognition, + EnclosedAlphanumerics, + BoxDrawing, + BlockElements, + GeometricShapes, + MiscellaneousSymbols, + Dingbats, + MiscellaneousMathematicalSymbolsA, + SupplementalArrowsA, + BraillePatterns, + SupplementalArrowsB, + MiscellaneousMathematicalSymbolsB, + SupplementalMathematicalOperators, + MiscellaneousSymbolsAndArrows, + CjkRadicalsSupplement, + KangxiRadicals, + IdeographicDescriptionCharacters, + CjkSymbolsAndPunctuation, + Hiragana, + Katakana, + Bopomofo, + HangulCompatibilityJamo, + KanbunKunten, + BopomofoExtended, + KatakanaPhoneticExtensions, + EnclosedCjkLettersAndMonths, + CjkCompatibility, + CjkUnifiedIdeographsExtensionA, + YijingHexagramSymbols, + CjkUnifiedIdeographs, + YiSyllables, + YiRadicals, + HangulSyllables, + HighSurrogateArea, + LowSurrogateArea, + PrivateUseArea, + CjkCompatibilityIdeographs, + AlphabeticPresentationForms, + ArabicPresentationFormsA, + VariationSelectors, + CombiningHalfMarks, + CjkCompatibilityForms, + SmallFormVariants, + ArabicPresentationFormsB, + HalfwidthAndFullwidthForms, + Specials, + LinearBSyllabary, + LinearBIdeograms, + AegeanNumbers, + OldItalic, + Gothic, + Ugaritic, + Deseret, + Shavian, + Osmanya, + CypriotSyllabary, + ByzantineMusicalSymbols, + MusicalSymbols, + TaiXuanJingSymbols, + MathematicalAlphanumericSymbols, + CjkUnifiedIdeographsExtensionB, + CjkCompatibilityIdeographsSupplement, + Tags, + VariationSelectorsSupplement, + SupplementaryPrivateUseAreaA, + SupplementaryPrivateUseAreaB, + }; + + pub fn range(comptime enums: []const Enum) [enums.len]UnicodeRange { + var r: [enums.len]UnicodeRange = undefined; + for (enums, 0..r.len) |e, i| { + r[i] = switch (e) { + .BasicLatin => OC_UNICODE_BASIC_LATIN, + .C1ControlsAndLatin1Supplement => OC_UNICODE_C1_CONTROLS_AND_LATIN_1_SUPPLEMENT, + .LatinExtendedA => OC_UNICODE_LATIN_EXTENDED_A, + .LatinExtendedB => OC_UNICODE_LATIN_EXTENDED_B, + .IpaExtensions => OC_UNICODE_IPA_EXTENSIONS, + .SpacingModifierLetters => OC_UNICODE_SPACING_MODIFIER_LETTERS, + .CombiningDiacriticalMarks => OC_UNICODE_COMBINING_DIACRITICAL_MARKS, + .GreekCoptic => OC_UNICODE_GREEK_COPTIC, + .Cyrillic => OC_UNICODE_CYRILLIC, + .CyrillicSupplement => OC_UNICODE_CYRILLIC_SUPPLEMENT, + .Armenian => OC_UNICODE_ARMENIAN, + .Hebrew => OC_UNICODE_HEBREW, + .Arabic => OC_UNICODE_ARABIC, + .Syriac => OC_UNICODE_SYRIAC, + .Thaana => OC_UNICODE_THAANA, + .Devanagari => OC_UNICODE_DEVANAGARI, + .BengaliAssamese => OC_UNICODE_BENGALI_ASSAMESE, + .Gurmukhi => OC_UNICODE_GURMUKHI, + .Gujarati => OC_UNICODE_GUJARATI, + .Oriya => OC_UNICODE_ORIYA, + .Tamil => OC_UNICODE_TAMIL, + .Telugu => OC_UNICODE_TELUGU, + .Kannada => OC_UNICODE_KANNADA, + .Malayalam => OC_UNICODE_MALAYALAM, + .Sinhala => OC_UNICODE_SINHALA, + .Thai => OC_UNICODE_THAI, + .Lao => OC_UNICODE_LAO, + .Tibetan => OC_UNICODE_TIBETAN, + .Myanmar => OC_UNICODE_MYANMAR, + .Georgian => OC_UNICODE_GEORGIAN, + .HangulJamo => OC_UNICODE_HANGUL_JAMO, + .Ethiopic => OC_UNICODE_ETHIOPIC, + .Cherokee => OC_UNICODE_CHEROKEE, + .UnifiedCanadianAboriginalSyllabics => OC_UNICODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, + .Ogham => OC_UNICODE_OGHAM, + .Runic => OC_UNICODE_RUNIC, + .Tagalog => OC_UNICODE_TAGALOG, + .Hanunoo => OC_UNICODE_HANUNOO, + .Buhid => OC_UNICODE_BUHID, + .Tagbanwa => OC_UNICODE_TAGBANWA, + .Khmer => OC_UNICODE_KHMER, + .Mongolian => OC_UNICODE_MONGOLIAN, + .Limbu => OC_UNICODE_LIMBU, + .TaiLe => OC_UNICODE_TAI_LE, + .KhmerSymbols => OC_UNICODE_KHMER_SYMBOLS, + .PhoneticExtensions => OC_UNICODE_PHONETIC_EXTENSIONS, + .LatinExtendedAdditional => OC_UNICODE_LATIN_EXTENDED_ADDITIONAL, + .GreekExtended => OC_UNICODE_GREEK_EXTENDED, + .GeneralPunctuation => OC_UNICODE_GENERAL_PUNCTUATION, + .SuperscriptsAndSubscripts => OC_UNICODE_SUPERSCRIPTS_AND_SUBSCRIPTS, + .CurrencySymbols => OC_UNICODE_CURRENCY_SYMBOLS, + .CombiningDiacriticalMarksForSymbols => OC_UNICODE_COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS, + .LetterlikeSymbols => OC_UNICODE_LETTERLIKE_SYMBOLS, + .NumberForms => OC_UNICODE_NUMBER_FORMS, + .Arrows => OC_UNICODE_ARROWS, + .MathematicalOperators => OC_UNICODE_MATHEMATICAL_OPERATORS, + .MiscellaneousTechnical => OC_UNICODE_MISCELLANEOUS_TECHNICAL, + .ControlPictures => OC_UNICODE_CONTROL_PICTURES, + .OpticalCharacterRecognition => OC_UNICODE_OPTICAL_CHARACTER_RECOGNITION, + .EnclosedAlphanumerics => OC_UNICODE_ENCLOSED_ALPHANUMERICS, + .BoxDrawing => OC_UNICODE_BOX_DRAWING, + .BlockElements => OC_UNICODE_BLOCK_ELEMENTS, + .GeometricShapes => OC_UNICODE_GEOMETRIC_SHAPES, + .MiscellaneousSymbols => OC_UNICODE_MISCELLANEOUS_SYMBOLS, + .Dingbats => OC_UNICODE_DINGBATS, + .MiscellaneousMathematicalSymbolsA => OC_UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A, + .SupplementalArrowsA => OC_UNICODE_SUPPLEMENTAL_ARROWS_A, + .BraillePatterns => OC_UNICODE_BRAILLE_PATTERNS, + .SupplementalArrowsB => OC_UNICODE_SUPPLEMENTAL_ARROWS_B, + .MiscellaneousMathematicalSymbolsB => OC_UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B, + .SupplementalMathematicalOperators => OC_UNICODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS, + .MiscellaneousSymbolsAndArrows => OC_UNICODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS, + .CjkRadicalsSupplement => OC_UNICODE_CJK_RADICALS_SUPPLEMENT, + .KangxiRadicals => OC_UNICODE_KANGXI_RADICALS, + .IdeographicDescriptionCharacters => OC_UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS, + .CjkSymbolsAndPunctuation => OC_UNICODE_CJK_SYMBOLS_AND_PUNCTUATION, + .Hiragana => OC_UNICODE_HIRAGANA, + .Katakana => OC_UNICODE_KATAKANA, + .Bopomofo => OC_UNICODE_BOPOMOFO, + .HangulCompatibilityJamo => OC_UNICODE_HANGUL_COMPATIBILITY_JAMO, + .KanbunKunten => OC_UNICODE_KANBUN_KUNTEN, + .BopomofoExtended => OC_UNICODE_BOPOMOFO_EXTENDED, + .KatakanaPhoneticExtensions => OC_UNICODE_KATAKANA_PHONETIC_EXTENSIONS, + .EnclosedCjkLettersAndMonths => OC_UNICODE_ENCLOSED_CJK_LETTERS_AND_MONTHS, + .CjkCompatibility => OC_UNICODE_CJK_COMPATIBILITY, + .CjkUnifiedIdeographsExtensionA => OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, + .YijingHexagramSymbols => OC_UNICODE_YIJING_HEXAGRAM_SYMBOLS, + .CjkUnifiedIdeographs => OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS, + .YiSyllables => OC_UNICODE_YI_SYLLABLES, + .YiRadicals => OC_UNICODE_YI_RADICALS, + .HangulSyllables => OC_UNICODE_HANGUL_SYLLABLES, + .HighSurrogateArea => OC_UNICODE_HIGH_SURROGATE_AREA, + .LowSurrogateArea => OC_UNICODE_LOW_SURROGATE_AREA, + .PrivateUseArea => OC_UNICODE_PRIVATE_USE_AREA, + .CjkCompatibilityIdeographs => OC_UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS, + .AlphabeticPresentationForms => OC_UNICODE_ALPHABETIC_PRESENTATION_FORMS, + .ArabicPresentationFormsA => OC_UNICODE_ARABIC_PRESENTATION_FORMS_A, + .VariationSelectors => OC_UNICODE_VARIATION_SELECTORS, + .CombiningHalfMarks => OC_UNICODE_COMBINING_HALF_MARKS, + .CjkCompatibilityForms => OC_UNICODE_CJK_COMPATIBILITY_FORMS, + .SmallFormVariants => OC_UNICODE_SMALL_FORM_VARIANTS, + .ArabicPresentationFormsB => OC_UNICODE_ARABIC_PRESENTATION_FORMS_B, + .HalfwidthAndFullwidthForms => OC_UNICODE_HALFWIDTH_AND_FULLWIDTH_FORMS, + .Specials => OC_UNICODE_SPECIALS, + .LinearBSyllabary => OC_UNICODE_LINEAR_B_SYLLABARY, + .LinearBIdeograms => OC_UNICODE_LINEAR_B_IDEOGRAMS, + .AegeanNumbers => OC_UNICODE_AEGEAN_NUMBERS, + .OldItalic => OC_UNICODE_OLD_ITALIC, + .Gothic => OC_UNICODE_GOTHIC, + .Ugaritic => OC_UNICODE_UGARITIC, + .Deseret => OC_UNICODE_DESERET, + .Shavian => OC_UNICODE_SHAVIAN, + .Osmanya => OC_UNICODE_OSMANYA, + .CypriotSyllabary => OC_UNICODE_CYPRIOT_SYLLABARY, + .ByzantineMusicalSymbols => OC_UNICODE_BYZANTINE_MUSICAL_SYMBOLS, + .MusicalSymbols => OC_UNICODE_MUSICAL_SYMBOLS, + .TaiXuanJingSymbols => OC_UNICODE_TAI_XUAN_JING_SYMBOLS, + .MathematicalAlphanumericSymbols => OC_UNICODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS, + .CjkUnifiedIdeographsExtensionB => OC_UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, + .CjkCompatibilityIdeographsSupplement => OC_UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, + .Tags => OC_UNICODE_TAGS, + .VariationSelectorsSupplement => OC_UNICODE_VARIATION_SELECTORS_SUPPLEMENT, + .SupplementaryPrivateUseAreaA => OC_UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A, + .SupplementaryPrivateUseAreaB => OC_UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B, + }; + } + + return r; + } +}; + +//------------------------------------------------------------------------------------------ +// [FONT]: fonts +//------------------------------------------------------------------------------------------ + +pub const Font = extern struct { + h: u64, + + extern fn oc_font_nil() Font; + extern fn oc_font_is_nil(font: Font) bool; + + extern fn oc_font_create_from_memory(mem: Str8, range_count: u32, ranges: [*]const UnicodeRange) Font; + extern fn oc_font_create_from_file(file: File, range_count: u32, ranges: [*]const UnicodeRange) Font; + extern fn oc_font_create_from_path(path: Str8, range_count: u32, ranges: [*]const UnicodeRange) Font; + + extern fn oc_font_get_glyph_indices(font: Font, code_points: Str32, backing: Str32) Str32; + extern fn oc_font_push_glyph_indices(font: Font, arena: *Arena, code_points: Str32) Str32; + extern fn oc_font_get_glyph_index(font: Font, code_point: Utf32) u32; + extern fn oc_font_destroy(font: Font) void; + + extern fn oc_font_get_metrics(font: Font) FontMetrics; + extern fn oc_font_get_metrics_unscaled(font: Font, em_size: f32) FontMetrics; + extern fn oc_font_get_scale_for_em_pixels(font: Font, em_size: f32) f32; + extern fn oc_font_text_metrics_utf32(font: Font, font_size: f32, code_points: Str32) TextMetrics; + extern fn oc_font_text_metrics(font: Font, font_size: f32, text: Str8) TextMetrics; + + pub const nil = oc_font_nil; + pub const isNil = oc_font_is_nil; + pub fn createFromMemory(mem: []const u8, ranges: []const UnicodeRange) Font { + return oc_font_create_from_memory(Str8.fromSlice(mem), @intCast(ranges.len), ranges.ptr); + } + pub fn createFromFile(file: File, ranges: []const UnicodeRange) Font { + return oc_font_create_from_file(file, @intCast(ranges.len), ranges.ptr); + } + pub fn createFromPath(path: []const u8, ranges: []const UnicodeRange) Font { + return oc_font_create_from_path(Str8.fromSlice(path), @intCast(ranges.len), ranges.ptr); + } + pub const getGlyphIndices = oc_font_get_glyph_indices; + pub const pushGlyphIndices = oc_font_push_glyph_indices; + pub const getGlyphIndex = oc_font_get_glyph_index; + pub const destroy = oc_font_destroy; + pub const getMetrics = oc_font_get_metrics; + pub const getMetricsUnscaled = oc_font_get_metrics_unscaled; + pub const getScaleForEmPixels = oc_font_get_scale_for_em_pixels; + pub const textMetricsUtf32 = oc_font_text_metrics_utf32; + pub const textMetrics = oc_font_text_metrics; +}; + +pub const JointType = enum(c_uint) { + Miter, + Bevel, + None, +}; + +pub const CapType = enum(c_uint) { + None, + Square, +}; + +pub const FontMetrics = extern struct { + ascent: f32, // the extent above the baseline (by convention a positive value extends above the baseline) + descent: f32, // the extent below the baseline (by convention, positive value extends below the baseline) + line_gap: f32, // spacing between one row's descent and the next row's ascent + x_height: f32, // height of the lower case letter 'x' + cap_height: f32, // height of the upper case letter 'M' + width: f32, // maximum width of the font +}; + +pub const GlyphMetrics = extern struct { + ink: Rect, + advance: Vec2, +}; + +pub const TextMetrics = extern struct { + ink: Rect, + logical: Rect, + advance: Vec2, +}; + //------------------------------------------------------------------------------------------ // [APP] //------------------------------------------------------------------------------------------ @@ -255,152 +989,279 @@ const MouseCursor = enum(c_uint) { extern fn oc_set_cursor(cursor: MouseCursor) void; pub const setCursor = oc_set_cursor; +pub const ScanCode = enum(c_uint) { + Unknown = 0, + Space = 32, + Apostrophe = 39, + Comma = 44, + Minus = 45, + Period = 46, + Slash = 47, + Num0 = 48, + Num1 = 49, + Num2 = 50, + Num3 = 51, + Num4 = 52, + Num5 = 53, + Num6 = 54, + Num7 = 55, + Num8 = 56, + Num9 = 57, + Semicolon = 59, + Equal = 61, + LeftBracket = 91, + Backslash = 92, + RightBracket = 93, + GraveAccent = 96, + A = 97, + B = 98, + C = 99, + D = 100, + E = 101, + F = 102, + G = 103, + H = 104, + I = 105, + J = 106, + K = 107, + L = 108, + M = 109, + N = 110, + O = 111, + P = 112, + Q = 113, + R = 114, + S = 115, + T = 116, + U = 117, + V = 118, + W = 119, + X = 120, + Y = 121, + Z = 122, + World1 = 161, + World2 = 162, + Escape = 256, + Enter = 257, + Tab = 258, + Backspace = 259, + Insert = 260, + Delete = 261, + Right = 262, + Left = 263, + Down = 264, + Up = 265, + PageUp = 266, + PageDown = 267, + Home = 268, + End = 269, + CapsLock = 280, + ScrollLock = 281, + NumLock = 282, + PrintScreen = 283, + Pause = 284, + F1 = 290, + F2 = 291, + F3 = 292, + F4 = 293, + F5 = 294, + F6 = 295, + F7 = 296, + F8 = 297, + F9 = 298, + F10 = 299, + F11 = 300, + F12 = 301, + F13 = 302, + F14 = 303, + F15 = 304, + F16 = 305, + F17 = 306, + F18 = 307, + F19 = 308, + F20 = 309, + F21 = 310, + F22 = 311, + F23 = 312, + F24 = 313, + F25 = 314, + Kp0 = 320, + Kp1 = 321, + Kp2 = 322, + Kp3 = 323, + Kp4 = 324, + Kp5 = 325, + Kp6 = 326, + Kp7 = 327, + Kp8 = 328, + Kp9 = 329, + KpDecimal = 330, + KpDivide = 331, + KpMultiply = 332, + KpSubtract = 333, + KpAdd = 334, + KpEnter = 335, + KpEqual = 336, + LeftShift = 340, + LeftControl = 341, + LeftAlt = 342, + LeftSuper = 343, + RightShift = 344, + RightControl = 345, + RightAlt = 346, + RightSuper = 347, + Menu = 348, +}; + pub const KeyCode = enum(c_uint) { - Unknown = orca_c.OC_KEY_UNKNOWN, - Space = orca_c.OC_KEY_SPACE, - Apostrophe = orca_c.OC_KEY_APOSTROPHE, - Comma = orca_c.OC_KEY_COMMA, - Minus = orca_c.OC_KEY_MINUS, - Period = orca_c.OC_KEY_PERIOD, - Slash = orca_c.OC_KEY_SLASH, - Num0 = orca_c.OC_KEY_0, - Num1 = orca_c.OC_KEY_1, - Num2 = orca_c.OC_KEY_2, - Num3 = orca_c.OC_KEY_3, - Num4 = orca_c.OC_KEY_4, - Num5 = orca_c.OC_KEY_5, - Num6 = orca_c.OC_KEY_6, - Num7 = orca_c.OC_KEY_7, - Num8 = orca_c.OC_KEY_8, - Num9 = orca_c.OC_KEY_9, - Semicolon = orca_c.OC_KEY_SEMICOLON, - Equal = orca_c.OC_KEY_EQUAL, - A = orca_c.OC_KEY_A, - B = orca_c.OC_KEY_B, - C = orca_c.OC_KEY_C, - D = orca_c.OC_KEY_D, - E = orca_c.OC_KEY_E, - F = orca_c.OC_KEY_F, - G = orca_c.OC_KEY_G, - H = orca_c.OC_KEY_H, - I = orca_c.OC_KEY_I, - J = orca_c.OC_KEY_J, - K = orca_c.OC_KEY_K, - L = orca_c.OC_KEY_L, - M = orca_c.OC_KEY_M, - N = orca_c.OC_KEY_N, - O = orca_c.OC_KEY_O, - P = orca_c.OC_KEY_P, - Q = orca_c.OC_KEY_Q, - R = orca_c.OC_KEY_R, - S = orca_c.OC_KEY_S, - T = orca_c.OC_KEY_T, - U = orca_c.OC_KEY_U, - V = orca_c.OC_KEY_V, - W = orca_c.OC_KEY_W, - X = orca_c.OC_KEY_X, - Y = orca_c.OC_KEY_Y, - Z = orca_c.OC_KEY_Z, - LeftBracket = orca_c.OC_KEY_LEFT_BRACKET, - Backslash = orca_c.OC_KEY_BACKSLASH, - RightBracket = orca_c.OC_KEY_RIGHT_BRACKET, - GraveAccent = orca_c.OC_KEY_GRAVE_ACCENT, - World1 = orca_c.OC_KEY_WORLD_1, - World2 = orca_c.OC_KEY_WORLD_2, - Escape = orca_c.OC_KEY_ESCAPE, - Enter = orca_c.OC_KEY_ENTER, - Tab = orca_c.OC_KEY_TAB, - Backspace = orca_c.OC_KEY_BACKSPACE, - Insert = orca_c.OC_KEY_INSERT, - Delete = orca_c.OC_KEY_DELETE, - Right = orca_c.OC_KEY_RIGHT, - Left = orca_c.OC_KEY_LEFT, - Down = orca_c.OC_KEY_DOWN, - Up = orca_c.OC_KEY_UP, - PageUp = orca_c.OC_KEY_PAGE_UP, - PageDown = orca_c.OC_KEY_PAGE_DOWN, - Home = orca_c.OC_KEY_HOME, - End = orca_c.OC_KEY_END, - CapsLock = orca_c.OC_KEY_CAPS_LOCK, - ScrollLock = orca_c.OC_KEY_SCROLL_LOCK, - NumLock = orca_c.OC_KEY_NUM_LOCK, - PrintScreen = orca_c.OC_KEY_PRINT_SCREEN, - Pause = orca_c.OC_KEY_PAUSE, - F1 = orca_c.OC_KEY_F1, - F2 = orca_c.OC_KEY_F2, - F3 = orca_c.OC_KEY_F3, - F4 = orca_c.OC_KEY_F4, - F5 = orca_c.OC_KEY_F5, - F6 = orca_c.OC_KEY_F6, - F7 = orca_c.OC_KEY_F7, - F8 = orca_c.OC_KEY_F8, - F9 = orca_c.OC_KEY_F9, - F10 = orca_c.OC_KEY_F10, - F11 = orca_c.OC_KEY_F11, - F12 = orca_c.OC_KEY_F12, - F13 = orca_c.OC_KEY_F13, - F14 = orca_c.OC_KEY_F14, - F15 = orca_c.OC_KEY_F15, - F16 = orca_c.OC_KEY_F16, - F17 = orca_c.OC_KEY_F17, - F18 = orca_c.OC_KEY_F18, - F19 = orca_c.OC_KEY_F19, - F20 = orca_c.OC_KEY_F20, - F21 = orca_c.OC_KEY_F21, - F22 = orca_c.OC_KEY_F22, - F23 = orca_c.OC_KEY_F23, - F24 = orca_c.OC_KEY_F24, - F25 = orca_c.OC_KEY_F25, - Kp0 = orca_c.OC_KEY_KP_0, - Kp1 = orca_c.OC_KEY_KP_1, - Kp2 = orca_c.OC_KEY_KP_2, - Kp3 = orca_c.OC_KEY_KP_3, - Kp4 = orca_c.OC_KEY_KP_4, - Kp5 = orca_c.OC_KEY_KP_5, - Kp6 = orca_c.OC_KEY_KP_6, - Kp7 = orca_c.OC_KEY_KP_7, - Kp8 = orca_c.OC_KEY_KP_8, - Kp9 = orca_c.OC_KEY_KP_9, - KpDecimal = orca_c.OC_KEY_KP_DECIMAL, - KpDivide = orca_c.OC_KEY_KP_DIVIDE, - KpMultiply = orca_c.OC_KEY_KP_MULTIPLY, - KpSubtract = orca_c.OC_KEY_KP_SUBTRACT, - KpAdd = orca_c.OC_KEY_KP_ADD, - KpEnter = orca_c.OC_KEY_KP_ENTER, - KpEqual = orca_c.OC_KEY_KP_EQUAL, - LeftShift = orca_c.OC_KEY_LEFT_SHIFT, - LeftControl = orca_c.OC_KEY_LEFT_CONTROL, - LeftAlt = orca_c.OC_KEY_LEFT_ALT, - LeftSuper = orca_c.OC_KEY_LEFT_SUPER, - RightShift = orca_c.OC_KEY_RIGHT_SHIFT, - RightControl = orca_c.OC_KEY_RIGHT_CONTROL, - RightAlt = orca_c.OC_KEY_RIGHT_ALT, - RightSuper = orca_c.OC_KEY_RIGHT_SUPER, - Menu = orca_c.OC_KEY_MENU, - Count = orca_c.OC_KEY_COUNT, + Unknown = 0, + Space = ' ', + Apostrophe = '\'', + Comma = ',', + Minus = '-', + Period = '.', + Slash = '/', + Num0 = '0', + Num1 = '1', + Num2 = '2', + Num3 = '3', + Num4 = '4', + Num5 = '5', + Num6 = '6', + Num7 = '7', + Num8 = '8', + Num9 = '9', + Semicolon = ';', + Equal = '=', + LeftBracket = '[', + Backslash = '\\', + RightBracket = ']', + GraveAccent = '`', + A = 'a', + B = 'b', + C = 'c', + D = 'd', + E = 'e', + F = 'f', + G = 'g', + H = 'h', + I = 'i', + J = 'j', + K = 'k', + L = 'l', + M = 'm', + N = 'n', + O = 'o', + P = 'p', + Q = 'q', + R = 'r', + S = 's', + T = 't', + U = 'u', + V = 'v', + W = 'w', + X = 'x', + Y = 'y', + Z = 'z', + World1 = 161, + World2 = 162, + Escape = 256, + Enter = 257, + Tab = 258, + Backspace = 259, + Insert = 260, + Delete = 261, + Right = 262, + Left = 263, + Down = 264, + Up = 265, + PageUp = 266, + PageDown = 267, + Home = 268, + End = 269, + CapsLock = 280, + ScrollLock = 281, + NumLock = 282, + PrintScreen = 283, + Pause = 284, + F1 = 290, + F2 = 291, + F3 = 292, + F4 = 293, + F5 = 294, + F6 = 295, + F7 = 296, + F8 = 297, + F9 = 298, + F10 = 299, + F11 = 300, + F12 = 301, + F13 = 302, + F14 = 303, + F15 = 304, + F16 = 305, + F17 = 306, + F18 = 307, + F19 = 308, + F20 = 309, + F21 = 310, + F22 = 311, + F23 = 312, + F24 = 313, + F25 = 314, + Kp0 = 320, + Kp1 = 321, + Kp2 = 322, + Kp3 = 323, + Kp4 = 324, + Kp5 = 325, + Kp6 = 326, + Kp7 = 327, + Kp8 = 328, + Kp9 = 329, + KpDecimal = 330, + KpDivide = 331, + KpMultiply = 332, + KpSubtract = 333, + KpAdd = 334, + KpEnter = 335, + KpEqual = 336, + LeftShift = 340, + LeftControl = 341, + LeftAlt = 342, + LeftSuper = 343, + RightShift = 344, + RightControl = 345, + RightAlt = 346, + RightSuper = 347, + Menu = 348, + Count = 349, }; pub const MouseButton = enum(c_uint) { - Left = orca_c.OC_MOUSE_LEFT, - Right = orca_c.OC_MOUSE_RIGHT, - Middle = orca_c.OC_MOUSE_MIDDLE, - Ext1 = orca_c.OC_MOUSE_EXT1, - Ext2 = orca_c.OC_MOUSE_EXT2, + Left = 0x00, + Right = 0x01, + Middle = 0x02, + Ext1 = 0x03, + Ext2 = 0x04, }; //------------------------------------------------------------------------------------------ // [APP] windows //------------------------------------------------------------------------------------------ +extern fn oc_window_set_title(title: Str8) void; + pub fn windowSetTitle(title: [:0]const u8) void { - var title_str8: Str8 = .{ - .ptr = @constCast(title.ptr), - .len = title.len, - }; - orca_c.oc_window_set_title(title_str8); + // var title_str8: Str8 = .{ + // .ptr = @constCast(title.ptr), + // .len = title.len, + // }; + oc_window_set_title(Str8.fromSlice(title)); } extern fn oc_window_set_size(size: Vec2) void; +// pub const windowSetTitle = oc_window_set_title; pub const windowSetSize = oc_window_set_size; //------------------------------------------------------------------------------------------ @@ -429,19 +1290,6 @@ const FileDialogDesc = extern struct { filters: Str8List, }; -// typedef struct oc_file_dialog_desc -// { -// oc_file_dialog_kind kind; -// oc_file_dialog_flags flags; -// oc_str8 title; -// oc_str8 okLabel; -// oc_file startAt; -// oc_str8 startPath; -// oc_str8_list filters; - -// //... later customization options with checkboxes / radiobuttons -// } oc_file_dialog_desc; - const FileDialogButton = enum(c_uint) { Cancel, Ok, @@ -453,20 +1301,6 @@ const FileDialogResult = extern struct { selection: Str8List, }; -// typedef enum -// { -// OC_FILE_DIALOG_CANCEL = 0, -// OC_FILE_DIALOG_OK, -// } oc_file_dialog_button; - -// typedef struct oc_file_dialog_result -// { -// oc_file_dialog_button button; -// oc_str8 path; -// oc_str8_list selection; - -// } oc_file_dialog_result; - //------------------------------------------------------------------------------------------ // [CLOCK] //------------------------------------------------------------------------------------------ @@ -480,6 +1314,77 @@ pub const ClockKind = enum(c_uint) { extern fn oc_clock_time(clock: ClockKind) f64; pub const clockTime = oc_clock_time; +//------------------------------------------------------------------------------------------ +// [MATH] Vec2 +//------------------------------------------------------------------------------------------ + +pub const Vec2 = extern struct { + x: f32, + y: f32, + + pub fn mul(self: Vec2, scalar: f32) Vec2 { + return .{ + .x = self.x * scalar, + .y = self.y * scalar, + }; + } + + pub fn add(a: Vec2, b: Vec2) Vec2 { + return .{ + .x = a.x + b.x, + .y = a.y + b.y, + }; + } +}; + +//------------------------------------------------------------------------------------------ +// [MATH] Matrix +//------------------------------------------------------------------------------------------ + +pub const Mat2x3 = extern struct { + m: [6]f32, + + extern fn oc_mat2x3_mul(m: Mat2x3, p: Vec2) Vec2; + extern fn oc_mat2x3_mul_m(lhs: Mat2x3, rhs: Mat2x3) Mat2x3; + extern fn oc_mat2x3_inv(x: Mat2x3) Mat2x3; + extern fn oc_mat2x3_rotate(radians: f32) Mat2x3; + extern fn oc_mat2x3_translate(x: f32, y: f32) Mat2x3; + + extern fn oc_matrix_push(matrix: Mat2x3) void; + extern fn oc_matrix_pop() void; + extern fn oc_matrix_top() Mat2x3; + + pub const mul = oc_mat2x3_mul; + pub const mul_m = oc_mat2x3_mul_m; + pub const inv = oc_mat2x3_inv; + pub const rotate = oc_mat2x3_rotate; + pub const translate = oc_mat2x3_translate; + pub fn scale(x: f32, y: f32) Mat2x3 { + return .{ .m = .{ x, 0, 0, 0, y, 0 } }; + } + pub fn scaleUniform(s: f32) Mat2x3 { + return .{ .m = .{ s, 0, 0, 0, s, 0 } }; + } + + pub const push = oc_matrix_push; + pub const pop = oc_matrix_pop; + pub const top = oc_matrix_top; +}; + +//------------------------------------------------------------------------------------------ +// [GRAPHICS] Clip stack +//------------------------------------------------------------------------------------------ + +pub const clip = struct { + extern fn oc_clip_push(x: f32, y: f32, w: f32, h: f32) void; + extern fn oc_clip_pop() void; + extern fn oc_clip_top() Rect; + + pub const push = oc_clip_push; + pub const pop = oc_clip_pop; + pub const top = oc_clip_top; +}; + //------------------------------------------------------------------------------------------ // [GRAPHICS]: resources //------------------------------------------------------------------------------------------ @@ -487,6 +1392,8 @@ pub const clockTime = oc_clock_time; pub const Surface = extern struct { h: u64, + extern fn oc_surface_nil(void) Surface; + extern fn oc_surface_is_nil(surface: Surface) bool; extern fn oc_surface_canvas() Surface; extern fn oc_surface_gles() Surface; extern fn oc_surface_select(surface: Surface) void; @@ -503,8 +1410,9 @@ pub const Surface = extern struct { // elt_count: u32, // elements: [*]PathElt, // ) void; - extern fn oc_render(surface: Surface, canvas: Canvas) void; + pub const nil = oc_surface_nil; + pub const isNil = oc_surface_is_nil; pub const canvas = oc_surface_canvas; pub const gles = oc_surface_gles; pub const select = oc_surface_select; @@ -514,7 +1422,6 @@ pub const Surface = extern struct { pub const bringToFront = oc_surface_bring_to_front; pub const sendToBack = oc_surface_send_to_back; // pub const renderCommands = oc_surface_render_commands; - pub const render = oc_render; }; pub const Canvas = extern struct { @@ -524,31 +1431,40 @@ pub const Canvas = extern struct { extern fn oc_canvas_is_nil(canvas: Canvas) bool; extern fn oc_canvas_create() Canvas; extern fn oc_canvas_destroy(canvas: Canvas) void; - extern fn oc_canvas_set_current(canvas: Canvas) Canvas; + extern fn oc_canvas_select(canvas: Canvas) Canvas; + extern fn oc_render(canvas: Canvas) void; pub const nil = oc_canvas_nil; pub const isNil = oc_canvas_is_nil; pub const create = oc_canvas_create; pub const destroy = oc_canvas_destroy; - pub const setCurrent = oc_canvas_set_current; + pub const select = oc_canvas_select; + pub const render = oc_render; }; pub const Image = extern struct { h: u64, - pub const create = oc_image_create; - pub const destroy = oc_image_destroy; - pub const uploadRegionRGBA = oc_image_upload_region_rgba8; - pub const size = oc_image_size; - + extern fn oc_image_nil(void) Image; + extern fn oc_image_is_nil(image: Image) bool; extern fn oc_image_create(surface: Surface, width: u32, height: u32) Image; + extern fn oc_image_create_from_rgba8(surface: Surface, width: u32, height: u32, pixels: [*]u8) Image; + extern fn oc_image_create_from_memory(surface: Surface, mem: Str8, flip: bool) Image; + extern fn oc_image_create_from_file(surface: Surface, file: File, flip: bool) Image; + extern fn oc_image_create_from_path(surface: Surface, path: Str8, flip: bool) Image; extern fn oc_image_destroy(image: Image) void; extern fn oc_image_upload_region_rgba8(image: Image, region: Rect, pixels: [*]u8) void; extern fn oc_image_size(image: Image) Vec2; extern fn oc_image_draw(image: Image, rect: Rect) void; extern fn oc_image_draw_region(image: Image, srcRegion: Rect, dstRegion: Rect) void; + pub const nil = oc_image_nil; + pub const isNil = oc_image_is_nil; pub const create = oc_image_create; + pub const createFromRgba8 = oc_image_create_from_rgba8; + pub const createFromMemory = oc_image_create_from_memory; + pub const createFromFile = oc_image_create_from_file; + pub const createFromPath = oc_image_create_from_path; pub const destroy = oc_image_destroy; pub const uploadRegionRgba8 = oc_image_upload_region_rgba8; pub const size = oc_image_size; @@ -568,6 +1484,10 @@ pub const Rect = extern union { wh: Vec2, }, Array: [4]f32, + + pub fn xywh(x: f32, y: f32, w: f32, h: f32) Rect { + return .{ .Flat = .{ .x = x, .y = y, .w = w, .h = h } }; + } }; pub const Color = extern union { @@ -580,104 +1500,6 @@ pub const Color = extern union { Array: [4]f32, }; -//------------------------------------------------------------------------------------------ -// [GRAPHICS]: fonts -//------------------------------------------------------------------------------------------ - -//NOTE(martin): the following int valued functions return -1 if font is invalid or codepoint is not present in font// -//TODO(martin): add enum error codes -//NOTE(martin): if you need to process more than one codepoint, first convert your codepoints to glyph indices, then use the -// glyph index versions of the functions, which can take an array of glyph indices. - -const Font = extern struct { - h: u64, - - extern fn oc_font_nil() Font; - extern fn oc_font_create_from_memory(mem: Str8, rangeCount: u32, ranges: [*]UnicodeRange) Font; - extern fn oc_font_destroy(font: Font) void; - extern fn oc_font_get_extents(font: Font) FontExtents; - extern fn oc_font_get_scaled_extents(font: Font, emSize: f32) FontExtents; - extern fn oc_font_get_scale_for_em_pixels(font: Font, emSize: f32) f32; - extern fn oc_font_get_glyph_indices(font: Font, codePoints: Str32, backing: Str32) Str32; - extern fn oc_font_push_glyph_indices(font: Font, arena: *Arena, codePoints: Str32) Str32; - extern fn oc_font_get_glyph_index(font: Font, codePoint: Utf32) u32; - extern fn oc_font_get_codepoint_extents(font: Font, codePoint: Utf32, outExtents: *TextExtents) c_int; - extern fn oc_font_get_glyph_extents(font: Font, glyphIndices: Str32, outExtents: *TextExtents) c_int; - extern fn oc_text_bounding_box_utf32(font: Font, fontSize: f32, text: Str32) Rect; - extern fn oc_text_bounding_box(font: Font, fontSize: f32, text: Str8) Rect; - - pub const nil = oc_font_nil; - pub fn createFromMemory(mem: Str8, ranges: []UnicodeRange) Font { - return oc_font_create_from_memory(mem, @intCast(ranges.len), ranges.ptr); - } - pub const destroy = oc_font_destroy; - pub const getExtents = oc_font_get_extents; - pub const getScaledExtents = oc_font_get_scaled_extents; - pub const getScaleForEmPixels = oc_font_get_scale_for_em_pixels; - pub const getGlyphIndices = oc_font_get_glyph_indices; - pub const pushGlyphIndices = oc_font_push_glyph_indices; - pub const getGlyphIndex = oc_font_get_glyph_index; - pub const getCodepointExtents = oc_font_get_codepoint_extents; - pub const getGlyphExtents = oc_font_get_glyph_extents; - pub const boundingBoxUtf32 = oc_text_bounding_box_utf32; - pub const boundingBox = oc_text_bounding_box; -}; - -const JointType = enum(c_uint) { - Miter, - Bevel, - None, -}; - -const CapType = enum(c_uint) { - None, - Square, -}; - -const FontExtents = extern struct { - ascent: f32, // the extent above the baseline (by convention a positive value extends above the baseline) - descent: f32, // the extent below the baseline (by convention, positive value extends below the baseline) - leading: f32, // spacing between one row's descent and the next row's ascent - x_height: f32, // height of the lower case letter 'x' - cap_height: f32, // height of the upper case letter 'M' - width: f32, // maximum width of the font -}; - -const TextExtents = extern struct { - x_bearing: f32, - y_bearing: f32, - width: f32, - height: f32, - x_advance: f32, - y_advance: f32, -}; - -//------------------------------------------------------------------------------------------ -// [GRAPHICS] Matrix / Clip stack -//------------------------------------------------------------------------------------------ - -pub const Mat2x3 = extern struct { - m: [6]f32, - - extern fn oc_matrix_push(matrix: Mat2x3) void; - extern fn oc_matrix_pop() void; - extern fn oc_matrix_top() Mat2x3; - - pub const push = oc_matrix_push; - pub const pop = oc_matrix_pop; - pub const top = oc_matrix_top; -}; - -pub const clip = struct { - extern fn oc_clip_push(x: f32, y: f32, w: f32, h: f32) void; - extern fn oc_clip_pop() void; - extern fn oc_clip_top() Rect; - - pub const push = oc_clip_push; - pub const pop = oc_clip_pop; - pub const top = oc_clip_top; -}; - //------------------------------------------------------------------------------------------ // [GRAPHICS]: graphics attributes setting/getting //------------------------------------------------------------------------------------------ @@ -687,7 +1509,7 @@ extern fn oc_set_color_rgba(r: f32, g: f32, b: f32, a: f32) void; extern fn oc_set_width(width: f32) void; extern fn oc_set_tolerance(tolerance: f32) void; extern fn oc_set_joint(joint: JointType) void; -extern fn oc_set_max_joint_excursion(maxJointExcursion: f32) void; +extern fn oc_set_max_joint_excursion(max_joint_excursion: f32) void; extern fn oc_set_cap(cap: CapType) void; extern fn oc_set_font(font: Font) void; extern fn oc_set_font_size(size: f32) void; @@ -743,7 +1565,7 @@ extern fn oc_quadratic_to(x1: f32, y1: f32, x2: f32, y2: f32) void; extern fn oc_cubic_to(x1: f32, y1: f32, x2: f32, y2: f32, x3: f32, y3: f32) void; extern fn oc_close_path() void; -extern fn oc_glyph_outlines(glyphIndices: Str32) Rect; +extern fn oc_glyph_outlines(glyph_indices: Str32) Rect; extern fn oc_codepoints_outlines(string: Str32) void; extern fn oc_text_outlines(string: Str8) void; @@ -782,7 +1604,7 @@ extern fn oc_ellipse_fill(x: f32, y: f32, rx: f32, ry: f32) void; extern fn oc_ellipse_stroke(x: f32, y: f32, rx: f32, ry: f32) void; extern fn oc_circle_fill(x: f32, y: f32, r: f32) void; extern fn oc_circle_stroke(x: f32, y: f32, r: f32) void; -extern fn oc_arc(x: f32, y: f32, r: f32, arcAngle: f32, startAngle: f32) void; +extern fn oc_arc(x: f32, y: f32, r: f32, arc_angle: f32, start_angle: f32) void; pub const rectangleFill = oc_rectangle_fill; pub const rectangleStroke = oc_rectangle_stroke; @@ -815,6 +1637,9 @@ const File = extern struct { extern fn oc_file_get_status(file: File) FileStatus; extern fn oc_file_size(file: File) u64; + extern fn oc_file_open_with_request(path: Str8, rights: FileAccessFlags, flags: FileOpenFlags) File; + extern fn oc_file_open_with_dialog(arena: *Arena, rights: FileAccessFlags, flags: FileOpenFlags, desc: *FileDialogDesc) FileOpenWithDialogResult; + pub const nil = oc_file_nil; pub const isNil = oc_file_is_nil; pub const open = oc_file_open; @@ -826,8 +1651,11 @@ const File = extern struct { pub const write = oc_file_write; pub const read = oc_file_read; - const getStatus = oc_file_get_status; - const size = oc_file_size; + pub const getStatus = oc_file_get_status; + pub const size = oc_file_size; + + pub const openWithRequest = oc_file_open_with_request; + pub const openWithDialog = oc_file_open_with_dialog; }; const FileOpenFlags = packed struct(u16) { @@ -967,18 +1795,6 @@ const FileStatus = extern struct { modification_date: DateStamp, }; -//------------------------------------------------------------------------------------------ -// [FILE IO] complete io queue api -//------------------------------------------------------------------------------------------ - -extern fn oc_io_wait_single_req(req: *IoReq) IoCmp; - -pub const ioWaitSingleReq = oc_io_wait_single_req; - -//------------------------------------------------------------------------------------------ -// [FILE IO] Asking users for file capabilities -//------------------------------------------------------------------------------------------ - const FileOpenWithDialogElt = extern struct { list_elt: ListElt, file: File, @@ -990,5 +1806,10 @@ const FileOpenWithDialogResult = extern struct { selection: List, }; -extern fn oc_file_open_with_request(path: Str8, rights: FileAccessFlags, flags: FileOpenFlags) File; -extern fn oc_file_open_with_dialog(arena: *Arena, rights: FileAccessFlags, flags: FileOpenFlags, desc: *FileDialogDesc) FileOpenWithDialogResult; +//------------------------------------------------------------------------------------------ +// [FILE IO] complete io queue api +//------------------------------------------------------------------------------------------ + +extern fn oc_io_wait_single_req(req: *IoReq) IoCmp; + +pub const ioWaitSingleReq = oc_io_wait_single_req;