88static void PNGwriteRawProfile(png_struct *ping, png_info *ping_info,
char *profile_type, guint8 *profile_data,
95 png_uint_32 allocated_length, description_length;
97 const guint8 hex[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f' };
98 text = png_malloc(ping,
sizeof(png_text));
99 description_length = strlen(profile_type);
100 allocated_length = length * 2 + (length >> 5) + 20 + description_length;
102 text[0].text = png_malloc(ping, allocated_length);
103 text[0].key = png_malloc(ping, 80);
104 text[0].key[0] =
'\0';
106 g_strlcat(text[0].
key,
"Raw profile type ", 80);
107 g_strlcat(text[0].
key, profile_type, 80);
113 g_strlcpy(dp, profile_type, allocated_length);
115 dp += description_length;
119 g_snprintf(dp, allocated_length - strlen(text[0].text),
"%8lu ", (
unsigned long int)length);
123 for(
i = 0;
i < (long)length;
i++)
125 if(
i % 36 == 0) *dp++ =
'\n';
127 *(dp++) = hex[((*sp >> 4) & 0x0f)];
128 *(dp++) = hex[((*sp++) & 0x0f)];
133 text[0].text_length = (dp - text[0].text);
134 text[0].compression = -1;
136 if(text[0].text_length <= allocated_length) png_set_text(ping, ping_info, text, 1);
138 png_free(ping, text[0].text);
139 png_free(ping, text[0].
key);
140 png_free(ping, text);
145 void *exif,
int exif_len, int32_t imgid,
int num,
int total,
struct dt_dev_pixelpipe_t *pipe,
146 const gboolean export_masks)
150 FILE *
f = g_fopen(filename,
"wb");
156 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
163 info_ptr = png_create_info_struct(png_ptr);
167 png_destroy_write_struct(&png_ptr, NULL);
171 if(setjmp(png_jmpbuf(png_ptr)))
174 png_destroy_write_struct(&png_ptr, &info_ptr);
178 png_init_io(png_ptr,
f);
180 png_set_compression_level(png_ptr,
p->compression);
181 png_set_compression_mem_level(png_ptr, 8);
182 png_set_compression_strategy(png_ptr, Z_DEFAULT_STRATEGY);
183 png_set_compression_window_bits(png_ptr, 15);
184 png_set_compression_method(png_ptr, 8);
185 png_set_compression_buffer_size(png_ptr, 8192);
187 png_set_IHDR(png_ptr, info_ptr,
width,
height,
p->bpp, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
188 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
195 cmsSaveProfileToMem(out_profile, NULL, &len);
198 char *buf = malloc(
sizeof(
char) * len);
201 cmsSaveProfileToMem(out_profile, buf, &len);
202 char name[512] = { 0 };
205 png_set_iCCP(png_ptr, info_ptr, *
name ?
name :
"icc", 0,
206#if(PNG_LIBPNG_VER < 10500)
209 (png_const_bytep)buf,
217 if(exif && exif_len > 0)
220 uint8_t *buf = malloc(exif_len + 6);
223 memcpy(buf,
"Exif\0\0", 6);
224 memcpy(buf + 6, exif, exif_len);
230 png_write_info(png_ptr, info_ptr);
236 png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
243 png_set_swap(png_ptr);
245 for(
unsigned i = 0;
i <
height;
i++) row_pointers[
i] = (png_bytep)((uint16_t *)ivoid + (
size_t)4 *
i *
width);
249 for(
unsigned i = 0;
i <
height;
i++) row_pointers[
i] = (uint8_t *)ivoid + (size_t)4 *
i *
width;
252 png_write_image(png_ptr, row_pointers);
256 png_write_end(png_ptr, info_ptr);
257 png_destroy_write_struct(&png_ptr, &info_ptr);
265 png->
f = g_fopen(filename,
"rb");
269#define NUM_BYTES_CHECK (8)
281 png->
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
293 png_destroy_read_struct(&png->
png_ptr, NULL, NULL);
297 if(setjmp(png_jmpbuf(png->
png_ptr)))
318 if(color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png->
png_ptr);
321 if(color_type == PNG_COLOR_TYPE_GRAY &&
bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png->
png_ptr);
324 if(color_type & PNG_COLOR_MASK_ALPHA) png_set_strip_alpha(png->
png_ptr);
327 if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
328 png_set_gray_to_rgb(png->
png_ptr);
336#undef NUM_BYTES_CHECK
342 if (setjmp(png_jmpbuf(png->
png_ptr)))
345 png_destroy_read_struct(&png->
png_ptr, NULL, NULL);
351 png_set_strip_16(png->
png_ptr);
360 if(setjmp(png_jmpbuf(png->
png_ptr)))
367 png_bytep row_pointer = (png_bytep)
out;
368 unsigned long rowbytes = png_get_rowbytes(png->
png_ptr, png->
info_ptr);
372 png_read_row(png->
png_ptr, row_pointer, NULL);
373 row_pointer += rowbytes;
389 const int old_version,
const int new_version,
size_t *new_size)
391 if(old_version == 1 && new_version == 3)
393 typedef struct dt_imageio_png_v1_t
395 int max_width, max_height;
402 } dt_imageio_png_v1_t;
404 dt_imageio_png_v1_t *o = (dt_imageio_png_v1_t *)old_params;
408 n->global.max_height = o->max_height;
409 n->global.width = o->width;
410 n->global.height = o->height;
411 g_strlcpy(
n->global.style, o->style,
sizeof(o->style));
413 n->compression = Z_BEST_COMPRESSION;
415 n->png_ptr = o->png_ptr;
416 n->info_ptr = o->info_ptr;
417 *new_size = self->params_size(self);
420 else if(old_version == 2 && new_version == 3)
422 typedef struct dt_imageio_png_v2_t
424 int max_width, max_height;
427 gboolean style_append;
432 } dt_imageio_png_v2_t;
434 dt_imageio_png_v2_t *o = (dt_imageio_png_v2_t *)old_params;
438 n->global.max_height = o->max_height;
439 n->global.width = o->width;
440 n->global.height = o->height;
441 g_strlcpy(
n->global.style, o->style,
sizeof(o->style));
443 n->compression = Z_BEST_COMPRESSION;
445 n->png_ptr = o->png_ptr;
446 n->info_ptr = o->info_ptr;
447 *new_size = self->params_size(self);
458 if(
d->bpp != 8 &&
d->bpp != 16)
467 if(
d->compression < 0 ||
d->compression > 9)
d->compression = 5;
480 if(
size != self->params_size(self))
return 1;
515 return _(
"PNG (8/16-bit)");
527 dt_conf_set_int(
"plugins/imageio/format/png/compression", compression);
543 int bpp = atoi(conf_bpp);
548 compression =
dt_conf_get_int(
"plugins/imageio/format/png/compression");
float dt_bauhaus_slider_get(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
GtkWidget * dt_bauhaus_slider_new_with_range(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
const dt_colorspaces_color_profile_t * dt_colorspaces_get_output_profile(const int32_t imgid, dt_colorspaces_color_profile_type_t *over_type, const char *over_filename)
void dt_colorspaces_get_profile_name(cmsHPROFILE p, const char *language, const char *country, char *name, size_t len)
dt_colorspaces_color_profile_type_t
const dt_aligned_pixel_t f
const dt_colormatrix_t dt_aligned_pixel_t out
int dt_conf_key_exists(const char *key)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
int dt_confgen_get_int(const char *name, dt_confgen_value_kind_t kind)
const char * dt_conf_get_string_const(const char *name)
#define dt_pixelpipe_cache_alloc_align_cache(size, id)
#define DT_MODULE(MODVER)
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Enable aggressive floating-point arithmetic optimizations, in denormals handling. Set through user pr...
#define dt_pixelpipe_cache_free_align(mem)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define DT_GUI_BOX_SPACING
@ FORMAT_FLAGS_SUPPORT_XMP
int read_header(const char *filename, dt_imageio_png_t *png)
dt_mipmap_buffer_dsc_flags flags
const char * mime(dt_imageio_module_data_t *data)
size_t params_size(dt_imageio_module_format_t *self)
static void bit_depth_changed(GtkWidget *widget, gpointer user_data)
void gui_reset(dt_imageio_module_format_t *self)
void gui_init(dt_imageio_module_format_t *self)
static void compression_level_changed(GtkWidget *slider, gpointer user_data)
const char * extension(dt_imageio_module_data_t *data)
int set_params(dt_imageio_module_format_t *self, const void *params, const int size)
void cleanup(dt_imageio_module_format_t *self)
int read_image(dt_imageio_module_data_t *p_tmp, uint8_t *out)
int levels(dt_imageio_module_data_t *p)
void * legacy_params(dt_imageio_module_format_t *self, const void *const old_params, const size_t old_params_size, const int old_version, const int new_version, size_t *new_size)
void free_params(dt_imageio_module_format_t *self, dt_imageio_module_data_t *params)
int write_image(dt_imageio_module_data_t *p_tmp, const char *filename, const void *ivoid, dt_colorspaces_color_profile_type_t over_type, const char *over_filename, void *exif, int exif_len, int32_t imgid, int num, int total, struct dt_dev_pixelpipe_t *pipe, const gboolean export_masks)
static void PNGwriteRawProfile(png_struct *ping, png_info *ping_info, char *profile_type, guint8 *profile_data, png_uint_32 length)
void init(dt_imageio_module_format_t *self)
void * get_params(dt_imageio_module_format_t *self)
void gui_cleanup(dt_imageio_module_format_t *self)
struct _GtkWidget GtkWidget
struct dt_bauhaus_t * bauhaus
dt_imageio_module_data_t global