Files

110 lines
3.1 KiB
Odin
Raw Permalink Normal View History

2025-05-24 03:06:42 +02:00
package main
import "core:fmt"
import "core:image"
import "core:image/qoi"
import "core:image/png"
import "core:slice"
import "core:mem"
2025-05-24 03:06:42 +02:00
import "core:os/os2"
import blurhash "../"
decode_example :: proc() {
if len(os2.args) < 3 {
fmt.eprintln("Please input the blurhash as an arg")
2025-05-24 03:06:42 +02:00
return
}
track: mem.Tracking_Allocator
mem.tracking_allocator_init(&track, context.allocator)
alloc := mem.tracking_allocator(&track)
2025-05-24 03:06:42 +02:00
width := 400
height := 240
pixels, err := blurhash.decode(os2.args[2], width, height, 1.2, alloc)
2025-05-24 03:06:42 +02:00
if err != nil {
fmt.eprintln(err)
return
}
img, ok := image.pixels_to_image(slice.reinterpret([]image.RGB_Pixel, pixels), width, height)
if !ok {
fmt.eprintln("Couldn't create an image")
return
}
save_err := qoi.save_to_file("yup.qoi", &img)
if save_err != nil {
fmt.eprintln(save_err)
return
}
delete(pixels, alloc)
for _, leak in track.allocation_map {
fmt.printfln("%v leaked %m", leak.location, leak.size)
}
for bad_free in track.bad_free_array {
fmt.printfln("%v allocation %p was freed badly", bad_free.location, bad_free.memory)
}
fmt.printfln("Peak Mem: %m", track.peak_memory_allocated)
fmt.printfln("Total Mem: %m", track.total_memory_allocated)
fmt.printfln("Current Mem: %m", track.current_memory_allocated)
fmt.printfln("Total Allocs: %v, Total Frees: %v:", track.total_allocation_count, track.total_free_count)
fmt.printfln("Total Mem Free'd: %m", track.total_memory_freed)
2025-05-24 03:06:42 +02:00
}
encode_example :: proc() {
if len(os2.args) < 3 {
fmt.eprintln("Please provide a path to a png")
return
}
img, err := image.load_from_file(os2.args[2])
if err != nil {
fmt.eprintln(err)
return
}
track: mem.Tracking_Allocator
mem.tracking_allocator_init(&track, context.allocator)
alloc := mem.tracking_allocator(&track)
bhash, hash_err := blurhash.encode(img.pixels.buf[:], 5, 4, img.width, img.height, img.width*img.channels, alloc)
2025-05-24 03:06:42 +02:00
if hash_err != nil {
fmt.eprintln(hash_err)
return
}
fmt.println(bhash)
delete(bhash, alloc)
for _, leak in track.allocation_map {
fmt.printfln("%v leaked %m", leak.location, leak.size)
}
for bad_free in track.bad_free_array {
fmt.printfln("%v allocation %p was freed badly", bad_free.location, bad_free.memory)
}
fmt.printfln("Peak Mem: %m", track.peak_memory_allocated)
fmt.printfln("Total Mem: %m", track.total_memory_allocated)
fmt.printfln("Current Mem: %m", track.current_memory_allocated)
fmt.printfln("Total Allocs: %v, Total Frees: %v:", track.total_allocation_count, track.total_free_count)
fmt.printfln("Total Mem Free'd: %m", track.total_memory_freed)
2025-05-24 03:06:42 +02:00
}
main :: proc() {
if len(os2.args) < 2 {
fmt.eprintln("Usage: program \"decode|encode\" <arg>")
return
}
if os2.args[1] == "decode" {
decode_example()
} else if os2.args[1] == "encode" {
encode_example()
} else {
fmt.eprintln("Unknown command")
}
}