mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 18:02:02 +00:00
61 lines
1.5 KiB
Odin
61 lines
1.5 KiB
Odin
package image
|
|
|
|
import "core:mem"
|
|
import "core:os"
|
|
import "core:bytes"
|
|
|
|
Loader_Proc :: #type proc(data: []byte, options: Options, allocator: mem.Allocator) -> (img: ^Image, err: Error)
|
|
Destroy_Proc :: #type proc(img: ^Image)
|
|
|
|
@(private)
|
|
_internal_loaders: [Which_File_Type]Loader_Proc
|
|
_internal_destroyers: [Which_File_Type]Destroy_Proc
|
|
|
|
register :: proc(kind: Which_File_Type, loader: Loader_Proc, destroyer: Destroy_Proc) {
|
|
assert(loader != nil)
|
|
assert(destroyer != nil)
|
|
assert(_internal_loaders[kind] == nil)
|
|
_internal_loaders[kind] = loader
|
|
|
|
assert(_internal_destroyers[kind] == nil)
|
|
_internal_destroyers[kind] = destroyer
|
|
}
|
|
|
|
load :: proc{
|
|
load_from_bytes,
|
|
load_from_file,
|
|
}
|
|
|
|
load_from_bytes :: proc(data: []byte, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) {
|
|
loader := _internal_loaders[which(data)]
|
|
if loader == nil {
|
|
return nil, .Unsupported_Format
|
|
}
|
|
return loader(data, options, allocator)
|
|
}
|
|
|
|
|
|
load_from_file :: proc(filename: string, options := Options{}, allocator := context.allocator) -> (img: ^Image, err: Error) {
|
|
data, ok := os.read_entire_file(filename, allocator)
|
|
defer delete(data, allocator)
|
|
if ok {
|
|
return load_from_bytes(data, options, allocator)
|
|
} else {
|
|
return nil, .Unable_To_Read_File
|
|
}
|
|
}
|
|
|
|
destroy :: proc(img: ^Image, allocator := context.allocator) {
|
|
if img == nil {
|
|
return
|
|
}
|
|
context.allocator = allocator
|
|
destroyer := _internal_destroyers[img.which]
|
|
if destroyer != nil {
|
|
destroyer(img)
|
|
} else {
|
|
assert(img.metadata == nil)
|
|
bytes.buffer_destroy(&img.pixels)
|
|
free(img)
|
|
}
|
|
} |