file-dds: support for DXT2/DXT4, initial build and GEGL-related fixes

This commit is contained in:
Massimo Valentini 2018-11-13 02:44:11 +03:00 committed by Jehan
parent 79bc2dc1ef
commit d25348ca24
4 changed files with 32 additions and 12 deletions

View File

@ -21,6 +21,7 @@
*/
#include <math.h>
#include "color.h"
int linear_to_sRGB(int c)
{

View File

@ -440,6 +440,7 @@ GimpPDBStatusType read_dds(gchar *filename, gint32 *imageID)
}
gimp_image_set_active_layer(image, layers[0]);
g_free (layers);
*imageID = image;
@ -541,7 +542,9 @@ static int validate_header(dds_header_t *hdr)
if((hdr->pixelfmt.flags & DDPF_FOURCC) &&
fourcc != FOURCC('D','X','T','1') &&
fourcc != FOURCC('D','X','T','2') &&
fourcc != FOURCC('D','X','T','3') &&
fourcc != FOURCC('D','X','T','4') &&
fourcc != FOURCC('D','X','T','5') &&
fourcc != FOURCC('R','X','G','B') &&
fourcc != FOURCC('A','T','I','1') &&
@ -597,7 +600,9 @@ static int validate_header(dds_header_t *hdr)
switch(fourcc)
{
case FOURCC('D','X','T','1'):
case FOURCC('D','X','T','2'):
case FOURCC('D','X','T','3'):
case FOURCC('D','X','T','4'):
case FOURCC('D','X','T','5'):
case FOURCC('R','X','G','B'):
case FOURCC('A','T','I','1'):
@ -796,6 +801,17 @@ static int setup_dxgi_format(dds_header_t *hdr, dds_header_dx10_t *dx10hdr)
return(1);
}
static const Babl*
premultiplied_variant (const Babl* format)
{
if (format == babl_format ("R'G'B'A u8"))
return babl_format ("R'aG'aB'aA u8");
else
g_printerr ("Add format %s to premultiplied_variant() %s: %d\n", babl_get_name (format), __FILE__, __LINE__);
return format;
}
static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
gint32 image, unsigned int level, char *prefix,
unsigned int *l, guchar *pixels, unsigned char *buf)
@ -888,7 +904,9 @@ static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
switch(GETL32(hdr->pixelfmt.fourcc))
{
case FOURCC('D','X','T','1'): format = DDS_COMPRESS_BC1; break;
case FOURCC('D','X','T','2'): bablfmt = premultiplied_variant (bablfmt);
case FOURCC('D','X','T','3'): format = DDS_COMPRESS_BC2; break;
case FOURCC('D','X','T','4'): bablfmt = premultiplied_variant (bablfmt);
case FOURCC('D','X','T','5'): format = DDS_COMPRESS_BC3; break;
case FOURCC('R','X','G','B'): format = DDS_COMPRESS_BC3; break;
case FOURCC('A','T','I','1'):
@ -920,7 +938,7 @@ static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
{
if(n >= d->tile_height)
{
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 1.0,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 0,
bablfmt, pixels, GEGL_AUTO_ROWSTRIDE);
n = 0;
gimp_progress_update((double)y / (double)hdr->height);
@ -1036,7 +1054,7 @@ static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
}
}
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 1.0,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 0,
bablfmt, pixels, GEGL_AUTO_ROWSTRIDE);
}
else if(hdr->pixelfmt.flags & DDPF_FOURCC)
@ -1067,7 +1085,7 @@ static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
{
if(n >= d->tile_height)
{
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 1.0,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 0,
bablfmt, pixels, GEGL_AUTO_ROWSTRIDE);
n = 0;
gimp_progress_update((double)y / (double)hdr->height);
@ -1078,7 +1096,7 @@ static int load_layer(FILE *fp, dds_header_t *hdr, dds_load_info_t *d,
width * d->gimp_bpp);
}
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 1.0,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, y - n, layerw, n), 0,
bablfmt, pixels, GEGL_AUTO_ROWSTRIDE);
g_free(dst);

View File

@ -765,7 +765,7 @@ static struct
* if (texel_alpha < alpha_test_threshold)
* discard;
*/
float calc_alpha_test_coverage(unsigned char *src,
static float calc_alpha_test_coverage(unsigned char *src,
unsigned int width, unsigned int height, int bpp,
float alpha_test_threshold,
float alpha_scale)
@ -796,7 +796,7 @@ float calc_alpha_test_coverage(unsigned char *src,
return (float)coverage / (width * height);
}
void scale_alpha_to_coverage(unsigned char *img,
static void scale_alpha_to_coverage(unsigned char *img,
unsigned int width, unsigned int height, int bpp,
float desired_coverage,
float alpha_test_threshold)

View File

@ -21,6 +21,7 @@
*/
#include <libgimp/gimp.h>
#include "misc.h"
static inline float saturate(float a)
{
@ -44,7 +45,7 @@ void decode_ycocg_image(gint32 drawableID, gboolean shadow)
if(shadow)
{
sbuffer = gimp_drawable_get_shadow_buffer(drawableID);
gegl_buffer_copy(buffer, NULL, sbuffer, NULL);
gegl_buffer_copy(buffer, NULL, GEGL_ABYSS_NONE, sbuffer, NULL);
g_object_unref(buffer);
buffer = sbuffer;
}
@ -87,7 +88,7 @@ void decode_ycocg_image(gint32 drawableID, gboolean shadow)
gimp_progress_update((float)i / (float)num_pixels);
}
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 1.0, format, data,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 0, format, data,
GEGL_AUTO_ROWSTRIDE);
gimp_progress_update(1.0);
@ -119,7 +120,7 @@ void decode_ycocg_scaled_image(gint32 drawableID, gboolean shadow)
if(shadow)
{
sbuffer = gimp_drawable_get_shadow_buffer(drawableID);
gegl_buffer_copy(buffer, NULL, sbuffer, NULL);
gegl_buffer_copy(buffer, NULL, GEGL_ABYSS_NONE, sbuffer, NULL);
g_object_unref(buffer);
buffer = sbuffer;
}
@ -165,7 +166,7 @@ void decode_ycocg_scaled_image(gint32 drawableID, gboolean shadow)
gimp_progress_update((float)i / (float)num_pixels);
}
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 1.0, format, data,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 0, format, data,
GEGL_AUTO_ROWSTRIDE);
gimp_progress_update(1.0);
@ -195,7 +196,7 @@ void decode_alpha_exp_image(gint32 drawableID, gboolean shadow)
if(shadow)
{
sbuffer = gimp_drawable_get_shadow_buffer(drawableID);
gegl_buffer_copy(buffer, NULL, sbuffer, NULL);
gegl_buffer_copy(buffer, NULL, GEGL_ABYSS_NONE, sbuffer, NULL);
g_object_unref(buffer);
buffer = sbuffer;
}
@ -234,7 +235,7 @@ void decode_alpha_exp_image(gint32 drawableID, gboolean shadow)
gimp_progress_update((float)i / (float)num_pixels);
}
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 1.0, format, data,
gegl_buffer_set(buffer, GEGL_RECTANGLE(0, 0, w, h), 0, format, data,
GEGL_AUTO_ROWSTRIDE);
gimp_progress_update(1.0);