|
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 |
|