aboutsummaryrefslogtreecommitdiff
path: root/tools/compile_assets/aseprite/utils/utils_internal.odin
blob: 6915fe50dff1560c9777655df8cc542030c6ae20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package aseprite_file_handler_utility

import ir "base:intrinsics"
import "base:runtime"
import "core:reflect"
import "core:strconv"
import "core:slice"

@(require) import "core:fmt"
@(require) import "core:log"

_ :: reflect


@(private)
fast_log_str :: proc(lvl: log.Level, str: string, loc := #caller_location) {
    logger := context.logger
    if logger.procedure == nil { return }
    if lvl < logger.lowest_level { return }
    logger.procedure(logger.data, lvl, str, logger.options, loc)
}

@(private)
fast_log_str_enum :: proc(lvl: log.Level, str: string, val: $T, sep := " ", loc := #caller_location) where ir.type_is_enum(T) {
    logger := context.logger
    if logger.procedure == nil { return }
    if lvl < logger.lowest_level { return }

    s := reflect.enum_string(val)
    buf := make([]u8, len(str) + len(sep) + len(s))
    defer delete(buf)

    n := copy(buf[:], str)
    n += copy(buf[n:], sep)
    copy(buf[n:], s)

    logger.procedure(logger.data, lvl, string(buf), logger.options, loc)
}

@(private)
fast_log_str_num :: proc(lvl: log.Level, str: string, val: $T, sep := " ", loc := #caller_location) where ir.type_is_integer(T) {
    logger := context.logger
    if logger.procedure == nil { return }
    if lvl < logger.lowest_level { return }

    nb: [32]u8
    s := strconv.append_int(nb[:], i64(val), 10)
    buf := make([]u8, len(str) + len(sep) + len(s))
    defer delete(buf)

    n := copy(buf[:], str)
    n += copy(buf[n:], sep)
    copy(buf[n:], s)

    logger.procedure(logger.data, lvl, string(buf), logger.options, loc)
}

@(private)
fast_log :: proc {fast_log_str, fast_log_str_enum, fast_log_str_num}


// Internal Debugging Tool.
format_pixels :: proc(img: Image, x := 4, y := 4, alloc := context.allocator) -> (str: string, err: runtime.Allocator_Error) #optional_allocator_error  {
    ch := int(img.bpp) >> 3

    size := len(img.data) * 3  /*pixel in bytes*/ \ 
    + (len(img.data)/ch - 1)   /*comas*/ \
    + (len(img.data)*2/ch)     /*<space>|*/ \
    + (img.width*img.height*4) /*tile gap*/

    sb := make([dynamic]byte, 0, size) or_return
    buf: [3]byte 

    for n in 0..<len(img.data)/ch { 
        if n %% (img.width) == 0 {
            append(&sb, '|') or_return
        }

        s := strconv.write_int(buf[:], i64(img.data[n*ch]), 10)
        for _ in 0..<3-len(s) {
            append(&sb, ' ') or_return
        }
       append(&sb, s) or_return

        for i in 1..<ch {
            append(&sb, ',')
            s = strconv.write_int(buf[:], i64(img.data[n*ch+i]), 10)
            for _ in 0..<3-len(s) {
                append(&sb, ' ') or_return
            }
            append(&sb, s) or_return
        }
        append(&sb, '|') or_return

        if (n+1) %% img.width == 0 { 
            append(&sb, '\n') or_return
        }else if (n+1) %% x == 0 { 
            append(&sb, "   |") or_return
        }
        if (n+1) %% (img.width * y) == 0 { 
            append(&sb, '\n') or_return
        }
    }

    return string(sb[:]), nil
}

fill_colour :: proc(data: []u8, colour: [4]u8) {
    slice.fill(slice.reinterpret([][4]u8, data), colour)
}