Compare commits

..

No commits in common. "d195086af874cfc91690b6393e37c37529c02e82" and "484d30d84ce883095a217230271d87671195f86c" have entirely different histories.

View File

@ -53,18 +53,16 @@ struct strip_data_field {
u16 type_byte_count;
};
internal TiffHdr read_tiff_header(const TiffReader *reader);
internal TiffIFD read_ifd(const TiffReader *reader, Arena *arena);
internal TiffImage read_fields(const TiffReader *reader);
internal Pixel *load_image_pixels(TiffReader *reader, Arena *arena);
internal bool read_strip_data(TiffReader *reader, Arena *arena);
internal void read_strips(const TiffReader *reader, Pixel *buf);
internal void read_strip_data_field(const TiffReader *reader,
StripDataField *field);
internal bool read_field(const TiffField *field, TiffImage *img);
internal bool validate_image_type(const TiffImage *img);
internal void read_from_file_with_offset(FILE *fp, void *dst, u64 count,
u64 offset);
TiffHdr read_tiff_header(const TiffReader *reader);
TiffIFD read_ifd(const TiffReader *reader, Arena *arena);
TiffImage read_fields(const TiffReader *reader);
Pixel *load_image_pixels(TiffReader *reader, Arena *arena);
bool read_strip_data(TiffReader *reader, Arena *arena);
void read_strips(const TiffReader *reader, Pixel *buf);
bool read_field(const TiffField *field, TiffImage *img);
bool validate_image_type(const TiffImage *img);
void read_strip_data_field(const TiffReader *reader, StripDataField *field);
void read_from_file_with_offset(FILE *fp, void *dst, u64 count, u64 offset);
Image *read_baseline_tiff(const char *file, Arena *arena) {
Image *img_out = NULL;
@ -139,7 +137,7 @@ READ_BASELINE_RETURN_IMG:
return img_out;
}
internal TiffHdr read_tiff_header(const TiffReader *reader) {
TiffHdr read_tiff_header(const TiffReader *reader) {
TiffHdr header = NULL_TIFF_HEADER;
read_from_file_with_offset(reader->fp, &header, sizeof(TiffHdr), 0);
@ -169,7 +167,7 @@ internal TiffHdr read_tiff_header(const TiffReader *reader) {
return header;
}
internal TiffIFD read_ifd(const TiffReader *reader, Arena *arena) {
TiffIFD read_ifd(const TiffReader *reader, Arena *arena) {
TiffIFD ifd = NULL_TIFF_IFD;
read_from_file_with_offset(reader->fp, &(ifd.count), sizeof(ifd.count),
reader->header.first_ifd_offset);
@ -201,7 +199,7 @@ internal TiffIFD read_ifd(const TiffReader *reader, Arena *arena) {
return ifd;
}
internal TiffImage read_fields(const TiffReader *reader) {
TiffImage read_fields(const TiffReader *reader) {
TiffImage img_out = NULL_TIFF_IMAGE;
img_out.type = TIFF_IMAGE_TYPE_BILEVEL;
@ -267,7 +265,7 @@ READ_FIELDS_RETURN_IMAGE:
return img_out;
}
internal Pixel *load_image_pixels(TiffReader *reader, Arena *arena) {
Pixel *load_image_pixels(TiffReader *reader, Arena *arena) {
Pixel *buf = NULL;
u64 img_byte_count =
sizeof(Pixel) * reader->img.image_width * reader->img.image_length;
@ -294,7 +292,7 @@ LOAD_IMAGE_PIXELS_RETURN:
return buf;
}
internal bool read_strip_data(TiffReader *reader, Arena *arena) {
bool read_strip_data(TiffReader *reader, Arena *arena) {
reader->img.strips =
wapp_mem_arena_alloc(arena, sizeof(TiffStrip) * reader->img.strip_count);
if (!(reader->img.strips)) {
@ -340,7 +338,7 @@ internal bool read_strip_data(TiffReader *reader, Arena *arena) {
return true;
}
internal void read_strips(const TiffReader *reader, Pixel *buf) {
void read_strips(const TiffReader *reader, Pixel *buf) {
u64 position = 0;
for (u64 i = 0; i < reader->img.strip_count; ++i) {
const TiffStrip *strip = &(reader->img.strips[i]);
@ -360,44 +358,7 @@ internal void read_strips(const TiffReader *reader, Pixel *buf) {
}
}
internal void read_strip_data_field(const TiffReader *reader,
StripDataField *field) {
u16 tiff_long_byte_count = field_types[TIFF_FIELD_TYPE_LONG].byte_count;
bool value_is_file_offset = field->length_in_bytes > tiff_long_byte_count;
u32 offset = field->type_byte_count * field->strip_index;
if (!value_is_file_offset) {
u8 *value = (u8 *)&(field->value_from_file->long_val);
memcpy(field->strip_value, value + offset, field->type_byte_count);
return;
}
read_from_file_with_offset(reader->fp, field->strip_value,
field->type_byte_count,
field->value_from_file->long_val + offset);
u16 tiff_short_byte_count = field_types[TIFF_FIELD_TYPE_SHORT].byte_count;
switch (reader->header.order) {
case TIFF_ORDER_BIG_ENDIAN:
if (IS_LITTLE_ENDIAN) {
*(field->strip_value) = field->type_byte_count > tiff_short_byte_count
? ntohl(*(field->strip_value))
: ntohs(*(field->strip_value));
}
break;
case TIFF_ORDER_LITTLE_ENDIAN:
if (IS_BIG_ENDIAN) {
*(field->strip_value) = field->type_byte_count > tiff_short_byte_count
? htonl(*(field->strip_value))
: htons(*(field->strip_value));
}
break;
}
}
internal bool read_field(const TiffField *field, TiffImage *img) {
bool read_field(const TiffField *field, TiffImage *img) {
switch (field->tag) {
case TIFF_PUBLIC_TAG_IMAGE_WIDTH:
if (field->count > 1) {
@ -534,7 +495,7 @@ internal bool read_field(const TiffField *field, TiffImage *img) {
return true;
}
internal bool validate_image_type(const TiffImage *img) {
bool validate_image_type(const TiffImage *img) {
if (img->type < TIFF_IMAGE_TYPE_BILEVEL || img->type > TIFF_IMAGE_TYPE_RGB) {
return false;
}
@ -569,8 +530,43 @@ internal bool validate_image_type(const TiffImage *img) {
return true;
}
internal void read_from_file_with_offset(FILE *fp, void *dst, u64 count,
u64 offset) {
void read_strip_data_field(const TiffReader *reader, StripDataField *field) {
u16 tiff_long_byte_count = field_types[TIFF_FIELD_TYPE_LONG].byte_count;
bool value_is_file_offset = field->length_in_bytes > tiff_long_byte_count;
u32 offset = field->type_byte_count * field->strip_index;
if (!value_is_file_offset) {
u8 *value = (u8 *)&(field->value_from_file->long_val);
memcpy(field->strip_value, value + offset, field->type_byte_count);
return;
}
read_from_file_with_offset(reader->fp, field->strip_value,
field->type_byte_count,
field->value_from_file->long_val + offset);
u16 tiff_short_byte_count = field_types[TIFF_FIELD_TYPE_SHORT].byte_count;
switch (reader->header.order) {
case TIFF_ORDER_BIG_ENDIAN:
if (IS_LITTLE_ENDIAN) {
*(field->strip_value) = field->type_byte_count > tiff_short_byte_count
? ntohl(*(field->strip_value))
: ntohs(*(field->strip_value));
}
break;
case TIFF_ORDER_LITTLE_ENDIAN:
if (IS_BIG_ENDIAN) {
*(field->strip_value) = field->type_byte_count > tiff_short_byte_count
? htonl(*(field->strip_value))
: htons(*(field->strip_value));
}
break;
}
}
void read_from_file_with_offset(FILE *fp, void *dst, u64 count, u64 offset) {
if (!fp || !dst) {
return;
}