From 7f6c6945aef7b26632093fa36b56b2951cb27165 Mon Sep 17 00:00:00 2001 From: Despacito696969 <56641258+Despacito696969@users.noreply.github.com> Date: Tue, 5 Apr 2022 20:17:47 +0200 Subject: [PATCH 1/3] Fix for `slice_to_components` Using `slice_to_components` wouldn't compile because `s.data` is type of `rawptr` and return type is `^T` --- core/mem/mem.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 817c0ea5f..d3dcf3a3d 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -166,7 +166,7 @@ slice_data_cast :: proc "contextless" ($T: typeid/[]$A, slice: $S/[]$B) -> T { slice_to_components :: proc "contextless" (slice: $E/[]$T) -> (data: ^T, len: int) { s := transmute(Raw_Slice)slice - return s.data, s.len + return (^T)(s.data), s.len } buffer_from_slice :: proc "contextless" (backing: $T/[]$E) -> [dynamic]E { From 6d0ba8d1898adabceafc6a181395f5d158176a04 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 16 Apr 2022 18:14:01 +0200 Subject: [PATCH 2/3] [LEB128] Add byte-at-a-time ILEB decoder. --- core/encoding/varint/leb128.odin | 44 +++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 4cad1da76..f8fcc7de5 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -66,33 +66,47 @@ decode_uleb128 :: proc {decode_uleb128_buffer, decode_uleb128_byte} // Decode a slice of bytes encoding a signed LEB128 integer into value and number of bytes used. // Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. -decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { - shift: uint - +decode_ileb128_buffer :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { if len(buf) == 0 { return 0, 0, .Buffer_Too_Small } for v in buf { - size += 1 - - // 18 * 7 bits = 126, which including sign means we can have a 19th byte. - if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && v > 0x7f { - return 0, 0, .Value_Too_Large + val, size, err = decode_ileb128_byte(v, size, val) + if err != .Buffer_Too_Small { + return } - - val |= i128(v & 0x7f) << shift - shift += 7 - - if v < 128 { break } } - if buf[size - 1] & 0x40 == 0x40 { - val |= max(i128) << shift + if err == .Buffer_Too_Small { + val, size = 0, 0 } return } +// Decode a a signed LEB128 integer into value and number of bytes used, one byte at a time. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. +decode_ileb128_byte :: proc(input: u8, offset: int, accumulator: i128) -> (val: i128, size: int, err: Error) { + size = offset + 1 + shift := uint(offset * 7) + + // 18 * 7 bits = 126, which including sign means we can have a 19th byte. + if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && input > 0x7f { + return 0, 0, .Value_Too_Large + } + + val = accumulator | i128(input & 0x7f) << shift + + if input < 128 { + if input & 0x40 == 0x40 { + val |= max(i128) << (shift + 7) + } + return val, size, .None + } + return val, size, .Buffer_Too_Small +} +decode_ileb128 :: proc{decode_ileb128_buffer, decode_ileb128_byte} + // Encode `val` into `buf` as an unsigned LEB128 encoded series of bytes. // `buf` must be appropriately sized. encode_uleb128 :: proc(buf: []u8, val: u128) -> (size: int, err: Error) { From 939973acd7a8ea17cc9dfda2a55e79dd0109a49c Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 17 Apr 2022 12:35:34 +0200 Subject: [PATCH 3/3] [QOI] Add to examples/all. --- examples/all/all_main.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 6a039e4dd..4f5bfbdc1 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -61,6 +61,7 @@ import hash "core:hash" import image "core:image" import png "core:image/png" +import qoi "core:image/qoi" import io "core:io" import log "core:log" @@ -159,6 +160,7 @@ _ :: fmt _ :: hash _ :: image _ :: png +_ :: qoi _ :: io _ :: log _ :: math