Fix alpha multiplication for images with unassociated alpha
This commit is contained in:
		| @@ -221,6 +221,8 @@ internal bool read_field(const TiffField *field, TiffImage *img); | |||||||
| internal bool validate_image_type(const TiffImage *img); | internal bool validate_image_type(const TiffImage *img); | ||||||
| internal void fread_with_offset(FILE *fp, void *dst, u64 count, u64 offset); | internal void fread_with_offset(FILE *fp, void *dst, u64 count, u64 offset); | ||||||
| internal bool valid_tiff_file(const char *file); | internal bool valid_tiff_file(const char *file); | ||||||
|  | internal f32 u8_normalise(u8 value); | ||||||
|  | internal u8 u8_denormalise(f32 value); | ||||||
|  |  | ||||||
| Image *read_baseline_tiff(const char *file, Arena *arena) { | Image *read_baseline_tiff(const char *file, Arena *arena) { | ||||||
|   Image *img_out = NULL; |   Image *img_out = NULL; | ||||||
| @@ -608,9 +610,11 @@ internal void read_strips(TiffReader *reader) { | |||||||
|         fread_with_offset(reader->fp, &(p->a), 1, alpha_offset); |         fread_with_offset(reader->fp, &(p->a), 1, alpha_offset); | ||||||
|  |  | ||||||
|         if (alpha.type == ALPHA_TYPE_UNASSOCIATED) { |         if (alpha.type == ALPHA_TYPE_UNASSOCIATED) { | ||||||
|           p->r *= p->a; |           f32 a_norm = u8_normalise(p->a); | ||||||
|           p->g *= p->a; |  | ||||||
|           p->b *= p->a; |           p->r = u8_denormalise(u8_normalise(p->r) * a_norm); | ||||||
|  |           p->g = u8_denormalise(u8_normalise(p->g) * a_norm); | ||||||
|  |           p->b = u8_denormalise(u8_normalise(p->b) * a_norm); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -857,3 +861,7 @@ internal bool valid_tiff_file(const char *file) { | |||||||
|  |  | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | internal f32 u8_normalise(u8 value) { return (f32)value / (f32)UINT8_MAX; } | ||||||
|  |  | ||||||
|  | internal u8 u8_denormalise(f32 value) { return (u8)(value * UINT8_MAX); } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user