bugfixes in modules
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 26 Oct 2021 02:59:25 +0000 (21:59 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 26 Oct 2021 02:59:25 +0000 (21:59 -0500)
modules/bmfont/bmfont_loader.onyx
modules/bmfont/module.onyx
modules/bmfont/position.onyx
modules/bmfont/types.onyx
modules/bmfont/utils.onyx
modules/json/decoder.onyx
modules/json/parser.onyx
modules/json/tokenizer.onyx
modules/json/types.onyx

index 5d7656dca74981edfc7561599d028a15561b31b1..2de49c74a8136100d878d61e7cf6f280b6d9a05f 100644 (file)
@@ -12,13 +12,12 @@ load_bmfont :: (fnt_data: [] u8) -> BMFont {
 
     parse_bmfont(fnt_data, ^bmf);
 
-    @Cleanup // this was a stupid way of doing this. Just use a f-ing for loop.
-    array.map(bmf.glyphs.entries, #code {
+    for ^it: bmf.glyphs.entries {
         it.value.tex_x = ~~ it.value.x / cast(f32) bmf.common.scale_width;        
         it.value.tex_y = ~~ it.value.y / cast(f32) bmf.common.scale_height;        
         it.value.tex_w = ~~ it.value.w / cast(f32) bmf.common.scale_width;        
         it.value.tex_h = ~~ it.value.h / cast(f32) bmf.common.scale_height;        
-    });
+    }
 
     return bmf;
 }
index a994d2efa8e87331624a1c2aa99a0835e6c0f0d5..2fed33cebf1c275dd3d907e244d8f4bc1397abfa 100644 (file)
@@ -1,6 +1,6 @@
 /*
 TODO:
-
+    - Add rendering SDF fonts generated using msdf-bmfont-xml from npm.
 
 
 
index 6cd6025550eee43a9b98d56f81a133ab172340bd..7f16298bb75eb15c426d17c140711172b6f6a46e 100644 (file)
@@ -75,7 +75,7 @@ get_character_positions :: (font: ^BMFont, size: f32, text: str, x: f32, y: f32)
             }
 
             renderable_glyph.pos_x = math.floor(rc.x + ~~glyph.xoffset * rc.size + .5);
-            renderable_glyph.pos_y = math.floor(rc.y + ~~glyph.yoffset * rc.size - rc.baseline + .5);
+            renderable_glyph.pos_y = math.floor(rc.y + ~~glyph.yoffset * rc.size + .5) - math.floor(rc.baseline);
             renderable_glyph.pos_w = math.floor(~~glyph.w * rc.size + .5);
             renderable_glyph.pos_h = math.floor(~~glyph.h * rc.size + .5);
 
@@ -84,8 +84,8 @@ get_character_positions :: (font: ^BMFont, size: f32, text: str, x: f32, y: f32)
             renderable_glyph.tex_w = glyph.tex_w;
             renderable_glyph.tex_h = glyph.tex_h;
 
-            renderable_glyph.x_advance = ~~glyph.xadvance * rc.size;
-            rc.x += ~~glyph.xadvance * rc.size;
+            renderable_glyph.x_advance = math.floor(~~glyph.xadvance * rc.size + 0.5);
+            rc.x += math.floor(~~glyph.xadvance * rc.size + 0.5);
 
             return ^renderable_glyph, true;
         }
index 9dfe0f6e993cd6ff1f9236748137ab2504b544b4..b59325ab06e2614ebc7fa6824ef2f6d2ee7fea7d 100644 (file)
@@ -10,9 +10,7 @@ BMFont :: struct {
     pages  : Map(i32, str);
     glyphs : Map(i32, BMFont_Glyph);
 
-    get_glyph :: (use bmfont: ^BMFont, char: u8) -> ^BMFont_Glyph {
-        return map.get_ptr(^glyphs, ~~char);
-    }
+    get_glyph :: (use bmfont: ^BMFont, char: u8) => ^glyphs[~~char];
 }
 
 BMFont_Info :: struct {
@@ -76,4 +74,4 @@ BMFont_Glyph :: struct {
     tex_y: f32 = 0;
     tex_w: f32 = 0;
     tex_h: f32 = 0;
-}
\ No newline at end of file
+}
index f01e1a32052579282b7a0df3b73cdbbb48b6ad68..5e61f5c96e795da726a34d1909d0c84dcbeba2d9 100644 (file)
@@ -2,7 +2,6 @@ package bmfont
 
 #private_file math :: package core.math
 
-@Incomplete // does not use the size parameter
 get_width :: (use font: ^BMFont, text: str, size: f32) -> f32 {
     max_x := 0.0f;
     x := 0.0f;
@@ -60,4 +59,4 @@ get_height :: (use font: ^BMFont, text: str, size: f32) -> f32 {
 
         return y + max_y;
     }
-}
\ No newline at end of file
+}
index 39c9e902e311e4fc87296fa893772f7557b67f07..c0771f2de7848a02ee107db0243c609f181cfc9f 100644 (file)
@@ -8,12 +8,12 @@ decode :: (data: str, allocator := context.allocator) -> Json {
     json.root = null;
 
     root, err := parse(data, allocator);
-    if err != .None {
-        switch err {
-            case .EOF do println("Reached EOF");
-            case .Illegal_Character do println("Illegal Character");
-            case .String_Unterminated do println("Unterminated String");
-            case .Unexpected_Token do println("Unexpected Token");
+    if err.kind != .None {
+        switch err.kind {
+            case .EOF do printf("Reached EOF\n");
+            case .Illegal_Character do printf("Illegal Character: {}\n", err.pos);
+            case .String_Unterminated do printf("Unterminated String: {}\n", err.pos);
+            case .Unexpected_Token do printf("Unexpected Token: {}\n", err.pos);
         }
 
         return json;
index 52edaa65857c70897ccbb0d53568ca21bf1888cd..68f03efad249c005079112ce3df8cbb7b6730631 100644 (file)
@@ -47,8 +47,9 @@ consume_token_if_next :: (use parser: ^Parser, kind: Token.Kind) -> bool {
 expect_token :: (use parser: ^Parser, kind: Token.Kind) -> (Token, Error) {
     previous :=  current_token;
     consume_token(parser);
-    if previous.kind == kind do return previous, .None;
-    else                     do return previous, .Unexpected_Token;
+    error := Error.{ .None, previous.position };
+    if previous.kind != kind do error.kind = .Unexpected_Token;
+    return previous, error;
 }
 
 #private
@@ -98,25 +99,25 @@ parse_value :: (use parser: ^Parser) -> (^Value, Error) {
 
         case .Open_Bracket {
             value, err := parse_array(parser);
-            if err != .None do return value, err;
+            if err.kind != .None do return value, err;
             
             return_value = value;
         }
 
         case .Open_Brace {
             value, err := parse_object(parser);
-            if err != .None do return value, err;
+            if err.kind != .None do return value, err;
 
             return_value = value;
         }
 
         case #default {
             consume_token(parser);
-            return return_value, .Unexpected_Token;
+            return return_value, .{ .Unexpected_Token, current.position };
         }
     }
 
-    return return_value, .None;
+    return return_value, .{ .None };
 }
 
 #private_file
@@ -124,11 +125,11 @@ parse_array :: (use parser: ^Parser) -> (^Value_Array, Error) {
     value := new(Value_Array, allocator);
 
     _, err := expect_token(parser, .Open_Bracket);
-    if err != .None do return value, err;
+    if err.kind != .None do return value, err;
 
     // This uses the context allocators because the array resizing needs to happen in a general purpose heap allocator
     arr := array.make(#type ^Value, allocator=context.allocator);
-    defer if err != .None {
+    defer if err.kind != .None {
         for elem: arr {
             free(elem, allocator);
         } 
@@ -138,7 +139,7 @@ parse_array :: (use parser: ^Parser) -> (^Value_Array, Error) {
 
     while current_token.kind != .Close_Bracket {
         elem, elem_err := parse_value(parser);
-        if elem_err != .None {
+        if elem_err.kind != .None {
             err = elem_err;
             return value, err;
         }
@@ -151,7 +152,7 @@ parse_array :: (use parser: ^Parser) -> (^Value_Array, Error) {
     }
 
     _, close_err := expect_token(parser, .Close_Bracket);
-    if close_err != .None {
+    if close_err.kind != .None {
         err = close_err;
         return value, err;
     }
@@ -166,17 +167,17 @@ parse_object :: (use parser: ^Parser) -> (^Value_Object, Error) {
     value := new(Value_Object, allocator);
 
     _, err := expect_token(parser, .Open_Brace);
-    if err != .None do return value, err;
+    if err.kind != .None do return value, err;
 
     // This uses the context allocators because the array resizing needs to happen in a general purpose heap allocator
     array.init(^value.object_, allocator=context.allocator);
-    defer if err != .None {
+    defer if err.kind != .None {
         free(value, allocator);
     }
 
     while current_token.kind != .Close_Brace {
         key_token, key_err := expect_token(parser, .String);
-        if key_err != .None {
+        if key_err.kind != .None {
             err = key_err;
             return value, err;
         }
@@ -184,13 +185,13 @@ parse_object :: (use parser: ^Parser) -> (^Value_Object, Error) {
         key := unescape_string(key_token, allocator);
 
         _, colon_err := expect_token(parser, .Colon);
-        if colon_err != .None {
+        if colon_err.kind != .None {
             err = colon_err;
             return value, err;
         }
 
         elem, elem_err := parse_value(parser);
-        if elem_err != .None {
+        if elem_err.kind != .None {
             err = elem_err;
             return value, err;
         }
@@ -199,7 +200,8 @@ parse_object :: (use parser: ^Parser) -> (^Value_Object, Error) {
         #if false {
             for elem: value.object_ {
                 if elem.key == key {
-                    err = .Duplicate_Keys;
+                    err.kind = .Duplicate_Keys;
+                    err.pos  = key_token.pos;
                     string.free(key, allocator);
                     return value, err;
                 }
@@ -217,7 +219,7 @@ parse_object :: (use parser: ^Parser) -> (^Value_Object, Error) {
     } 
 
     _, close_err := expect_token(parser, .Close_Brace);
-    if close_err != .None {
+    if close_err.kind != .None {
         err = close_err;
         return value, err;
     }
@@ -321,4 +323,4 @@ unescape_string :: (token: Token, allocator: Allocator) -> str {
 
     buffer.count = buffer_write;
     return buffer;
-}
\ No newline at end of file
+}
index 5db0009f7d6d554f66251405715c909529b22c9f..0bb7eea4ce4c7c97be07fc3dd70ee995b55edd69 100644 (file)
@@ -48,7 +48,7 @@ Position :: struct {
 
 #private
 token_get :: (use tkn: ^Tokenizer) -> (Token, Error) {
-    err := Error.None;
+    err := Error.{};
 
     skip_whitespace(tkn);
     token := Token.{};
@@ -56,7 +56,7 @@ token_get :: (use tkn: ^Tokenizer) -> (Token, Error) {
 
     curr_char := data[offset];
     next_char, has_next := next_character(tkn);
-    if !has_next do return .{}, .EOF;
+    if !has_next do return .{}, .{ .EOF, token.position };
 
     switch curr_char {
         case #char "{" do token.kind = .Open_Brace;
@@ -77,11 +77,11 @@ token_get :: (use tkn: ^Tokenizer) -> (Token, Error) {
         }
 
         case #char "-" {
-            next_character(tkn);
             switch data[offset] {
                 case #char "0" .. #char "9" ---
                 case #default {
-                    err = .Illegal_Character;
+                    err.kind = .Illegal_Character;
+                    err.pos  = token.position;
                     break break;
                 }
             }
@@ -114,7 +114,8 @@ token_get :: (use tkn: ^Tokenizer) -> (Token, Error) {
             while offset < data.count {
                 ch := data[offset];
                 if ch == #char "\n" {
-                    err = .String_Unterminated;
+                    err.kind = .String_Unterminated;
+                    err.pos  = token.position;
                     break break;
                 }
 
@@ -132,7 +133,7 @@ token_get :: (use tkn: ^Tokenizer) -> (Token, Error) {
 
     token.text = data.data[token.offset .. offset];
 
-    if token.kind == .Invalid do err = .Illegal_Character;
+    if token.kind == .Invalid do err.kind = .Illegal_Character;
 
     return token, err;
 }
@@ -143,7 +144,7 @@ next_character :: (use tkn: ^Tokenizer) -> (u8, bool) {
 
     retval := data[offset];
     offset += 1;
-    column += offset;
+    column += 1;
 
     return retval, true;
 }
@@ -217,4 +218,4 @@ skip_escape :: (use tkn: ^Tokenizer) {
             next_character(tkn);
         }
     }
-}
\ No newline at end of file
+}
index 2f6567ef40e91f05a66f3371a49c8107c2d113a0..49bc0242b4d9f174e3c1c9d74006340b5e94e085 100644 (file)
@@ -13,14 +13,20 @@ Json :: struct {
     root: ^Value;
 }
 
-Error :: enum {
-    None;
-    EOF;
-    Illegal_Character;
-    String_Unterminated;
-    Unexpected_Token;
+Error :: struct {
+    Kind :: enum {
+        None;
+        EOF;
+        Illegal_Character;
+        String_Unterminated;
+        Unexpected_Token;
+    }
+
+    kind := Kind.None;
+    use pos := Position.{ 0, 1, 1 };
 }
 
+
 Value :: struct {
     Type :: enum {
         Null :: 0x00;