Blame telepathy-account-widgets/tp-account-widgets/tpaw-pixbuf-utils.c

Packit Service c6b9b0
/*
Packit Service c6b9b0
 * Copyright (C) 2002-2007 Imendio AB
Packit Service c6b9b0
 * Copyright (C) 2007-2013 Collabora Ltd.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is free software; you can redistribute it and/or
Packit Service c6b9b0
 * modify it under the terms of the GNU Lesser General Public
Packit Service c6b9b0
 * License as published by the Free Software Foundation; either
Packit Service c6b9b0
 * version 2.1 of the License, or (at your option) any later version.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is distributed in the hope that it will be useful,
Packit Service c6b9b0
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c6b9b0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service c6b9b0
 * Lesser General Public License for more details.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * You should have received a copy of the GNU Lesser General Public
Packit Service c6b9b0
 * License along with this library; if not, write to the Free Software
Packit Service c6b9b0
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Authors: Mikael Hallendal <micke@imendio.com>
Packit Service c6b9b0
 *          Richard Hult <richard@imendio.com>
Packit Service c6b9b0
 *          Martyn Russell <martyn@imendio.com>
Packit Service c6b9b0
 *          Xavier Claessens <xclaesse@gmail.com>
Packit Service c6b9b0
 *          Travis Reitter <travis.reitter@collabora.co.uk>
Packit Service c6b9b0
 */
Packit Service c6b9b0
Packit Service c6b9b0
#include "config.h"
Packit Service c6b9b0
#include "tpaw-pixbuf-utils.h"
Packit Service c6b9b0
Packit Service c6b9b0
#define DEBUG_FLAG TPAW_DEBUG_OTHER
Packit Service c6b9b0
#include "tpaw-debug.h"
Packit Service c6b9b0
Packit Service c6b9b0
GdkPixbuf *
Packit Service c6b9b0
tpaw_pixbuf_from_data (gchar *data,
Packit Service c6b9b0
    gsize data_size)
Packit Service c6b9b0
{
Packit Service c6b9b0
  return tpaw_pixbuf_from_data_and_mime (data, data_size, NULL);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
GdkPixbuf *
Packit Service c6b9b0
tpaw_pixbuf_from_data_and_mime (gchar *data,
Packit Service c6b9b0
           gsize data_size,
Packit Service c6b9b0
           gchar **mime_type)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GdkPixbufLoader *loader;
Packit Service c6b9b0
  GdkPixbufFormat *format;
Packit Service c6b9b0
  GdkPixbuf *pixbuf = NULL;
Packit Service c6b9b0
  gchar **mime_types;
Packit Service c6b9b0
  GError *error = NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  if (!data)
Packit Service c6b9b0
    return NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  loader = gdk_pixbuf_loader_new ();
Packit Service c6b9b0
  if (!gdk_pixbuf_loader_write (loader, (guchar *) data, data_size, &error))
Packit Service c6b9b0
    {
Packit Service c6b9b0
      DEBUG ("Failed to write to pixbuf loader: %s",
Packit Service c6b9b0
        error ? error->message : "No error given");
Packit Service c6b9b0
      goto out;
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  if (!gdk_pixbuf_loader_close (loader, &error))
Packit Service c6b9b0
    {
Packit Service c6b9b0
      DEBUG ("Failed to close pixbuf loader: %s",
Packit Service c6b9b0
        error ? error->message : "No error given");
Packit Service c6b9b0
      goto out;
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
Packit Service c6b9b0
  if (pixbuf)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      g_object_ref (pixbuf);
Packit Service c6b9b0
Packit Service c6b9b0
      if (mime_type != NULL)
Packit Service c6b9b0
        {
Packit Service c6b9b0
          format = gdk_pixbuf_loader_get_format (loader);
Packit Service c6b9b0
          mime_types = gdk_pixbuf_format_get_mime_types (format);
Packit Service c6b9b0
Packit Service c6b9b0
          *mime_type = g_strdup (*mime_types);
Packit Service c6b9b0
          if (mime_types[1] != NULL)
Packit Service c6b9b0
            DEBUG ("Loader supports more than one mime "
Packit Service c6b9b0
              "type! Picking the first one, %s",
Packit Service c6b9b0
              *mime_type);
Packit Service c6b9b0
Packit Service c6b9b0
          g_strfreev (mime_types);
Packit Service c6b9b0
        }
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
out:
Packit Service c6b9b0
  g_clear_error (&error);
Packit Service c6b9b0
  g_object_unref (loader);
Packit Service c6b9b0
Packit Service c6b9b0
  return pixbuf;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
GdkPixbuf *
Packit Service c6b9b0
tpaw_pixbuf_scale_down_if_necessary (GdkPixbuf *pixbuf,
Packit Service c6b9b0
    gint max_size)
Packit Service c6b9b0
{
Packit Service c6b9b0
  gint width, height;
Packit Service c6b9b0
  gdouble factor;
Packit Service c6b9b0
Packit Service c6b9b0
  width = gdk_pixbuf_get_width (pixbuf);
Packit Service c6b9b0
  height = gdk_pixbuf_get_height (pixbuf);
Packit Service c6b9b0
Packit Service c6b9b0
  if (width > 0 && (width > max_size || height > max_size))
Packit Service c6b9b0
    {
Packit Service c6b9b0
      factor = (gdouble) max_size / MAX (width, height);
Packit Service c6b9b0
Packit Service c6b9b0
      width = width * factor;
Packit Service c6b9b0
      height = height * factor;
Packit Service c6b9b0
Packit Service c6b9b0
      return gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_HYPER);
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  return g_object_ref (pixbuf);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
GdkPixbuf *
Packit Service c6b9b0
tpaw_pixbuf_from_icon_name_sized (const gchar *icon_name,
Packit Service c6b9b0
    gint size)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GtkIconTheme *theme;
Packit Service c6b9b0
  GdkPixbuf *pixbuf;
Packit Service c6b9b0
  GError *error = NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  if (!icon_name)
Packit Service c6b9b0
    return NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  theme = gtk_icon_theme_get_default ();
Packit Service c6b9b0
Packit Service c6b9b0
  pixbuf = gtk_icon_theme_load_icon (theme, icon_name, size, 0, &error);
Packit Service c6b9b0
Packit Service c6b9b0
  if (error)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      DEBUG ("Error loading icon: %s", error->message);
Packit Service c6b9b0
      g_clear_error (&error);
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  return pixbuf;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
GdkPixbuf *
Packit Service c6b9b0
tpaw_pixbuf_from_icon_name (const gchar *icon_name,
Packit Service c6b9b0
    GtkIconSize  icon_size)
Packit Service c6b9b0
{
Packit Service c6b9b0
  gint w, h;
Packit Service c6b9b0
  gint size = 48;
Packit Service c6b9b0
Packit Service c6b9b0
  if (!icon_name)
Packit Service c6b9b0
    return NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  if (gtk_icon_size_lookup (icon_size, &w, &h))
Packit Service c6b9b0
    size = (w + h) / 2;
Packit Service c6b9b0
Packit Service c6b9b0
  return tpaw_pixbuf_from_icon_name_sized (icon_name, size);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
gchar *
Packit Service c6b9b0
tpaw_filename_from_icon_name (const gchar *icon_name,
Packit Service c6b9b0
    GtkIconSize icon_size)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GtkIconTheme *icon_theme;
Packit Service c6b9b0
  GtkIconInfo *icon_info;
Packit Service c6b9b0
  gint w, h;
Packit Service c6b9b0
  gint size = 48;
Packit Service c6b9b0
  gchar *ret;
Packit Service c6b9b0
Packit Service c6b9b0
  icon_theme = gtk_icon_theme_get_default ();
Packit Service c6b9b0
Packit Service c6b9b0
  if (gtk_icon_size_lookup (icon_size, &w, &h))
Packit Service c6b9b0
    size = (w + h) / 2;
Packit Service c6b9b0
Packit Service c6b9b0
  icon_info = gtk_icon_theme_lookup_icon (icon_theme, icon_name, size, 0);
Packit Service c6b9b0
  if (icon_info == NULL)
Packit Service c6b9b0
    return NULL;
Packit Service c6b9b0
Packit Service c6b9b0
  ret = g_strdup (gtk_icon_info_get_filename (icon_info));
Packit Service c6b9b0
  gtk_icon_info_free (icon_info);
Packit Service c6b9b0
Packit Service c6b9b0
  return ret;
Packit Service c6b9b0
}