Browse Source

Add `destroy` with loader

gingerBill 3 years ago
parent
commit
3aa0a733f3

+ 9 - 3
core/image/general_loader.odin

@@ -4,13 +4,20 @@ import "core:mem"
 import "core:os"
 import "core:os"
 
 
 Loader_Proc :: #type proc(data: []byte, options: Options, allocator: mem.Allocator) -> (img: ^Image, err: Error)
 Loader_Proc :: #type proc(data: []byte, options: Options, allocator: mem.Allocator) -> (img: ^Image, err: Error)
+Destroy_Proc :: #type proc(img: ^Image)
 
 
 @(private)
 @(private)
 _internal_loaders: [Which_File_Type]Loader_Proc
 _internal_loaders: [Which_File_Type]Loader_Proc
+_internal_destroyers: [Which_File_Type]Destroy_Proc
 
 
-register_loader :: proc(kind: Which_File_Type, loader: Loader_Proc) {
+register :: proc(kind: Which_File_Type, loader: Loader_Proc, destroyer: Destroy_Proc) {
+	assert(loader != nil)
+	assert(destroyer != nil)
 	assert(_internal_loaders[kind] == nil)
 	assert(_internal_loaders[kind] == nil)
 	_internal_loaders[kind] = loader
 	_internal_loaders[kind] = loader
+
+	assert(_internal_destroyers[kind] == nil)
+	_internal_destroyers[kind] = destroyer
 }
 }
 
 
 load :: proc{
 load :: proc{
@@ -33,7 +40,6 @@ load_from_file :: proc(filename: string, options := Options{}, allocator := cont
 	if ok {
 	if ok {
 		return load_from_bytes(data, options, allocator)
 		return load_from_bytes(data, options, allocator)
 	} else {
 	} else {
-		img = new(Image, allocator)
-		return img, .Unable_To_Read_File
+		return nil, .Unable_To_Read_File
 	}
 	}
 }
 }

+ 8 - 5
core/image/netpbm/netpbm.odin

@@ -755,9 +755,12 @@ _register :: proc() {
 	loader :: proc(data: []byte, options: image.Options, allocator: mem.Allocator) -> (img: ^Image, err: Error) {
 	loader :: proc(data: []byte, options: image.Options, allocator: mem.Allocator) -> (img: ^Image, err: Error) {
 		return load_from_bytes(data, allocator)
 		return load_from_bytes(data, allocator)
 	}
 	}
-	image.register_loader(.PBM, loader)
-	image.register_loader(.PGM, loader)
-	image.register_loader(.PPM, loader)
-	image.register_loader(.PAM, loader)
-	image.register_loader(.PFM, loader)
+	destroyer :: proc(img: ^Image) {
+		_ = destroy(img)
+	}
+	image.register(.PBM, loader, destroyer)
+	image.register(.PGM, loader, destroyer)
+	image.register(.PPM, loader, destroyer)
+	image.register(.PAM, loader, destroyer)
+	image.register(.PFM, loader, destroyer)
 }
 }

+ 2 - 3
core/image/png/png.odin

@@ -344,8 +344,7 @@ load_from_file :: proc(filename: string, options := Options{}, allocator := cont
 	if ok {
 	if ok {
 		return load_from_bytes(data, options)
 		return load_from_bytes(data, options)
 	} else {
 	} else {
-		img = new(Image)
-		return img, .Unable_To_Read_File
+		return nil, .Unable_To_Read_File
 	}
 	}
 }
 }
 
 
@@ -1642,5 +1641,5 @@ load :: proc{load_from_file, load_from_bytes, load_from_context}
 
 
 @(init, private)
 @(init, private)
 _register :: proc() {
 _register :: proc() {
-	image.register_loader(.PNG, load_from_bytes)
+	image.register(.PNG, load_from_bytes, destroy)
 }
 }

+ 2 - 3
core/image/qoi/qoi.odin

@@ -198,8 +198,7 @@ load_from_file :: proc(filename: string, options := Options{}, allocator := cont
 	if ok {
 	if ok {
 		return load_from_bytes(data, options)
 		return load_from_bytes(data, options)
 	} else {
 	} else {
-		img = new(Image)
-		return img, .Unable_To_Read_File
+		return nil, .Unable_To_Read_File
 	}
 	}
 }
 }
 
 
@@ -407,5 +406,5 @@ qoi_hash :: #force_inline proc(pixel: RGBA_Pixel) -> (index: u8) {
 
 
 @(init, private)
 @(init, private)
 _register :: proc() {
 _register :: proc() {
-	image.register_loader(.QOI, load_from_bytes)
+	image.register(.QOI, load_from_bytes, destroy)
 }
 }