forked from AuroraMiddleware/gtk
allow to specify the PNG compression level by passing a "compression"
2005-05-24 Sven Neumann <sven@gimp.org> * io-png.c: allow to specify the PNG compression level by passing a "compression" parameter to the PNG save function (bug #305337). * gdk-pixbuf-io.c (gdk_pixbuf_save): document the new parameter.
This commit is contained in:
parent
e7a0b015f6
commit
3bc682d012
@ -1,3 +1,10 @@
|
||||
2005-05-24 Sven Neumann <sven@gimp.org>
|
||||
|
||||
* io-png.c: allow to specify the PNG compression level by passing
|
||||
a "compression" parameter to the PNG save function (bug #305337).
|
||||
|
||||
* gdk-pixbuf-io.c (gdk_pixbuf_save): document the new parameter.
|
||||
|
||||
2005-04-09 Matthias Clasen <mclasen@redhat.com>
|
||||
|
||||
* Makefile.am: Use $(NM), not nm directly. (#301299,
|
||||
|
@ -1556,11 +1556,15 @@ gdk_pixbuf_real_save_to_callback (GdkPixbuf *pixbuf,
|
||||
* "quality", "100", NULL);
|
||||
* </programlisting></informalexample>
|
||||
*
|
||||
* Currently only few parameters exist. JPEG images can be saved with a
|
||||
* "quality" parameter; its value should be in the range [0,100].
|
||||
* Currently only few parameters exist. JPEG images can be saved with a
|
||||
* "quality" parameter; its value should be in the range [0,100].
|
||||
*
|
||||
* Text chunks can be attached to PNG images by specifying parameters of
|
||||
* the form "tEXt::key", where key is an ASCII string of length 1-79.
|
||||
* The values are UTF-8 encoded strings.
|
||||
* The values are UTF-8 encoded strings. The PNG compression level can
|
||||
* be specified using the "compression" parameter; it's value is in an
|
||||
* integer in the range of [0,9].
|
||||
*
|
||||
* ICO images can be saved in depth 16, 24, or 32, by using the "depth"
|
||||
* parameter. When the ICO saver is given "x_hot" and "y_hot" parameters,
|
||||
* it produces a CUR instead of an ICO.
|
||||
|
@ -789,40 +789,69 @@ static gboolean real_save_png (GdkPixbuf *pixbuf,
|
||||
int has_alpha;
|
||||
int bpc;
|
||||
int num_keys;
|
||||
int compression = -1;
|
||||
gboolean success = TRUE;
|
||||
SaveToFunctionIoPtr to_callback_ioptr;
|
||||
|
||||
num_keys = 0;
|
||||
|
||||
if (keys && *keys) {
|
||||
gchar **kiter;
|
||||
gchar *key;
|
||||
int len;
|
||||
gchar **kiter = keys;
|
||||
gchar **viter = values;
|
||||
|
||||
for (kiter = keys; *kiter; kiter++) {
|
||||
if (strncmp (*kiter, "tEXt::", 6) != 0) {
|
||||
g_warning ("Bad option name '%s' passed to PNG saver", *kiter);
|
||||
return FALSE;
|
||||
}
|
||||
key = *kiter + 6;
|
||||
len = strlen (key);
|
||||
if (len <= 1 || len > 79) {
|
||||
g_set_error (error,
|
||||
GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_BAD_OPTION,
|
||||
_("Keys for PNG text chunks must have at least 1 and at most 79 characters."));
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
if ((guchar) key[i] > 127) {
|
||||
while (*kiter) {
|
||||
if (strncmp (*kiter, "tEXt::", 6) == 0) {
|
||||
gchar *key = *kiter + 6;
|
||||
int len = strlen (key);
|
||||
if (len <= 1 || len > 79) {
|
||||
g_set_error (error,
|
||||
GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_BAD_OPTION,
|
||||
_("Keys for PNG text chunks must be ASCII characters."));
|
||||
_("Keys for PNG text chunks must have at least 1 and at most 79 characters."));
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
if ((guchar) key[i] > 127) {
|
||||
g_set_error (error,
|
||||
GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_BAD_OPTION,
|
||||
_("Keys for PNG text chunks must be ASCII characters."));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
num_keys++;
|
||||
} else if (strcmp (*kiter, "compression") == 0) {
|
||||
char *endptr = NULL;
|
||||
compression = strtol (*viter, &endptr, 10);
|
||||
|
||||
if (endptr == *viter) {
|
||||
g_set_error (error,
|
||||
GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_BAD_OPTION,
|
||||
_("PNG compression level must be a value between 0 and 9; value '%s' could not be parsed."),
|
||||
*viter);
|
||||
return FALSE;
|
||||
}
|
||||
if (compression < 0 || compression > 9) {
|
||||
/* This is a user-visible error;
|
||||
* lets people skip the range-checking
|
||||
* in their app.
|
||||
*/
|
||||
g_set_error (error,
|
||||
GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_BAD_OPTION,
|
||||
_("PNG compression level must be a value between 0 and 9; value '%d' is not allowed."),
|
||||
compression);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
g_warning ("Bad option name '%s' passed to PNG saver",
|
||||
*kiter);
|
||||
return FALSE;
|
||||
}
|
||||
num_keys++;
|
||||
|
||||
++kiter;
|
||||
++viter;
|
||||
}
|
||||
}
|
||||
|
||||
@ -900,6 +929,9 @@ static gboolean real_save_png (GdkPixbuf *pixbuf,
|
||||
png_init_io (png_ptr, f);
|
||||
}
|
||||
|
||||
if (compression >= 0)
|
||||
png_set_compression_level (png_ptr, compression);
|
||||
|
||||
if (has_alpha) {
|
||||
png_set_IHDR (png_ptr, info_ptr, w, h, bpc,
|
||||
PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
|
||||
|
Loading…
Reference in New Issue
Block a user