Blame gnome/gdkpixbuf.c

rpm-build d2b433
/*
rpm-build d2b433
 * libopenraw - gdkpixbuf.c
rpm-build d2b433
 *
rpm-build d2b433
 * Copyright (C) 2006-2007 Hubert Figuiere
rpm-build d2b433
 *
rpm-build d2b433
 * This library is free software: you can redistribute it and/or
rpm-build d2b433
 * modify it under the terms of the GNU Lesser General Public License
rpm-build d2b433
 * as published by the Free Software Foundation, either version 3 of
rpm-build d2b433
 * the License, or (at your option) any later version.
rpm-build d2b433
 *
rpm-build d2b433
 * This library is distributed in the hope that it will be useful,
rpm-build d2b433
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rpm-build d2b433
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
rpm-build d2b433
 * Lesser General Public License for more details.
rpm-build d2b433
 *
rpm-build d2b433
 * You should have received a copy of the GNU Lesser General Public
rpm-build d2b433
 * License along with this library.  If not, see
rpm-build d2b433
 * <http://www.gnu.org/licenses/>.
rpm-build d2b433
 */
rpm-build d2b433
rpm-build d2b433
/** @brief gdkpixbuf support */
rpm-build d2b433
rpm-build d2b433
#include <stdlib.h>
rpm-build d2b433
#include <string.h>
rpm-build d2b433
#include <glib.h>
rpm-build d2b433
#include <gdk-pixbuf/gdk-pixbuf.h>
rpm-build d2b433
#include <libopenraw/thumbnails.h>
rpm-build d2b433
#include <libopenraw/rawfile.h>
rpm-build d2b433
#include <libopenraw-gnome/gdkpixbuf.h>
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
static void pixbuf_free(guchar * data, gpointer u)
rpm-build d2b433
{
rpm-build d2b433
	(void)u;
rpm-build d2b433
	free(data);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
/**
rpm-build d2b433
 * Returns a retained GdkPixbuf
rpm-build d2b433
 */
rpm-build d2b433
static GdkPixbuf *rotate_pixbuf(GdkPixbuf *tmp, int32_t orientation)
rpm-build d2b433
{
rpm-build d2b433
	GdkPixbuf *pixbuf = NULL;
rpm-build d2b433
	switch(orientation) {
rpm-build d2b433
	case 0:
rpm-build d2b433
	case 1:
rpm-build d2b433
		pixbuf = g_object_ref(tmp);
rpm-build d2b433
		break;
rpm-build d2b433
	case 2:
rpm-build d2b433
		pixbuf = gdk_pixbuf_flip(tmp, TRUE);
rpm-build d2b433
		break;
rpm-build d2b433
	case 3:
rpm-build d2b433
		pixbuf = gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_UPSIDEDOWN);
rpm-build d2b433
		break;
rpm-build d2b433
	case 4: {
rpm-build d2b433
		GdkPixbuf* rotated = gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_UPSIDEDOWN);
rpm-build d2b433
		pixbuf = gdk_pixbuf_flip(rotated, TRUE);
rpm-build d2b433
		g_object_unref(rotated);
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	case 5: {
rpm-build d2b433
		GdkPixbuf* rotated = gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_CLOCKWISE);
rpm-build d2b433
		pixbuf = gdk_pixbuf_flip(rotated, FALSE);
rpm-build d2b433
		g_object_unref(rotated);
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	case 6:
rpm-build d2b433
		pixbuf =  gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_CLOCKWISE);
rpm-build d2b433
		break;
rpm-build d2b433
	case 7: {
rpm-build d2b433
		GdkPixbuf* rotated = gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
rpm-build d2b433
		pixbuf = gdk_pixbuf_flip(rotated, FALSE);
rpm-build d2b433
		g_object_unref(rotated);
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	case 8:
rpm-build d2b433
		pixbuf =  gdk_pixbuf_rotate_simple(tmp, GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE);
rpm-build d2b433
		break;		
rpm-build d2b433
	default:
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	return pixbuf;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
static GdkPixbuf *_or_thumbnail_to_pixbuf(ORThumbnailRef thumbnail, 
rpm-build d2b433
										  int32_t orientation)
rpm-build d2b433
{
rpm-build d2b433
	GdkPixbuf* tmp = NULL;
rpm-build d2b433
	GdkPixbuf* pixbuf = NULL;
rpm-build d2b433
	
rpm-build d2b433
	const guchar * buf;
rpm-build d2b433
	or_data_type format = or_thumbnail_format(thumbnail);
rpm-build d2b433
	buf = (const guchar *)or_thumbnail_data(thumbnail);
rpm-build d2b433
	
rpm-build d2b433
	switch (format)
rpm-build d2b433
	{
rpm-build d2b433
	case OR_DATA_TYPE_PIXMAP_8RGB:
rpm-build d2b433
	{
rpm-build d2b433
		uint32_t x, y;
rpm-build d2b433
		size_t buf_size;
rpm-build d2b433
		guchar * data;
rpm-build d2b433
rpm-build d2b433
		buf_size = or_thumbnail_data_size(thumbnail);
rpm-build d2b433
		data = (guchar*)malloc(buf_size);
rpm-build d2b433
		memcpy(data, buf, buf_size);
rpm-build d2b433
		or_thumbnail_dimensions(thumbnail, &x, &y);
rpm-build d2b433
		
rpm-build d2b433
		tmp = gdk_pixbuf_new_from_data(data, 
rpm-build d2b433
					       GDK_COLORSPACE_RGB,
rpm-build d2b433
					       FALSE, 8, x, y, x * 3, 
rpm-build d2b433
					       pixbuf_free, NULL);
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	case OR_DATA_TYPE_JPEG:
rpm-build d2b433
	case OR_DATA_TYPE_TIFF:
rpm-build d2b433
	case OR_DATA_TYPE_PNG:
rpm-build d2b433
	{
rpm-build d2b433
		GdkPixbufLoader *loader = NULL;
rpm-build d2b433
		size_t count = or_thumbnail_data_size(thumbnail);
rpm-build d2b433
		loader = gdk_pixbuf_loader_new();
rpm-build d2b433
		if (loader != NULL) {
rpm-build d2b433
			GError* error = NULL;
rpm-build d2b433
			if(!gdk_pixbuf_loader_write(loader, buf,
rpm-build d2b433
						    count, &error) && error) {
rpm-build d2b433
				fprintf(stderr, "loader write error: %s",
rpm-build d2b433
					error->message);
rpm-build d2b433
				g_error_free(error);
rpm-build d2b433
				error = NULL;
rpm-build d2b433
			}
rpm-build d2b433
			if(!gdk_pixbuf_loader_close(loader, &error) && error) {
rpm-build d2b433
				fprintf(stderr, "loader close error: %s",
rpm-build d2b433
					error->message);
rpm-build d2b433
				g_error_free(error);
rpm-build d2b433
			}
rpm-build d2b433
			tmp = gdk_pixbuf_loader_get_pixbuf(loader);
rpm-build d2b433
			g_object_ref(tmp);
rpm-build d2b433
			g_object_unref(loader);
rpm-build d2b433
		}
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	default: 
rpm-build d2b433
		break;
rpm-build d2b433
	}
rpm-build d2b433
	pixbuf = rotate_pixbuf(tmp, orientation);
rpm-build d2b433
	g_object_unref(tmp);
rpm-build d2b433
	return pixbuf;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
GdkPixbuf *or_thumbnail_to_pixbuf(ORThumbnailRef thumbnail)
rpm-build d2b433
{
rpm-build d2b433
	return _or_thumbnail_to_pixbuf(thumbnail, 0); 
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
static GdkPixbuf *_or_gdkpixbuf_extract_thumbnail(const char *path, 
rpm-build d2b433
						  uint32_t preferred_size, 
rpm-build d2b433
						  gboolean rotate)
rpm-build d2b433
{
rpm-build d2b433
	ORRawFileRef rf;
rpm-build d2b433
	int32_t orientation = 0;
rpm-build d2b433
	GdkPixbuf *pixbuf = NULL;
rpm-build d2b433
	or_error err = OR_ERROR_NONE;
rpm-build d2b433
	ORThumbnailRef thumbnail = NULL;
rpm-build d2b433
rpm-build d2b433
	rf = or_rawfile_new(path, OR_RAWFILE_TYPE_UNKNOWN);
rpm-build d2b433
	if(rf) {
rpm-build d2b433
		if(rotate) {
rpm-build d2b433
			orientation = or_rawfile_get_orientation(rf);
rpm-build d2b433
		}
rpm-build d2b433
		thumbnail = or_thumbnail_new();
rpm-build d2b433
		err = or_rawfile_get_thumbnail(rf, preferred_size,
rpm-build d2b433
									   thumbnail);
rpm-build d2b433
		if (err == OR_ERROR_NONE)	{
rpm-build d2b433
			pixbuf = _or_thumbnail_to_pixbuf(thumbnail, orientation);
rpm-build d2b433
		}
rpm-build d2b433
		else {
rpm-build d2b433
			g_debug("or_get_extract_thumbnail() failed with %d.", err);
rpm-build d2b433
		}
rpm-build d2b433
		err = or_thumbnail_release(thumbnail);
rpm-build d2b433
		if (err != OR_ERROR_NONE) {
rpm-build d2b433
			g_warning("or_thumbnail_release() failed with %d", err);
rpm-build d2b433
		}
rpm-build d2b433
		or_rawfile_release(rf);
rpm-build d2b433
	}
rpm-build d2b433
rpm-build d2b433
	return pixbuf;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
GdkPixbuf *or_gdkpixbuf_extract_thumbnail(const char *path, uint32_t preferred_size)
rpm-build d2b433
{
rpm-build d2b433
	return _or_gdkpixbuf_extract_thumbnail(path, preferred_size, FALSE);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
GdkPixbuf *or_gdkpixbuf_extract_rotated_thumbnail(const char *path, uint32_t preferred_size)
rpm-build d2b433
{
rpm-build d2b433
	return _or_gdkpixbuf_extract_thumbnail(path, preferred_size, TRUE);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433