Logo Search packages:      
Sourcecode: f-spot version File versions

eog-pixbuf-util.c

#include "eog-pixbuf-util.h"

void
eog_pixbuf_flip_horizontal (GdkPixbuf *pixbuf)
{
      int x, y, i;
      int n_channels;
      int width, height;
      int rowstride;
      guchar *src;
      guchar *dest;
      guchar *buffer;
      guchar tmp;

      g_return_if_fail (pixbuf != NULL);

      g_object_ref (pixbuf);

      width = gdk_pixbuf_get_width (pixbuf);
      height = gdk_pixbuf_get_height (pixbuf);
      buffer = gdk_pixbuf_get_pixels (pixbuf);
      n_channels = gdk_pixbuf_get_n_channels (pixbuf);
      rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      
      for (y = 0; y < height; y++) {
            for (x = 0; x < (width / 2); x++) {
                  src = buffer + y * rowstride + x * n_channels;
                  dest = buffer + y * rowstride + (width - x - 1) * n_channels;

                  for (i = 0; i < n_channels; i++) {
                        tmp = dest[i];
                        dest[i] = src[i];
                        src[i] = tmp;
                  }
            }
      }

      g_object_unref (pixbuf);
}

void
eog_pixbuf_flip_vertical (GdkPixbuf *pixbuf)
{
      int x, y, i;
      int n_channels;
      int width, height;
      int rowstride;
      guchar *src;
      guchar *dest;
      guchar *buffer;
      guchar tmp;

      g_return_if_fail (pixbuf != NULL);

      g_object_ref (pixbuf);
      
      width = gdk_pixbuf_get_width (pixbuf);
      height = gdk_pixbuf_get_height (pixbuf);
      buffer = gdk_pixbuf_get_pixels (pixbuf);
      n_channels = gdk_pixbuf_get_n_channels (pixbuf);
      rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      
      for (x = 0; x < width; x++) {
            for (y = 0; y < (height / 2); y++) {
                  src = buffer + y * rowstride + x * n_channels;
                  dest = buffer + (height - y - 1) * rowstride +  x * n_channels;

                  for (i = 0; i < n_channels; i++) {
                        tmp = dest[i];
                        dest[i] = src[i];
                        src[i] = tmp;
                  }
            }
      }
}

GdkPixbuf*
eog_pixbuf_rotate_90_cw (GdkPixbuf *pixbuf)
{
      guchar *src_buffer;
      guchar *dest_buffer;
      guchar *src_pos;
      guchar *dest_pos;
      int src_width;
      int src_height;
      int src_rowstride;
      int src_n_channels;
      int dest_width;
      int dest_height;
      int dest_rowstride;
      int dest_n_channels;
      int src_x, src_y, dest_x, dest_y, i;
      GdkPixbuf *dest;

      g_return_val_if_fail (pixbuf != NULL, NULL);

      g_object_ref (pixbuf);

      /* FIXME: Add in-place rotation when width == height. */

      src_width = gdk_pixbuf_get_width (pixbuf);
      src_height = gdk_pixbuf_get_height (pixbuf);
      src_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      src_n_channels = gdk_pixbuf_get_n_channels (pixbuf);
      src_buffer = gdk_pixbuf_get_pixels (pixbuf);

      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
                               gdk_pixbuf_get_has_alpha (pixbuf),
                               gdk_pixbuf_get_bits_per_sample (pixbuf),
                               src_height,
                               src_width);

      if (dest == NULL) return NULL;

      dest_width = gdk_pixbuf_get_width (dest);
      dest_height = gdk_pixbuf_get_height (dest);
      dest_rowstride = gdk_pixbuf_get_rowstride (dest);
      dest_n_channels = gdk_pixbuf_get_n_channels (dest);
      dest_buffer = gdk_pixbuf_get_pixels (dest);

      for (src_y = 0; src_y < src_height; src_y++) {
            for (src_x = 0; src_x < src_width; src_x++) {
                  src_pos = src_buffer + src_y * src_rowstride + src_x * src_n_channels;

                  dest_x = dest_width - src_y - 1;
                  dest_y = src_x;
                  dest_pos = dest_buffer + dest_y * dest_rowstride + dest_x * dest_n_channels;

                  for (i = 0; i < src_n_channels; i++) {
                        dest_pos[i] = src_pos[i];
                  }
            }
      }

      g_object_unref (pixbuf);

      return dest;
}

GdkPixbuf*
eog_pixbuf_rotate_90_ccw (GdkPixbuf *pixbuf)
{
      guchar *src_buffer;
      guchar *dest_buffer;
      guchar *src_pos;
      guchar *dest_pos;
      int src_width;
      int src_height;
      int src_rowstride;
      int src_n_channels;
      int dest_width;
      int dest_height;
      int dest_rowstride;
      int dest_n_channels;
      int src_x, src_y, dest_x, dest_y, i;
      GdkPixbuf *dest;

      g_return_val_if_fail (pixbuf != NULL, NULL);

      g_object_ref (pixbuf);

      /* FIXME: Add in-place rotation when width == height. */

      src_width = gdk_pixbuf_get_width (pixbuf);
      src_height = gdk_pixbuf_get_height (pixbuf);
      src_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      src_n_channels = gdk_pixbuf_get_n_channels (pixbuf);
      src_buffer = gdk_pixbuf_get_pixels (pixbuf);

      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
                               gdk_pixbuf_get_has_alpha (pixbuf),
                               gdk_pixbuf_get_bits_per_sample (pixbuf),
                               src_height,
                               src_width);

      if (dest == NULL) return NULL;

      dest_width = gdk_pixbuf_get_width (dest);
      dest_height = gdk_pixbuf_get_height (dest);
      dest_rowstride = gdk_pixbuf_get_rowstride (dest);
      dest_n_channels = gdk_pixbuf_get_n_channels (dest);
      dest_buffer = gdk_pixbuf_get_pixels (dest);

      for (src_y = 0; src_y < src_height; src_y++) {
            for (src_x = 0; src_x < src_width; src_x++) {
                  src_pos = src_buffer + src_y * src_rowstride + src_x * src_n_channels;

                  dest_x = src_y;
                  dest_y = dest_height - src_x - 1;
                  dest_pos = dest_buffer + dest_y * dest_rowstride + dest_x * dest_n_channels;

                  for (i = 0; i < src_n_channels; i++) {
                        dest_pos[i] = src_pos[i];
                  }
            }
      }

      g_object_unref (pixbuf);

      return dest;
}

void
eog_pixbuf_rotate_180 (GdkPixbuf *pixbuf)
{
      guchar *buffer;
      guchar *src_pos;
      guchar *dest_pos;
      guchar tmp;
      int width;
      int height;
      int rowstride;
      int n_channels;
      int src_x, src_y, dest_x, dest_y, i;

      g_return_if_fail (pixbuf != NULL);

      g_object_ref (pixbuf);

      width = gdk_pixbuf_get_width (pixbuf);
      height = gdk_pixbuf_get_height (pixbuf);
      rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      n_channels = gdk_pixbuf_get_n_channels (pixbuf);
      buffer = gdk_pixbuf_get_pixels (pixbuf);

      for (src_y = 0; src_y < (height / 2); src_y++) {
            for (src_x = 0; src_x < width; src_x++) {
                  src_pos = buffer + src_y * rowstride + src_x * n_channels;

                  dest_x = width - src_x - 1;
                  dest_y = height - src_y - 1;
                  dest_pos = buffer + dest_y * rowstride + dest_x * n_channels;

                  for (i = 0; i < n_channels; i++) {
                        tmp = dest_pos[i];
                        dest_pos[i] = src_pos[i];
                        src_pos[i] = tmp;
                  }
            }
      }

      if ((height % 2) == 1) {
            src_y = (height / 2);
            buffer = buffer + src_y * rowstride;
            for (src_x = 0; src_x < (width / 2); src_x++) {
                  src_pos = buffer + src_x * n_channels;
                  dest_x = width - src_x - 1;
                  dest_y = src_y;
                  dest_pos = buffer + dest_x * n_channels;

                  for (i = 0; i < n_channels; i++) {
                        tmp = dest_pos[i];
                        dest_pos[i] = src_pos[i];
                        src_pos[i] = tmp;
                  }
            }
      }

      g_object_unref (pixbuf);
}


Generated by  Doxygen 1.6.0   Back to index