From d0109db23b742ac1a7ed44e0c47be86aad37336b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 28 Aug 2022 19:41:42 +0200 Subject: [PATCH] [TGA] Add support for Top-Right and Bottom-Right origins. --- core/image/common.odin | 9 +++++++-- core/image/tga/tga.odin | 32 ++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/core/image/common.odin b/core/image/common.odin index c79344445..7c8df3d57 100644 --- a/core/image/common.odin +++ b/core/image/common.odin @@ -379,8 +379,13 @@ QOI_Info :: struct { } TGA_Data_Type :: enum u8 { - Uncompressed_RGB = 2, - Compressed_RBB = 10, + No_Image_Data = 0, + Uncompressed_Color_Mapped = 1, + Uncompressed_RGB = 2, + Uncompressed_Black_White = 3, + Compressed_Color_Mapped = 9, + Compressed_RGB = 10, + Compressed_Black_White = 11, } TGA_Header :: struct #packed { diff --git a/core/image/tga/tga.odin b/core/image/tga/tga.odin index d257d06ff..af5b07ef5 100644 --- a/core/image/tga/tga.odin +++ b/core/image/tga/tga.odin @@ -145,9 +145,23 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a rle_encoding := false switch header.data_type_code { - case .Compressed_RBB: rle_encoding = true + // Supported formats: RGB(A), RGB(A) RLE + case .Compressed_RGB: + rle_encoding = true case .Uncompressed_RGB: - case: return nil, .Unsupported_Format + + case .No_Image_Data: + return nil, .Unsupported_Format + case .Uncompressed_Color_Mapped: + return nil, .Unsupported_Format + case .Uncompressed_Black_White: + return nil, .Unsupported_Format + case .Compressed_Color_Mapped: + return nil, .Unsupported_Format + case .Compressed_Black_White: + return nil, .Unsupported_Format + case: + return nil, .Unsupported_Format } if header.bits_per_pixel != 24 && header.bits_per_pixel != 32 { @@ -208,7 +222,8 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a return img, .Unable_To_Allocate_Or_Resize } - origin_is_topleft := header.image_descriptor & IMAGE_DESCRIPTOR_TOPLEFT_MASK != 0 + origin_is_top := header.image_descriptor & IMAGE_DESCRIPTOR_TOP_MASK != 0 + origin_is_left := header.image_descriptor & IMAGE_DESCRIPTOR_RIGHT_MASK == 0 rle_repetition_count := 0 read_pixel := true is_packet_rle := false @@ -216,10 +231,10 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a pixel: [4]u8 stride := img.width * img.channels - line := 0 if origin_is_topleft else img.height - 1 + line := 0 if origin_is_top else img.height - 1 for _ in 0..