mirror of
https://gitlab.gnome.org/GNOME/eog
synced 2024-10-19 14:34:42 +00:00
be62e96c16
2001-01-17 Michael Meeks <michael@helixcode.com> * configure.in (have_bonobo): depend on Bonobo 0.32 2001-01-12 Michael Meeks <michael@helixcode.com> * image-view.c (image_view_init, compute_scaled_size) upd. (paint_rectangle): add DOUBLE_COMPARE macro. (unity_zoom): impl. (compute_center_zoom_offsets): upd. (image_view_set_zoom): upd. (image_view_get_zoom): hack. old_zoom ... 2001-01-17 Michael Meeks <michael@helixcode.com> * eog-embeddable-view.c (eog_embeddable_view_construct): don't allow scroll bars ever. (configure_size): upd. * eog-image-view.c (eog_image_view_set_zoom): impl. 2001-01-16 Michael Meeks <michael@helixcode.com> * eog-embeddable-view.c (eog_embeddable_view_construct): connect to view_size_allocation. (configure_size): impl. (view_size_allocate_cb): hook up. * eog-image-view.c (eog_image_view_set_prop), (eog_image_view_get_prop): update to new property bag API.
121 lines
2.9 KiB
C
121 lines
2.9 KiB
C
/*
|
|
* io-png.c by David Welton <davidw@linuxcare.com>. Most of the code
|
|
* borrowed from Imlib, Bonobo Stream API by Michael Meeks <mmeeks@gnu.org>
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <bonobo.h>
|
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
|
#include <png.h>
|
|
#include "io-png.h"
|
|
|
|
typedef struct {
|
|
Bonobo_Stream stream;
|
|
CORBA_Environment *ev;
|
|
} BStreamData;
|
|
|
|
static void
|
|
png_write_data_fn (png_structp png_ptr, png_bytep data, png_size_t len)
|
|
{
|
|
BStreamData *sd = png_get_io_ptr (png_ptr);
|
|
|
|
if (sd->ev->_major != CORBA_NO_EXCEPTION)
|
|
return;
|
|
|
|
bonobo_stream_client_write (sd->stream, data, len, sd->ev);
|
|
}
|
|
|
|
static void
|
|
png_flush_fn (png_structp png_ptr)
|
|
{
|
|
g_warning ("Flush nothing");
|
|
}
|
|
|
|
void
|
|
image_save (Bonobo_Stream stream,
|
|
GdkPixbuf *pixbuf,
|
|
CORBA_Environment *ev)
|
|
{
|
|
png_structp png_ptr;
|
|
png_infop info_ptr;
|
|
guint8 *ptr;
|
|
int x, y, j;
|
|
png_bytep row_ptr, data = NULL;
|
|
png_color_8 sig_bit;
|
|
int w, h, rowstride;
|
|
int has_alpha;
|
|
int bpc;
|
|
BStreamData sdata;
|
|
|
|
bpc = gdk_pixbuf_get_bits_per_sample (pixbuf);
|
|
w = gdk_pixbuf_get_width (pixbuf);
|
|
h = gdk_pixbuf_get_height (pixbuf);
|
|
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
|
has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
|
|
|
|
png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING,
|
|
NULL, NULL, NULL);
|
|
if (!png_ptr)
|
|
goto png_err;
|
|
|
|
sdata.stream = stream;
|
|
sdata.ev = ev;
|
|
png_set_write_fn (png_ptr, &sdata, png_write_data_fn, png_flush_fn);
|
|
|
|
info_ptr = png_create_info_struct (png_ptr);
|
|
if (!info_ptr ||
|
|
setjmp (png_ptr->jmpbuf)) {
|
|
png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
|
|
goto png_err;
|
|
}
|
|
|
|
if (has_alpha) {
|
|
png_set_IHDR (png_ptr, info_ptr, w, h, bpc,
|
|
PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
|
|
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
|
#ifdef WORDS_BIGENDIAN
|
|
png_set_swap_alpha (png_ptr);
|
|
#else
|
|
png_set_bgr (png_ptr);
|
|
#endif
|
|
} else {
|
|
png_set_IHDR (png_ptr, info_ptr, w, h, bpc,
|
|
PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
|
|
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
|
data = g_malloc (w * 3 * sizeof(char));
|
|
}
|
|
sig_bit.red = bpc;
|
|
sig_bit.green = bpc;
|
|
sig_bit.blue = bpc;
|
|
sig_bit.alpha = bpc;
|
|
png_set_sBIT (png_ptr, info_ptr, &sig_bit);
|
|
png_write_info (png_ptr, info_ptr);
|
|
png_set_shift (png_ptr, &sig_bit);
|
|
png_set_packing (png_ptr);
|
|
|
|
ptr = gdk_pixbuf_get_pixels (pixbuf);
|
|
for (y = 0; y < h; y++) {
|
|
if (has_alpha)
|
|
row_ptr = (png_bytep)ptr;
|
|
else {
|
|
for (j = 0, x = 0; x < w; x++)
|
|
memcpy (&(data [x * 3]), &(ptr [x * 3]), 3);
|
|
|
|
row_ptr = (png_bytep)data;
|
|
}
|
|
png_write_rows (png_ptr, &row_ptr, 1);
|
|
ptr += rowstride;
|
|
}
|
|
g_free (data);
|
|
png_write_end (png_ptr, info_ptr);
|
|
png_destroy_write_struct (&png_ptr, (png_infopp) NULL);
|
|
return;
|
|
|
|
png_err:
|
|
g_free (data);
|
|
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
|
|
ex_Bonobo_Stream_IOError, NULL);
|
|
return;
|
|
}
|