Move all TIFF type definitions to the source file
This commit is contained in:
		| @@ -8,6 +8,7 @@ | |||||||
| #include <netinet/in.h> | #include <netinet/in.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
|  | #include <stdint.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| @@ -34,6 +35,160 @@ | |||||||
|  |  | ||||||
| #define TEMP_ARENA_CAPACITY (20 * 1024 * 1024) | #define TEMP_ARENA_CAPACITY (20 * 1024 * 1024) | ||||||
|  |  | ||||||
|  | #define TYPE_MAX_COUNT (UINT8_MAX * sizeof(const char *)) | ||||||
|  |  | ||||||
|  | // clang-format off | ||||||
|  | enum tiff_byte_order { | ||||||
|  |   TIFF_ORDER_LITTLE_ENDIAN = 0x4949, | ||||||
|  |   TIFF_ORDER_BIG_ENDIAN    = 0x4d4d, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum tiff_public_tags { | ||||||
|  |   #include "tiff_public_tags.inc" | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum tiff_field_types { | ||||||
|  |   #include "tiff_field_types.inc" | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct field_type TiffFieldType; | ||||||
|  | struct field_type { | ||||||
|  |   const char *name; | ||||||
|  |   u16 byte_count; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | internal TiffFieldType field_types[TYPE_MAX_COUNT] = { | ||||||
|  |   #define TIFF_TYPE_LOOKUP | ||||||
|  |   #include "tiff_field_types.inc" | ||||||
|  |   #undef TIFF_TYPE_LOOKUP | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef enum tiff_image_type_names { | ||||||
|  |   TIFF_IMAGE_TYPE_INVALID   = 0, | ||||||
|  |   TIFF_IMAGE_TYPE_BILEVEL   = 1, | ||||||
|  |   TIFF_IMAGE_TYPE_GRAYSCALE = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE, | ||||||
|  |   TIFF_IMAGE_TYPE_PALETTE   = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE | TIFF_PUBLIC_TAG_COLOR_MAP, | ||||||
|  |   TIFF_IMAGE_TYPE_RGB       = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE | TIFF_PUBLIC_TAG_SAMPLES_PER_PIXEL, | ||||||
|  | } TiffImageType; | ||||||
|  |  | ||||||
|  | enum tiff_extra_samples { | ||||||
|  |   TIFF_EXTRA_SAMPLE_UNSPECIFIED        = 0x0000, | ||||||
|  |   TIFF_EXTRA_SAMPLE_ASSOCIATED_ALPHA   = 0x0001, | ||||||
|  |   TIFF_EXTRA_SAMPLE_UNASSOCIATED_ALPHA = 0x0002, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum tiff_compression { | ||||||
|  |   TIFF_COMPRESSION_UNCOMPRESSED = 0x0001, | ||||||
|  |   TIFF_COMPRESSION_CCITT_1D     = 0x0002, | ||||||
|  |   TIFF_COMPRESSION_GROUP_3_FAX  = 0x0003, | ||||||
|  |   TIFF_COMPRESSION_GROUP_4_FAX  = 0x0004, | ||||||
|  |   TIFF_COMPRESSION_LZW          = 0x0005, | ||||||
|  |   TIFF_COMPRESSION_JPEG         = 0x0006, | ||||||
|  |   TIFF_COMPRESSION_PACK_BITS    = 0x8005, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum tiff_photometric_interpretation { | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO     = 0x0000, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO     = 0x0001, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_RGB               = 0x0002, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_RGB_PALETTE       = 0x0003, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_TRANSPARENCY_MASK = 0x0004, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_CMYK              = 0x0005, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_YCbCr             = 0x0006, | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_CIELab            = 0x0008, | ||||||
|  |  | ||||||
|  |   TIFF_PHOTOMETRIC_INTERPRETATION_INVALID, | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum tiff_planar_configuration { | ||||||
|  |   TIFF_PLANAR_CONFIG_CHUNKY = 0x0001, | ||||||
|  |   TIFF_PLANAR_CONFIG_PLANAR = 0x0002, | ||||||
|  | }; | ||||||
|  | // clang-format on | ||||||
|  |  | ||||||
|  | typedef struct short_long_value ShortLongValue; | ||||||
|  | struct short_long_value { | ||||||
|  |   union { | ||||||
|  |     u16 short_val; | ||||||
|  |     u32 long_val; | ||||||
|  |   }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct hdr TiffHdr; | ||||||
|  | struct hdr { | ||||||
|  |   u16 order; | ||||||
|  |   u16 magic; | ||||||
|  |   u32 first_ifd_offset; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct field TiffField; | ||||||
|  | struct field { | ||||||
|  |   u16 tag; | ||||||
|  |   u16 type; | ||||||
|  |   u32 count; | ||||||
|  |   u32 value_offset; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct IFD TiffIFD; | ||||||
|  | struct IFD { | ||||||
|  |   u16 count; | ||||||
|  |   TiffField *fields; | ||||||
|  |   u32 next_ifd; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef enum { | ||||||
|  |   ALPHA_TYPE_UNDEFINED = 0, | ||||||
|  |   ALPHA_TYPE_ASSOCIATED, | ||||||
|  |   ALPHA_TYPE_UNASSOCIATED, | ||||||
|  | } AlphaType; | ||||||
|  |  | ||||||
|  | typedef struct tiff_alpha TiffAlpha; | ||||||
|  | struct tiff_alpha { | ||||||
|  |   AlphaType type; | ||||||
|  |   u32 sample_offset; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct tiff_sample_bits TiffSampleBits; | ||||||
|  | struct tiff_sample_bits { | ||||||
|  |   u16 r; | ||||||
|  |   u16 g; | ||||||
|  |   u16 b; | ||||||
|  |   u16 a; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct tiff_strip TiffStrip; | ||||||
|  | struct tiff_strip { | ||||||
|  |   u32 offset; | ||||||
|  |   u32 byte_count; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef struct tiff_image TiffImage; | ||||||
|  | struct tiff_image { | ||||||
|  |   TiffImageType type; | ||||||
|  |   u32 image_width; | ||||||
|  |   u32 image_length; | ||||||
|  |   u32 bits_per_sample; | ||||||
|  |   u32 sample_count; | ||||||
|  |   bool bits_per_sample_offset; | ||||||
|  |   u16 compression; | ||||||
|  |   u16 photometric_interpretation; | ||||||
|  |   u16 strip_offsets_type_byte_count; | ||||||
|  |   ShortLongValue strip_offsets; | ||||||
|  |   bool strip_offsets_offset; | ||||||
|  |   u32 rows_per_strip; | ||||||
|  |   u16 strip_byte_count_type_byte_count; | ||||||
|  |   ShortLongValue strip_byte_counts; | ||||||
|  |   bool strip_byte_counts_offset; | ||||||
|  |   u32 strip_count; | ||||||
|  |   u32 color_map; | ||||||
|  |   u32 extra_samples; | ||||||
|  |   u32 extra_samples_count; | ||||||
|  |   bool extra_samples_offset; | ||||||
|  |   TiffAlpha alpha; | ||||||
|  |   TiffSampleBits rgba_bits_per_sample; | ||||||
|  |   TiffStrip *strips; | ||||||
|  | }; | ||||||
|  |  | ||||||
| typedef struct tiff_reader TiffReader; | typedef struct tiff_reader TiffReader; | ||||||
| struct tiff_reader { | struct tiff_reader { | ||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   | |||||||
| @@ -6,163 +6,7 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif // __cplusplus | #endif // __cplusplus | ||||||
|  |  | ||||||
| #include "aliases.h" |  | ||||||
| #include "image.h" | #include "image.h" | ||||||
| #include <stdbool.h> |  | ||||||
|  |  | ||||||
| #define TYPE_MAX_COUNT (UINT8_MAX * sizeof(const char *)) |  | ||||||
|  |  | ||||||
| // clang-format off |  | ||||||
| enum tiff_byte_order { |  | ||||||
|   TIFF_ORDER_LITTLE_ENDIAN = 0x4949, |  | ||||||
|   TIFF_ORDER_BIG_ENDIAN    = 0x4d4d, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum tiff_public_tags { |  | ||||||
|   #include "tiff_public_tags.inc" |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum tiff_field_types { |  | ||||||
|   #include "tiff_field_types.inc" |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct field_type TiffFieldType; |  | ||||||
| struct field_type { |  | ||||||
|   const char *name; |  | ||||||
|   u16 byte_count; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| internal TiffFieldType field_types[TYPE_MAX_COUNT] = { |  | ||||||
|   #define TIFF_TYPE_LOOKUP |  | ||||||
|   #include "tiff_field_types.inc" |  | ||||||
|   #undef TIFF_TYPE_LOOKUP |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef enum tiff_image_type_names { |  | ||||||
|   TIFF_IMAGE_TYPE_INVALID   = 0, |  | ||||||
|   TIFF_IMAGE_TYPE_BILEVEL   = 1, |  | ||||||
|   TIFF_IMAGE_TYPE_GRAYSCALE = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE, |  | ||||||
|   TIFF_IMAGE_TYPE_PALETTE   = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE | TIFF_PUBLIC_TAG_COLOR_MAP, |  | ||||||
|   TIFF_IMAGE_TYPE_RGB       = TIFF_PUBLIC_TAG_BITS_PER_SAMPLE | TIFF_PUBLIC_TAG_SAMPLES_PER_PIXEL, |  | ||||||
| } TiffImageType; |  | ||||||
|  |  | ||||||
| enum tiff_extra_samples { |  | ||||||
|   TIFF_EXTRA_SAMPLE_UNSPECIFIED        = 0x0000, |  | ||||||
|   TIFF_EXTRA_SAMPLE_ASSOCIATED_ALPHA   = 0x0001, |  | ||||||
|   TIFF_EXTRA_SAMPLE_UNASSOCIATED_ALPHA = 0x0002, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum tiff_compression { |  | ||||||
|   TIFF_COMPRESSION_UNCOMPRESSED = 0x0001, |  | ||||||
|   TIFF_COMPRESSION_CCITT_1D     = 0x0002, |  | ||||||
|   TIFF_COMPRESSION_GROUP_3_FAX  = 0x0003, |  | ||||||
|   TIFF_COMPRESSION_GROUP_4_FAX  = 0x0004, |  | ||||||
|   TIFF_COMPRESSION_LZW          = 0x0005, |  | ||||||
|   TIFF_COMPRESSION_JPEG         = 0x0006, |  | ||||||
|   TIFF_COMPRESSION_PACK_BITS    = 0x8005, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum tiff_photometric_interpretation { |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO     = 0x0000, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO     = 0x0001, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_RGB               = 0x0002, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_RGB_PALETTE       = 0x0003, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_TRANSPARENCY_MASK = 0x0004, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_CMYK              = 0x0005, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_YCbCr             = 0x0006, |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_CIELab            = 0x0008, |  | ||||||
|  |  | ||||||
|   TIFF_PHOTOMETRIC_INTERPRETATION_INVALID, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum tiff_planar_configuration { |  | ||||||
|   TIFF_PLANAR_CONFIG_CHUNKY = 0x0001, |  | ||||||
|   TIFF_PLANAR_CONFIG_PLANAR = 0x0002, |  | ||||||
| }; |  | ||||||
| // clang-format on |  | ||||||
|  |  | ||||||
| typedef struct short_long_value ShortLongValue; |  | ||||||
| struct short_long_value { |  | ||||||
|   union { |  | ||||||
|     u16 short_val; |  | ||||||
|     u32 long_val; |  | ||||||
|   }; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct hdr TiffHdr; |  | ||||||
| struct hdr { |  | ||||||
|   u16 order; |  | ||||||
|   u16 magic; |  | ||||||
|   u32 first_ifd_offset; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct field TiffField; |  | ||||||
| struct field { |  | ||||||
|   u16 tag; |  | ||||||
|   u16 type; |  | ||||||
|   u32 count; |  | ||||||
|   u32 value_offset; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct IFD TiffIFD; |  | ||||||
| struct IFD { |  | ||||||
|   u16 count; |  | ||||||
|   TiffField *fields; |  | ||||||
|   u32 next_ifd; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef enum { |  | ||||||
|   ALPHA_TYPE_UNDEFINED = 0, |  | ||||||
|   ALPHA_TYPE_ASSOCIATED, |  | ||||||
|   ALPHA_TYPE_UNASSOCIATED, |  | ||||||
| } AlphaType; |  | ||||||
|  |  | ||||||
| typedef struct tiff_alpha TiffAlpha; |  | ||||||
| struct tiff_alpha { |  | ||||||
|   AlphaType type; |  | ||||||
|   u32 sample_offset; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct tiff_sample_bits TiffSampleBits; |  | ||||||
| struct tiff_sample_bits { |  | ||||||
|   u16 r; |  | ||||||
|   u16 g; |  | ||||||
|   u16 b; |  | ||||||
|   u16 a; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct tiff_strip TiffStrip; |  | ||||||
| struct tiff_strip { |  | ||||||
|   u32 offset; |  | ||||||
|   u32 byte_count; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| typedef struct tiff_image TiffImage; |  | ||||||
| struct tiff_image { |  | ||||||
|   TiffImageType type; |  | ||||||
|   u32 image_width; |  | ||||||
|   u32 image_length; |  | ||||||
|   u32 bits_per_sample; |  | ||||||
|   u32 sample_count; |  | ||||||
|   bool bits_per_sample_offset; |  | ||||||
|   u16 compression; |  | ||||||
|   u16 photometric_interpretation; |  | ||||||
|   u16 strip_offsets_type_byte_count; |  | ||||||
|   ShortLongValue strip_offsets; |  | ||||||
|   bool strip_offsets_offset; |  | ||||||
|   u32 rows_per_strip; |  | ||||||
|   u16 strip_byte_count_type_byte_count; |  | ||||||
|   ShortLongValue strip_byte_counts; |  | ||||||
|   bool strip_byte_counts_offset; |  | ||||||
|   u32 strip_count; |  | ||||||
|   u32 color_map; |  | ||||||
|   u32 extra_samples; |  | ||||||
|   u32 extra_samples_count; |  | ||||||
|   bool extra_samples_offset; |  | ||||||
|   TiffAlpha alpha; |  | ||||||
|   TiffSampleBits rgba_bits_per_sample; |  | ||||||
|   TiffStrip *strips; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| Image *read_baseline_tiff(const char *file, Arena *arena); | Image *read_baseline_tiff(const char *file, Arena *arena); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user