Blame gdk/gdkpixbuf-drawable.c

Packit Service fb6fa5
/* GdkPixbuf library - convert X drawable information to RGB
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Copyright (C) 1999 Michael Zucchi
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Authors: Michael Zucchi <zucchi@zedzone.mmc.com.au>
Packit Service fb6fa5
 *          Cody Russell <bratsche@dfw.net>
Packit Service fb6fa5
 * 	    Federico Mena-Quintero <federico@gimp.org>
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include <gdk-pixbuf/gdk-pixbuf.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkcolor.h"
Packit Service fb6fa5
#include "gdkimage.h"
Packit Service fb6fa5
#include "gdkvisual.h"
Packit Service fb6fa5
#include "gdkwindow.h"
Packit Service fb6fa5
#include "gdkpixbuf.h"
Packit Service fb6fa5
#include "gdkpixmap.h"
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
/* Some convenient names
Packit Service fb6fa5
 */
Packit Service fb6fa5
#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
Packit Service fb6fa5
#define LITTLE
Packit Service fb6fa5
#undef BIG
Packit Service fb6fa5
#else
Packit Service fb6fa5
#define BIG
Packit Service fb6fa5
#undef LITTLE
Packit Service fb6fa5
#endif
Packit Service fb6fa5
#define d(x)
Packit Service fb6fa5
Packit Service fb6fa5
#define SWAP16(d) GUINT16_SWAP_LE_BE(d)
Packit Service fb6fa5
Packit Service fb6fa5

Packit Service fb6fa5
Packit Service fb6fa5
static const guint32 mask_table[] = {
Packit Service fb6fa5
  0x00000000, 0x00000001, 0x00000003, 0x00000007,
Packit Service fb6fa5
  0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
Packit Service fb6fa5
  0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
Packit Service fb6fa5
  0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
Packit Service fb6fa5
  0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
Packit Service fb6fa5
  0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
Packit Service fb6fa5
  0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
Packit Service fb6fa5
  0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
Packit Service fb6fa5
  0xffffffff
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5

Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert bitmap data to pixbuf without alpha,
Packit Service fb6fa5
 * without using a colormap 
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
bitmap1 (GdkImage    *image,
Packit Service fb6fa5
         guchar      *pixels,
Packit Service fb6fa5
         int          rowstride,
Packit Service fb6fa5
         int          x1,
Packit Service fb6fa5
         int          y1,
Packit Service fb6fa5
         int          x2,
Packit Service fb6fa5
         int          y2)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  register guint8 data;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("bitmap, no alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          /* top 29 bits of xx (xx >> 3) indicate the byte the bit is inside,
Packit Service fb6fa5
           * bottom 3 bits (xx & 7) indicate bit inside that byte,
Packit Service fb6fa5
           * we don't bother to canonicalize data to 1 or 0, just
Packit Service fb6fa5
           * leave the relevant bit in-place.
Packit Service fb6fa5
           */
Packit Service fb6fa5
          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
Packit Service fb6fa5
                                  (0x80 >> (xx & 7)) :
Packit Service fb6fa5
                                  (1 << (xx & 7)));
Packit Service fb6fa5
Packit Service fb6fa5
          if (data)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            {
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
            }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert bitmap data to pixbuf with alpha,
Packit Service fb6fa5
 * without using a colormap 
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
bitmap1a (GdkImage    *image,
Packit Service fb6fa5
          guchar      *pixels,
Packit Service fb6fa5
          int          rowstride,
Packit Service fb6fa5
          int          x1,
Packit Service fb6fa5
          int          y1,
Packit Service fb6fa5
          int          x2,
Packit Service fb6fa5
          int          y2)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  register guint8 data;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("bitmap, with alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          /* see comment in bitmap1() */
Packit Service fb6fa5
          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
Packit Service fb6fa5
                                  (0x80 >> (xx & 7)) :
Packit Service fb6fa5
                                  (1 << (xx & 7)));
Packit Service fb6fa5
Packit Service fb6fa5
          if (data)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
              *o++ = 255;
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            {
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
              *o++ = 0;
Packit Service fb6fa5
            }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 1 bits-pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb1 (GdkImage    *image,
Packit Service fb6fa5
      guchar      *pixels,
Packit Service fb6fa5
      int          rowstride,
Packit Service fb6fa5
      int          x1,
Packit Service fb6fa5
      int          y1,
Packit Service fb6fa5
      int          x2,
Packit Service fb6fa5
      int          y2,
Packit Service fb6fa5
      GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  register guint8 data;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("1 bits/pixel\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  /* convert upto 8 pixels/time */
Packit Service fb6fa5
  /* its probably not worth trying to make this run very fast, who uses
Packit Service fb6fa5
   * 1 bit displays anymore?
Packit Service fb6fa5
   */
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          /* see comment in bitmap1() */
Packit Service fb6fa5
          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
Packit Service fb6fa5
                                  (0x80 >> (xx & 7)) :
Packit Service fb6fa5
                                  (1 << (xx & 7)));
Packit Service fb6fa5
Packit Service fb6fa5
	  *o++ = colormap->colors[data].red   >> 8;
Packit Service fb6fa5
	  *o++ = colormap->colors[data].green >> 8;
Packit Service fb6fa5
	  *o++ = colormap->colors[data].blue  >> 8;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 1 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb1a (GdkImage    *image,
Packit Service fb6fa5
       guchar      *pixels,
Packit Service fb6fa5
       int          rowstride,
Packit Service fb6fa5
       int          x1,
Packit Service fb6fa5
       int          y1,
Packit Service fb6fa5
       int          x2,
Packit Service fb6fa5
       int          y2,
Packit Service fb6fa5
       GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  register guint8 data;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl, *orow = pixels;
Packit Service fb6fa5
  
Packit Service fb6fa5
  d (printf ("1 bits/pixel\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  /* convert upto 8 pixels/time */
Packit Service fb6fa5
  /* its probably not worth trying to make this run very fast, who uses
Packit Service fb6fa5
   * 1 bit displays anymore? */
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          /* see comment in bitmap1() */
Packit Service fb6fa5
          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
Packit Service fb6fa5
                                  (0x80 >> (xx & 7)) :
Packit Service fb6fa5
                                  (1 << (xx & 7)));
Packit Service fb6fa5
Packit Service fb6fa5
          *o++ = colormap->colors[data].red   >> 8;
Packit Service fb6fa5
	  *o++ = colormap->colors[data].green >> 8;
Packit Service fb6fa5
	  *o++ = colormap->colors[data].blue  >> 8;
Packit Service fb6fa5
	  *o++ = 255;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 8 bits/pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb8 (GdkImage    *image,
Packit Service fb6fa5
      guchar      *pixels,
Packit Service fb6fa5
      int          rowstride,
Packit Service fb6fa5
      int          x1,
Packit Service fb6fa5
      int          y1,
Packit Service fb6fa5
      int          x2,
Packit Service fb6fa5
      int          y2,
Packit Service fb6fa5
      GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  guint32 mask;
Packit Service fb6fa5
  register guint32 data;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
  register guint8 *s;
Packit Service fb6fa5
  register guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("8 bit, no alpha output\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  mask = mask_table[image->depth];
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = srow;
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          data = *s++ & mask;
Packit Service fb6fa5
          *o++ = colormap->colors[data].red   >> 8;
Packit Service fb6fa5
          *o++ = colormap->colors[data].green >> 8;
Packit Service fb6fa5
          *o++ = colormap->colors[data].blue  >> 8;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 8 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb8a (GdkImage    *image,
Packit Service fb6fa5
       guchar      *pixels,
Packit Service fb6fa5
       int          rowstride,
Packit Service fb6fa5
       int          x1,
Packit Service fb6fa5
       int          y1,
Packit Service fb6fa5
       int          x2,
Packit Service fb6fa5
       int          y2,
Packit Service fb6fa5
       GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
  guint32 mask;
Packit Service fb6fa5
  register guint32 data;
Packit Service fb6fa5
  guint32 remap[256];
Packit Service fb6fa5
  register guint8 *s;	/* read 2 pixels at once */
Packit Service fb6fa5
  register guint32 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("8 bit, with alpha output\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  mask = mask_table[image->depth];
Packit Service fb6fa5
Packit Service fb6fa5
  for (xx = x1; xx < colormap->size; xx++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
      remap[xx] = 0xff000000
Packit Service fb6fa5
	| (colormap->colors[xx].blue  & 0xff00) << 8
Packit Service fb6fa5
	| (colormap->colors[xx].green & 0xff00)
Packit Service fb6fa5
	| (colormap->colors[xx].red   >> 8);
Packit Service fb6fa5
#else
Packit Service fb6fa5
      remap[xx] = 0xff
Packit Service fb6fa5
	| (colormap->colors[xx].red   & 0xff00) << 16
Packit Service fb6fa5
	| (colormap->colors[xx].green & 0xff00) << 8
Packit Service fb6fa5
	| (colormap->colors[xx].blue  & 0xff00);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  data = *s++ & mask;
Packit Service fb6fa5
	  *o++ = remap[data];
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Bit shifting for 565 and 555 conversion routines
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * RGB565 == rrrr rggg gggb bbbb, 16 bit native endian
Packit Service fb6fa5
 * RGB555 == xrrr rrgg gggb bbbb
Packit Service fb6fa5
 * ABGR8888: ARGB, 32-bit native endian
Packit Service fb6fa5
 * RGBA8888: RGBA, 32-bit native endian
Packit Service fb6fa5
 */
Packit Service fb6fa5
#define R8fromRGB565(d) ((((d) >> 8) & 0xf8) | (((d) >> 13) & 0x7))
Packit Service fb6fa5
#define G8fromRGB565(d) ((((d) >> 3) & 0xfc) | (((d) >> 9)  & 0x3))
Packit Service fb6fa5
#define B8fromRGB565(d) ((((d) << 3) & 0xf8) | (((d) >> 2)  & 0x7))
Packit Service fb6fa5
Packit Service fb6fa5
#define ABGR8888fromRGB565(d) (  ((d) & 0xf800) >> 8  | ((d) & 0xe000) >> 13 \
Packit Service fb6fa5
			       | ((d) & 0x07e0) << 5  | ((d) & 0x0600) >> 1  \
Packit Service fb6fa5
			       | ((d) & 0x001f) << 19 | ((d) & 0x001c) << 14 \
Packit Service fb6fa5
			       | 0xff000000)
Packit Service fb6fa5
#define RGBA8888fromRGB565(d) (  ((d) & 0xf800) << 16 | ((d) & 0xe000) << 11 \
Packit Service fb6fa5
			       | ((d) & 0x07e0) << 13 | ((d) & 0x0600) << 7  \
Packit Service fb6fa5
			       | ((d) & 0x001f) << 11 | ((d) & 0x001c) << 6  \
Packit Service fb6fa5
			       | 0xff)
Packit Service fb6fa5
Packit Service fb6fa5
#define R8fromRGB555(d) (((d) & 0x7c00) >> 7 | ((d) & 0x7000) >> 12)
Packit Service fb6fa5
#define G8fromRGB555(d) (((d) & 0x03e0) >> 2 | ((d) & 0x0380) >> 7)
Packit Service fb6fa5
#define B8fromRGB555(d) (((d) & 0x001f) << 3 | ((d) & 0x001c) >> 2)
Packit Service fb6fa5
Packit Service fb6fa5
#define ABGR8888fromRGB555(d) (  ((d) & 0x7c00) >> 7  | ((d) & 0x7000) >> 12 \
Packit Service fb6fa5
			       | ((d) & 0x03e0) << 6  | ((d) & 0x0380) << 1  \
Packit Service fb6fa5
			       | ((d) & 0x001f) << 19 | ((d) & 0x001c) << 14 \
Packit Service fb6fa5
			       | 0xff000000)
Packit Service fb6fa5
#define RGBA8888fromRGB555(d) (  ((d) & 0x7c00) << 17 | ((d) & 0x7000) << 12 \
Packit Service fb6fa5
			       | ((d) & 0x03e0) << 14 | ((d) & 0x0380) << 9  \
Packit Service fb6fa5
			       | ((d) & 0x001f) << 11 | ((d) & 0x001c) << 6  \
Packit Service fb6fa5
			       | 0xff)
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 16 bits/pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 * data in lsb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb565lsb (GdkImage    *image,
Packit Service fb6fa5
	   guchar      *pixels,
Packit Service fb6fa5
	   int          rowstride,
Packit Service fb6fa5
	   int          x1,
Packit Service fb6fa5
	   int          y1,
Packit Service fb6fa5
	   int          x2,
Packit Service fb6fa5
	   int          y2,
Packit Service fb6fa5
	   GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint8 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef BIG
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
#endif	  
Packit Service fb6fa5
	  *o++ = R8fromRGB565 (data);
Packit Service fb6fa5
	  *o++ = G8fromRGB565 (data);
Packit Service fb6fa5
	  *o++ = B8fromRGB565 (data);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 16 bits/pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 * data in msb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb565msb (GdkImage    *image,
Packit Service fb6fa5
	   guchar      *pixels,
Packit Service fb6fa5
	   int          rowstride,
Packit Service fb6fa5
           int          x1,
Packit Service fb6fa5
           int          y1,
Packit Service fb6fa5
           int          x2,
Packit Service fb6fa5
           int          y2,
Packit Service fb6fa5
	   GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint8 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
#endif	  
Packit Service fb6fa5
	  *o++ = R8fromRGB565 (data);
Packit Service fb6fa5
	  *o++ = G8fromRGB565 (data);
Packit Service fb6fa5
	  *o++ = B8fromRGB565 (data);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 16 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 * data in lsb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb565alsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint32 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  *o++ = ABGR8888fromRGB565 (data);
Packit Service fb6fa5
#else
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
	  *o++ = RGBA8888fromRGB565 (data);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 16 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 * data in msb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb565amsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint32 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
	  *o++ = ABGR8888fromRGB565 (data);
Packit Service fb6fa5
#else
Packit Service fb6fa5
	  *o++ = RGBA8888fromRGB565 (data);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 15 bits/pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 * data in lsb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb555lsb (GdkImage     *image,
Packit Service fb6fa5
	   guchar       *pixels,
Packit Service fb6fa5
	   int           rowstride,
Packit Service fb6fa5
           int          x1,
Packit Service fb6fa5
           int          y1,
Packit Service fb6fa5
           int          x2,
Packit Service fb6fa5
           int          y2,
Packit Service fb6fa5
	   GdkColormap  *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint8 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef BIG
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
#endif	  
Packit Service fb6fa5
	  *o++ = R8fromRGB555 (data);
Packit Service fb6fa5
	  *o++ = G8fromRGB555 (data);
Packit Service fb6fa5
	  *o++ = B8fromRGB555 (data);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 15 bits/pixel data
Packit Service fb6fa5
 * no alpha
Packit Service fb6fa5
 * data in msb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb555msb (GdkImage    *image,
Packit Service fb6fa5
	   guchar      *pixels,
Packit Service fb6fa5
	   int          rowstride,
Packit Service fb6fa5
           int          x1,
Packit Service fb6fa5
           int          y1,
Packit Service fb6fa5
           int          x2,
Packit Service fb6fa5
           int          y2,
Packit Service fb6fa5
	   GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint8 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx ++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
#endif	  
Packit Service fb6fa5
	  *o++ = R8fromRGB555 (data);
Packit Service fb6fa5
	  *o++ = G8fromRGB555 (data);
Packit Service fb6fa5
	  *o++ = B8fromRGB555 (data);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 15 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 * data in lsb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb555alsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;	/* read 1 pixels at once */
Packit Service fb6fa5
  register guint32 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  *o++ = ABGR8888fromRGB555 (data);
Packit Service fb6fa5
#else
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
	  *o++ = RGBA8888fromRGB555 (data);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * convert 15 bits/pixel data
Packit Service fb6fa5
 * with alpha
Packit Service fb6fa5
 * data in msb format
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb555amsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  register guint16 *s;
Packit Service fb6fa5
  register guint32 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint16 *) srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  register guint32 data = *s++;
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  data = SWAP16 (data);
Packit Service fb6fa5
	  *o++ = ABGR8888fromRGB555 (data);
Packit Service fb6fa5
#else
Packit Service fb6fa5
	  *o++ = RGBA8888fromRGB555 (data);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb888alsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *s;	/* for byte order swapping */
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("32 bits/pixel with alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  /* lsb data */
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = srow;
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *o++ = s[2];
Packit Service fb6fa5
	  *o++ = s[1];
Packit Service fb6fa5
	  *o++ = s[0];
Packit Service fb6fa5
	  *o++ = 0xff;
Packit Service fb6fa5
	  s += 4;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb888lsb (GdkImage    *image,
Packit Service fb6fa5
	   guchar      *pixels,
Packit Service fb6fa5
	   int          rowstride,
Packit Service fb6fa5
           int          x1,
Packit Service fb6fa5
           int          y1,
Packit Service fb6fa5
           int          x2,
Packit Service fb6fa5
           int          y2,
Packit Service fb6fa5
	   GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
  guint8 *o, *s;
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("32 bit, lsb, no alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = srow;
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *o++ = s[2];
Packit Service fb6fa5
	  *o++ = s[1];
Packit Service fb6fa5
	  *o++ = s[0];
Packit Service fb6fa5
	  s += 4;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb888amsb (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
            int          x1,
Packit Service fb6fa5
            int          y1,
Packit Service fb6fa5
            int          x2,
Packit Service fb6fa5
            int          y2,
Packit Service fb6fa5
	    GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
  guint32 *o;
Packit Service fb6fa5
  guint32 *s;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("32 bit, msb, with alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  /* msb data */
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = (guint32 *) srow;
Packit Service fb6fa5
      o = (guint32 *) orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
#ifdef LITTLE
Packit Service fb6fa5
	  *o++ = (*s++ >> 8) | 0xff000000;
Packit Service fb6fa5
#else
Packit Service fb6fa5
	  *o++ = (*s++ << 8) | 0xff;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgb888msb (GdkImage    *image,
Packit Service fb6fa5
	   guchar      *pixels,
Packit Service fb6fa5
	   int          rowstride,
Packit Service fb6fa5
           int          x1,
Packit Service fb6fa5
           int          y1,
Packit Service fb6fa5
           int          x2,
Packit Service fb6fa5
           int          y2,
Packit Service fb6fa5
	   GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  int bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  guint8 *srow = (guint8*)image->mem + y1 * image->bpl + x1 * image->bpp, *orow = pixels;
Packit Service fb6fa5
  guint8 *s;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
Packit Service fb6fa5
  d (printf ("32 bit, msb, no alpha\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  bpl = image->bpl;
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      s = srow;
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  *o++ = s[1];
Packit Service fb6fa5
	  *o++ = s[2];
Packit Service fb6fa5
	  *o++ = s[3];
Packit Service fb6fa5
	  s += 4;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      srow += bpl;
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * This should work correctly with any display/any endianness, but will probably
Packit Service fb6fa5
 * run quite slow
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
convert_real_slow (GdkImage    *image,
Packit Service fb6fa5
		   guchar      *pixels,
Packit Service fb6fa5
		   int          rowstride,
Packit Service fb6fa5
                   int          x1,
Packit Service fb6fa5
                   int          y1,
Packit Service fb6fa5
                   int          x2,
Packit Service fb6fa5
                   int          y2,
Packit Service fb6fa5
		   GdkColormap *cmap,
Packit Service fb6fa5
		   gboolean     alpha)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int xx, yy;
Packit Service fb6fa5
  guint8 *orow = pixels;
Packit Service fb6fa5
  guint8 *o;
Packit Service fb6fa5
  guint32 pixel;
Packit Service fb6fa5
  GdkVisual *v;
Packit Service fb6fa5
  guint8 component;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  v = gdk_colormap_get_visual (cmap);
Packit Service fb6fa5
Packit Service fb6fa5
  if (image->depth != v->depth)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: The depth of the source image (%d) doesn't "
Packit Service fb6fa5
                 "match the depth of the colormap passed in (%d).",
Packit Service fb6fa5
                 G_STRLOC, image->depth, v->depth);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    } 
Packit Service fb6fa5
 
Packit Service fb6fa5
  d(printf("rgb  mask/shift/prec = %x:%x:%x %d:%d:%d  %d:%d:%d\n",
Packit Service fb6fa5
	   v->red_mask, v->green_mask, v->blue_mask,
Packit Service fb6fa5
	   v->red_shift, v->green_shift, v->blue_shift,
Packit Service fb6fa5
	   v->red_prec, v->green_prec, v->blue_prec));
Packit Service fb6fa5
Packit Service fb6fa5
  for (yy = y1; yy < y2; yy++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      o = orow;
Packit Service fb6fa5
      for (xx = x1; xx < x2; xx++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  pixel = gdk_image_get_pixel (image, xx, yy);
Packit Service fb6fa5
	  switch (v->type)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
				/* I assume this is right for static & greyscale's too? */
Packit Service fb6fa5
	    case GDK_VISUAL_STATIC_GRAY:
Packit Service fb6fa5
	    case GDK_VISUAL_GRAYSCALE:
Packit Service fb6fa5
	    case GDK_VISUAL_STATIC_COLOR:
Packit Service fb6fa5
	    case GDK_VISUAL_PSEUDO_COLOR:
Packit Service fb6fa5
	      *o++ = cmap->colors[pixel].red   >> 8; 
Packit Service fb6fa5
	      *o++ = cmap->colors[pixel].green >> 8;
Packit Service fb6fa5
	      *o++ = cmap->colors[pixel].blue  >> 8;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case GDK_VISUAL_TRUE_COLOR:
Packit Service fb6fa5
				/* This is odd because it must sometimes shift left (otherwise
Packit Service fb6fa5
				 * I'd just shift >> (*_shift - 8 + *_prec + <0-7>). This logic
Packit Service fb6fa5
				 * should work for all bit sizes/shifts/etc.
Packit Service fb6fa5
				 */
Packit Service fb6fa5
	      component = 0;
Packit Service fb6fa5
	      for (i = 24; i < 32; i += v->red_prec)
Packit Service fb6fa5
		component |= ((pixel & v->red_mask) << (32 - v->red_shift - v->red_prec)) >> i;
Packit Service fb6fa5
	      *o++ = component;
Packit Service fb6fa5
	      component = 0;
Packit Service fb6fa5
	      for (i = 24; i < 32; i += v->green_prec)
Packit Service fb6fa5
		component |= ((pixel & v->green_mask) << (32 - v->green_shift - v->green_prec)) >> i;
Packit Service fb6fa5
	      *o++ = component;
Packit Service fb6fa5
	      component = 0;
Packit Service fb6fa5
	      for (i = 24; i < 32; i += v->blue_prec)
Packit Service fb6fa5
		component |= ((pixel & v->blue_mask) << (32 - v->blue_shift - v->blue_prec)) >> i;
Packit Service fb6fa5
	      *o++ = component;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case GDK_VISUAL_DIRECT_COLOR:
Packit Service fb6fa5
	      *o++ = cmap->colors[((pixel & v->red_mask) << (32 - v->red_shift - v->red_prec)) >> 24].red >> 8;
Packit Service fb6fa5
	      *o++ = cmap->colors[((pixel & v->green_mask) << (32 - v->green_shift - v->green_prec)) >> 24].green >> 8;
Packit Service fb6fa5
	      *o++ = cmap->colors[((pixel & v->blue_mask) << (32 - v->blue_shift - v->blue_prec)) >> 24].blue >> 8;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  if (alpha)
Packit Service fb6fa5
	    *o++ = 0xff;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      orow += rowstride;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef void (* cfunc) (GdkImage    *image,
Packit Service fb6fa5
                        guchar      *pixels,
Packit Service fb6fa5
                        int          rowstride,
Packit Service fb6fa5
                        int          x1,
Packit Service fb6fa5
                        int          y1,
Packit Service fb6fa5
                        int          x2,
Packit Service fb6fa5
                        int          y2,
Packit Service fb6fa5
                        GdkColormap *cmap);
Packit Service fb6fa5
Packit Service fb6fa5
static const cfunc convert_map[] = {
Packit Service fb6fa5
  rgb1,rgb1,rgb1a,rgb1a,
Packit Service fb6fa5
  rgb8,rgb8,rgb8a,rgb8a,
Packit Service fb6fa5
  rgb555lsb,rgb555msb,rgb555alsb,rgb555amsb,
Packit Service fb6fa5
  rgb565lsb,rgb565msb,rgb565alsb,rgb565amsb,
Packit Service fb6fa5
  rgb888lsb,rgb888msb,rgb888alsb,rgb888amsb
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * perform actual conversion
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *  If we can, try and use the optimised code versions, but as a default
Packit Service fb6fa5
 * fallback, and always for direct colour, use the generic/slow but complete
Packit Service fb6fa5
 * conversion function.
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
rgbconvert (GdkImage    *image,
Packit Service fb6fa5
	    guchar      *pixels,
Packit Service fb6fa5
	    int          rowstride,
Packit Service fb6fa5
	    gboolean     alpha,
Packit Service fb6fa5
            int          x,
Packit Service fb6fa5
            int          y,
Packit Service fb6fa5
            int          width,
Packit Service fb6fa5
            int          height,
Packit Service fb6fa5
	    GdkColormap *cmap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int index;
Packit Service fb6fa5
  int bank;
Packit Service fb6fa5
  GdkVisual *v;
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert ((x + width) <= image->width);
Packit Service fb6fa5
  g_assert ((y + height) <= image->height);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (cmap == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Only allowed for bitmaps */
Packit Service fb6fa5
      g_return_if_fail (image->depth == 1);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (alpha)
Packit Service fb6fa5
        bitmap1a (image, pixels, rowstride,
Packit Service fb6fa5
                  x, y, x + width, y + height);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        bitmap1 (image, pixels, rowstride,
Packit Service fb6fa5
                  x, y, x + width, y + height);
Packit Service fb6fa5
      
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  v = gdk_colormap_get_visual (cmap);
Packit Service fb6fa5
Packit Service fb6fa5
  if (image->depth != v->depth)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: The depth of the source image (%d) doesn't "
Packit Service fb6fa5
                 "match the depth of the colormap passed in (%d).",
Packit Service fb6fa5
                 G_STRLOC, image->depth, v->depth);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    } 
Packit Service fb6fa5
 
Packit Service fb6fa5
  bank = 5; /* default fallback converter */
Packit Service fb6fa5
  index = (image->byte_order == GDK_MSB_FIRST) | (alpha != 0) << 1;
Packit Service fb6fa5
  
Packit Service fb6fa5
  d(printf("masks = %x:%x:%x\n", v->red_mask, v->green_mask, v->blue_mask));
Packit Service fb6fa5
  d(printf("image depth = %d, bits per pixel = %d\n", image->depth, image->bits_per_pixel));
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (v->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
				/* I assume this is right for static & greyscale's too? */
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_GRAY:
Packit Service fb6fa5
    case GDK_VISUAL_GRAYSCALE:
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_COLOR:
Packit Service fb6fa5
    case GDK_VISUAL_PSEUDO_COLOR:
Packit Service fb6fa5
      switch (image->bits_per_pixel)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case 1:
Packit Service fb6fa5
	  bank = 0;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case 8:
Packit Service fb6fa5
	  if (image->depth == 8)
Packit Service fb6fa5
	    bank = 1;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_VISUAL_TRUE_COLOR:
Packit Service fb6fa5
      switch (image->depth)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case 15:
Packit Service fb6fa5
	  if (v->red_mask == 0x7c00 && v->green_mask == 0x3e0 && v->blue_mask == 0x1f
Packit Service fb6fa5
	      && image->bits_per_pixel == 16)
Packit Service fb6fa5
	    bank = 2;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case 16:
Packit Service fb6fa5
	  if (v->red_mask == 0xf800 && v->green_mask == 0x7e0 && v->blue_mask == 0x1f
Packit Service fb6fa5
	      && image->bits_per_pixel == 16)
Packit Service fb6fa5
	    bank = 3;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case 24:
Packit Service fb6fa5
	case 32:
Packit Service fb6fa5
	  if (v->red_mask == 0xff0000 && v->green_mask == 0xff00 && v->blue_mask == 0xff
Packit Service fb6fa5
	      && image->bits_per_pixel == 32)
Packit Service fb6fa5
	    bank = 4;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case GDK_VISUAL_DIRECT_COLOR:
Packit Service fb6fa5
      /* always use the slow version */
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  d (g_print ("converting using conversion function in bank %d\n", bank));
Packit Service fb6fa5
Packit Service fb6fa5
  if (bank == 5)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      convert_real_slow (image, pixels, rowstride,
Packit Service fb6fa5
                         x, y, x + width, y + height,                         
Packit Service fb6fa5
                         cmap, alpha);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      index |= bank << 2;
Packit Service fb6fa5
      d (g_print ("converting with index %d\n", index));
Packit Service fb6fa5
      (* convert_map[index]) (image, pixels, rowstride,
Packit Service fb6fa5
                              x, y, x + width, y + height,
Packit Service fb6fa5
                              cmap);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* Exported functions */
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_pixbuf_get_from_drawable:
Packit Service fb6fa5
 * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf should be created.
Packit Service fb6fa5
 * @src: Source drawable.
Packit Service fb6fa5
 * @cmap: A colormap if @src doesn't have one set.
Packit Service fb6fa5
 * @src_x: Source X coordinate within drawable.
Packit Service fb6fa5
 * @src_y: Source Y coordinate within drawable.
Packit Service fb6fa5
 * @dest_x: Destination X coordinate in pixbuf, or 0 if @dest is NULL.
Packit Service fb6fa5
 * @dest_y: Destination Y coordinate in pixbuf, or 0 if @dest is NULL.
Packit Service fb6fa5
 * @width: Width in pixels of region to get.
Packit Service fb6fa5
 * @height: Height in pixels of region to get.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Transfers image data from a #GdkDrawable and converts it to an RGB(A)
Packit Service fb6fa5
 * representation inside a #GdkPixbuf. In other words, copies
Packit Service fb6fa5
 * image data from a server-side drawable to a client-side RGB(A) buffer.
Packit Service fb6fa5
 * This allows you to efficiently read individual pixels on the client side.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If the drawable @src has no colormap (gdk_drawable_get_colormap()
Packit Service fb6fa5
 * returns %NULL), then a suitable colormap must be specified.
Packit Service fb6fa5
 * Typically a #GdkWindow or a pixmap created by passing a #GdkWindow
Packit Service fb6fa5
 * to gdk_pixmap_new() will already have a colormap associated with
Packit Service fb6fa5
 * it.  If the drawable has a colormap, the @cmap argument will be
Packit Service fb6fa5
 * ignored.  If the drawable is a bitmap (1 bit per pixel pixmap),
Packit Service fb6fa5
 * then a colormap is not required; pixels with a value of 1 are
Packit Service fb6fa5
 * assumed to be white, and pixels with a value of 0 are assumed to be
Packit Service fb6fa5
 * black. For taking screenshots, gdk_colormap_get_system() returns
Packit Service fb6fa5
 * the correct colormap to use.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If the specified destination pixbuf @dest is %NULL, then this
Packit Service fb6fa5
 * function will create an RGB pixbuf with 8 bits per channel and no
Packit Service fb6fa5
 * alpha, with the same size specified by the @width and @height
Packit Service fb6fa5
 * arguments.  In this case, the @dest_x and @dest_y arguments must be
Packit Service fb6fa5
 * specified as 0.  If the specified destination pixbuf is not %NULL
Packit Service fb6fa5
 * and it contains alpha information, then the filled pixels will be
Packit Service fb6fa5
 * set to full opacity (alpha = 255).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If the specified drawable is a pixmap, then the requested source
Packit Service fb6fa5
 * rectangle must be completely contained within the pixmap, otherwise
Packit Service fb6fa5
 * the function will return %NULL. For pixmaps only (not for windows)
Packit Service fb6fa5
 * passing -1 for width or height is allowed to mean the full width
Packit Service fb6fa5
 * or height of the pixmap.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If the specified drawable is a window, and the window is off the
Packit Service fb6fa5
 * screen, then there is no image data in the obscured/offscreen
Packit Service fb6fa5
 * regions to be placed in the pixbuf. The contents of portions of the
Packit Service fb6fa5
 * pixbuf corresponding to the offscreen region are undefined.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If the window you're obtaining data from is partially obscured by
Packit Service fb6fa5
 * other windows, then the contents of the pixbuf areas corresponding
Packit Service fb6fa5
 * to the obscured regions are undefined.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If the target drawable is not mapped (typically because it's
Packit Service fb6fa5
 * iconified/minimized or not on the current workspace), then %NULL
Packit Service fb6fa5
 * will be returned.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If memory can't be allocated for the return value, %NULL will be returned
Packit Service fb6fa5
 * instead.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * (In short, there are several ways this function can fail, and if it fails
Packit Service fb6fa5
 *  it returns %NULL; so check the return value.)
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function calls gdk_drawable_get_image() internally and
Packit Service fb6fa5
 * converts the resulting image to a #GdkPixbuf, so the
Packit Service fb6fa5
 * documentation for gdk_drawable_get_image() may also be relevant.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: The same pixbuf as @dest if it was non-%NULL, or a newly-created
Packit Service fb6fa5
 * pixbuf with a reference count of 1 if no destination pixbuf was specified, or %NULL on error
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkPixbuf *
Packit Service fb6fa5
gdk_pixbuf_get_from_drawable (GdkPixbuf   *dest,
Packit Service fb6fa5
			      GdkDrawable *src,
Packit Service fb6fa5
			      GdkColormap *cmap,
Packit Service fb6fa5
			      int src_x,  int src_y,
Packit Service fb6fa5
			      int dest_x, int dest_y,
Packit Service fb6fa5
			      int width,  int height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int src_width, src_height;
Packit Service fb6fa5
  GdkImage *image;
Packit Service fb6fa5
  int depth;
Packit Service fb6fa5
  int x0, y0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* General sanity checks */
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (src != NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (GDK_IS_WINDOW (src))
Packit Service fb6fa5
    /* FIXME: this is not perfect, since is_viewable() only tests
Packit Service fb6fa5
     * recursively up the Gdk parent window tree, but stops at
Packit Service fb6fa5
     * foreign windows or Gdk toplevels.  I.e. if a window manager
Packit Service fb6fa5
     * unmapped one of its own windows, this won't work.
Packit Service fb6fa5
     */
Packit Service fb6fa5
    g_return_val_if_fail (gdk_window_is_viewable (src), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!dest)
Packit Service fb6fa5
    g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
Packit Service fb6fa5
                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (cmap == NULL)
Packit Service fb6fa5
    cmap = gdk_drawable_get_colormap (src);
Packit Service fb6fa5
Packit Service fb6fa5
  depth = gdk_drawable_get_depth (src);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (depth != 1 && cmap == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: Source drawable has no colormap; either pass "
Packit Service fb6fa5
                 "in a colormap, or set the colormap on the drawable "
Packit Service fb6fa5
                 "with gdk_drawable_set_colormap()", G_STRLOC);
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (cmap != NULL && depth != cmap->visual->depth)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: Depth of the source drawable is %d where as "
Packit Service fb6fa5
                 "the visual depth of the colormap passed is %d",
Packit Service fb6fa5
                 G_STRLOC, depth, cmap->visual->depth);
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    } 
Packit Service fb6fa5
 
Packit Service fb6fa5
  /* Coordinate sanity checks */
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (GDK_IS_PIXMAP (src))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_drawable_get_size (src, &src_width, &src_height);
Packit Service fb6fa5
      if (width < 0)
Packit Service fb6fa5
        width = src_width;
Packit Service fb6fa5
      if (height < 0)
Packit Service fb6fa5
        height = src_height;
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_return_val_if_fail (src_x >= 0 && src_y >= 0, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (src_x + width <= src_width && src_y + height <= src_height, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Create the pixbuf if needed */
Packit Service fb6fa5
  if (!dest)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
Packit Service fb6fa5
      if (dest == NULL)
Packit Service fb6fa5
        return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (dest)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_return_val_if_fail (dest_x >= 0 && dest_y >= 0, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (dest_x + width <= gdk_pixbuf_get_width (dest), NULL);
Packit Service fb6fa5
      g_return_val_if_fail (dest_y + height <= gdk_pixbuf_get_height (dest), NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
Packit Service fb6fa5
      for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gint xs0, ys0;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  image = _gdk_image_get_scratch (gdk_drawable_get_screen (src), 
Packit Service fb6fa5
					  width1, height1, depth, &xs0, &ys0;;
Packit Service fb6fa5
Packit Service fb6fa5
	  gdk_drawable_copy_to_image (src, image,
Packit Service fb6fa5
				      src_x + x0, src_y + y0,
Packit Service fb6fa5
				       xs0, ys0, width1, height1);
Packit Service fb6fa5
Packit Service fb6fa5
	  gdk_pixbuf_get_from_image (dest, image, cmap,
Packit Service fb6fa5
				     xs0, ys0, dest_x + x0, dest_y + y0,
Packit Service fb6fa5
				     width1, height1);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return dest;
Packit Service fb6fa5
}
Packit Service fb6fa5
        
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_pixbuf_get_from_image:
Packit Service fb6fa5
 * @dest: (allow-none): Destination pixbuf, or %NULL if a new pixbuf should be created.
Packit Service fb6fa5
 * @src: Source #GdkImage.
Packit Service fb6fa5
 * @cmap: (allow-none): A colormap, or %NULL to use the one for @src
Packit Service fb6fa5
 * @src_x: Source X coordinate within drawable.
Packit Service fb6fa5
 * @src_y: Source Y coordinate within drawable.
Packit Service fb6fa5
 * @dest_x: Destination X coordinate in pixbuf, or 0 if @dest is NULL.
Packit Service fb6fa5
 * @dest_y: Destination Y coordinate in pixbuf, or 0 if @dest is NULL.
Packit Service fb6fa5
 * @width: Width in pixels of region to get.
Packit Service fb6fa5
 * @height: Height in pixels of region to get.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Same as gdk_pixbuf_get_from_drawable() but gets the pixbuf from
Packit Service fb6fa5
 * an image.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: @dest, newly-created pixbuf if @dest was %NULL, %NULL on error
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkPixbuf*
Packit Service fb6fa5
gdk_pixbuf_get_from_image (GdkPixbuf   *dest,
Packit Service fb6fa5
                           GdkImage    *src,
Packit Service fb6fa5
                           GdkColormap *cmap,
Packit Service fb6fa5
                           int          src_x,
Packit Service fb6fa5
                           int          src_y,
Packit Service fb6fa5
                           int          dest_x,
Packit Service fb6fa5
                           int          dest_y,
Packit Service fb6fa5
                           int          width,
Packit Service fb6fa5
                           int          height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int rowstride, bpp, alpha;
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* General sanity checks */
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_IMAGE (src), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!dest)
Packit Service fb6fa5
    g_return_val_if_fail (dest_x == 0 && dest_y == 0, NULL);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_colorspace (dest) == GDK_COLORSPACE_RGB, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_n_channels (dest) == 3 ||
Packit Service fb6fa5
                            gdk_pixbuf_get_n_channels (dest) == 4, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (dest) == 8, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (cmap == NULL)
Packit Service fb6fa5
    cmap = gdk_image_get_colormap (src);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (src->depth != 1 && cmap == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: Source image has no colormap; either pass "
Packit Service fb6fa5
                 "in a colormap, or set the colormap on the image "
Packit Service fb6fa5
                 "with gdk_image_set_colormap()", G_STRLOC);
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (cmap != NULL && src->depth != cmap->visual->depth)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: Depth of the Source image is %d where as "
Packit Service fb6fa5
                 "the visual depth of the colormap passed is %d",
Packit Service fb6fa5
                 G_STRLOC, src->depth, cmap->visual->depth);
Packit Service fb6fa5
      return NULL;
Packit Service fb6fa5
    } 
Packit Service fb6fa5
 
Packit Service fb6fa5
  /* Coordinate sanity checks */
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (src_x >= 0 && src_y >= 0, NULL);
Packit Service fb6fa5
  g_return_val_if_fail (src_x + width <= src->width && src_y + height <= src->height, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (dest)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_return_val_if_fail (dest_x >= 0 && dest_y >= 0, NULL);
Packit Service fb6fa5
      g_return_val_if_fail (dest_x + width <= gdk_pixbuf_get_width (dest), NULL);
Packit Service fb6fa5
      g_return_val_if_fail (dest_y + height <= gdk_pixbuf_get_height (dest), NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Create the pixbuf if needed */
Packit Service fb6fa5
  if (!dest)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      dest = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
Packit Service fb6fa5
      if (dest == NULL)
Packit Service fb6fa5
        return NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  alpha = gdk_pixbuf_get_has_alpha (dest);
Packit Service fb6fa5
  rowstride = gdk_pixbuf_get_rowstride (dest);
Packit Service fb6fa5
  bpp = alpha ? 4 : 3;
Packit Service fb6fa5
Packit Service fb6fa5
  /* we offset into the image data based on the position we are
Packit Service fb6fa5
   * retrieving from
Packit Service fb6fa5
   */
Packit Service fb6fa5
  rgbconvert (src, gdk_pixbuf_get_pixels (dest) +
Packit Service fb6fa5
	      (dest_y * rowstride) + (dest_x * bpp),
Packit Service fb6fa5
	      rowstride,
Packit Service fb6fa5
	      alpha,
Packit Service fb6fa5
              src_x, src_y,
Packit Service fb6fa5
              width,
Packit Service fb6fa5
              height,
Packit Service fb6fa5
	      cmap);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return dest;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GDK_PIXBUF_DRAWABLE_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"