Blame gdk/gdkdraw.c

Packit 98cdb6
/* GDK - The GIMP Drawing Kit
Packit 98cdb6
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Lesser General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Lesser General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Lesser General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit 98cdb6
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit 98cdb6
 * files for a list of changes.  These files are distributed with
Packit 98cdb6
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include "config.h"
Packit 98cdb6
#include <math.h>
Packit 98cdb6
#include <pango/pangocairo.h>
Packit 98cdb6
#include <gdk-pixbuf/gdk-pixbuf.h>
Packit 98cdb6
#include "gdkcairo.h"
Packit 98cdb6
#include "gdkdrawable.h"
Packit 98cdb6
#include "gdkinternals.h"
Packit 98cdb6
#include "gdkwindow.h"
Packit 98cdb6
#include "gdkscreen.h"
Packit 98cdb6
#include "gdkpixbuf.h"
Packit 98cdb6
#include "gdkalias.h"
Packit 98cdb6
Packit 98cdb6
static GdkImage*    gdk_drawable_real_get_image (GdkDrawable     *drawable,
Packit 98cdb6
						 gint             x,
Packit 98cdb6
						 gint             y,
Packit 98cdb6
						 gint             width,
Packit 98cdb6
						 gint             height);
Packit 98cdb6
static GdkDrawable* gdk_drawable_real_get_composite_drawable (GdkDrawable  *drawable,
Packit 98cdb6
							      gint          x,
Packit 98cdb6
							      gint          y,
Packit 98cdb6
							      gint          width,
Packit 98cdb6
							      gint          height,
Packit 98cdb6
							      gint         *composite_x_offset,
Packit 98cdb6
							      gint         *composite_y_offset);
Packit 98cdb6
static GdkRegion *  gdk_drawable_real_get_visible_region     (GdkDrawable  *drawable);
Packit 98cdb6
static void         gdk_drawable_real_draw_pixbuf            (GdkDrawable  *drawable,
Packit 98cdb6
							      GdkGC        *gc,
Packit 98cdb6
							      GdkPixbuf    *pixbuf,
Packit 98cdb6
							      gint          src_x,
Packit 98cdb6
							      gint          src_y,
Packit 98cdb6
							      gint          dest_x,
Packit 98cdb6
							      gint          dest_y,
Packit 98cdb6
							      gint          width,
Packit 98cdb6
							      gint          height,
Packit 98cdb6
							      GdkRgbDither  dither,
Packit 98cdb6
							      gint          x_dither,
Packit 98cdb6
							      gint          y_dither);
Packit 98cdb6
static void         gdk_drawable_real_draw_drawable          (GdkDrawable  *drawable,
Packit 98cdb6
							      GdkGC	   *gc,
Packit 98cdb6
							      GdkDrawable  *src,
Packit 98cdb6
							      gint          xsrc,
Packit 98cdb6
							      gint	    ysrc,
Packit 98cdb6
							      gint	    xdest,
Packit 98cdb6
							      gint	    ydest,
Packit 98cdb6
							      gint	    width,
Packit 98cdb6
							      gint	    height);
Packit 98cdb6
     
Packit 98cdb6
Packit 98cdb6
G_DEFINE_ABSTRACT_TYPE (GdkDrawable, gdk_drawable, G_TYPE_OBJECT)
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_drawable_class_init (GdkDrawableClass *klass)
Packit 98cdb6
{
Packit 98cdb6
  klass->get_image = gdk_drawable_real_get_image;
Packit 98cdb6
  klass->get_composite_drawable = gdk_drawable_real_get_composite_drawable;
Packit 98cdb6
  /* Default implementation for clip and visible region is the same */
Packit 98cdb6
  klass->get_clip_region = gdk_drawable_real_get_visible_region;
Packit 98cdb6
  klass->get_visible_region = gdk_drawable_real_get_visible_region;
Packit 98cdb6
  klass->draw_pixbuf = gdk_drawable_real_draw_pixbuf;
Packit 98cdb6
  klass->draw_drawable = gdk_drawable_real_draw_drawable;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_drawable_init (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Manipulation of drawables
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_set_data:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @key: name to store the data under
Packit 98cdb6
 * @data: arbitrary data
Packit 98cdb6
 * @destroy_func: (allow-none): function to free @data, or %NULL
Packit 98cdb6
 *
Packit 98cdb6
 * This function is equivalent to g_object_set_data(),
Packit 98cdb6
 * the #GObject variant should be used instead.
Packit 98cdb6
 * 
Packit 98cdb6
 **/
Packit 98cdb6
void          
Packit 98cdb6
gdk_drawable_set_data (GdkDrawable   *drawable,
Packit 98cdb6
		       const gchar   *key,
Packit 98cdb6
		       gpointer	      data,
Packit 98cdb6
		       GDestroyNotify destroy_func)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  
Packit 98cdb6
  g_object_set_qdata_full (G_OBJECT (drawable),
Packit 98cdb6
                           g_quark_from_string (key),
Packit 98cdb6
                           data,
Packit 98cdb6
                           destroy_func);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_data:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @key: name the data was stored under
Packit 98cdb6
 * 
Packit 98cdb6
 * Equivalent to g_object_get_data(); the #GObject variant should be
Packit 98cdb6
 * used instead.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: the data stored at @key
Packit 98cdb6
 **/
Packit 98cdb6
gpointer
Packit 98cdb6
gdk_drawable_get_data (GdkDrawable   *drawable,
Packit 98cdb6
		       const gchar   *key)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
  
Packit 98cdb6
  return g_object_get_qdata (G_OBJECT (drawable),
Packit 98cdb6
                             g_quark_try_string (key));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_size:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @width: (out) (allow-none): location to store drawable's width, or %NULL
Packit 98cdb6
 * @height: (out) (allow-none): location to store drawable's height, or %NULL
Packit 98cdb6
 *
Packit 98cdb6
 * Fills *@width and *@height with the size of @drawable.
Packit 98cdb6
 * @width or @height can be %NULL if you only want the other one.
Packit 98cdb6
 *
Packit 98cdb6
 * On the X11 platform, if @drawable is a #GdkWindow, the returned
Packit 98cdb6
 * size is the size reported in the most-recently-processed configure
Packit 98cdb6
 * event, rather than the current size on the X server.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.24: Use gdk_window_get_width() and gdk_window_get_height() for
Packit 98cdb6
 *             #GdkWindows. Use gdk_pixmap_get_size() for #GdkPixmaps.
Packit 98cdb6
 */
Packit 98cdb6
void
Packit 98cdb6
gdk_drawable_get_size (GdkDrawable *drawable,
Packit 98cdb6
		       gint        *width,
Packit 98cdb6
		       gint        *height)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->get_size (drawable, width, height);  
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_visual:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Gets the #GdkVisual describing the pixel format of @drawable.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: a #GdkVisual
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.24: Use gdk_window_get_visual()
Packit 98cdb6
 */
Packit 98cdb6
GdkVisual*
Packit 98cdb6
gdk_drawable_get_visual (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
  
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_visual (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_depth:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Obtains the bit depth of the drawable, that is, the number of bits
Packit 98cdb6
 * that make up a pixel in the drawable's visual. Examples are 8 bits
Packit 98cdb6
 * per pixel, 24 bits per pixel, etc.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: number of bits per pixel
Packit 98cdb6
 **/
Packit 98cdb6
gint
Packit 98cdb6
gdk_drawable_get_depth (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), 0);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_depth (drawable);
Packit 98cdb6
}
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_screen:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Gets the #GdkScreen associated with a #GdkDrawable.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: the #GdkScreen associated with @drawable
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.24: Use gdk_window_get_screen() instead
Packit 98cdb6
 **/
Packit 98cdb6
GdkScreen*
Packit 98cdb6
gdk_drawable_get_screen (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_screen (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_display:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Gets the #GdkDisplay associated with a #GdkDrawable.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: the #GdkDisplay associated with @drawable
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.24: Use gdk_window_get_display() instead
Packit 98cdb6
 **/
Packit 98cdb6
GdkDisplay*
Packit 98cdb6
gdk_drawable_get_display (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return gdk_screen_get_display (gdk_drawable_get_screen (drawable));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_set_colormap:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @colormap: a #GdkColormap
Packit 98cdb6
 *
Packit 98cdb6
 * Sets the colormap associated with @drawable. Normally this will
Packit 98cdb6
 * happen automatically when the drawable is created; you only need to
Packit 98cdb6
 * use this function if the drawable-creating function did not have a
Packit 98cdb6
 * way to determine the colormap, and you then use drawable operations
Packit 98cdb6
 * that require a colormap. The colormap for all drawables and
Packit 98cdb6
 * graphics contexts you intend to use together should match. i.e.
Packit 98cdb6
 * when using a #GdkGC to draw to a drawable, or copying one drawable
Packit 98cdb6
 * to another, the colormaps should match.
Packit 98cdb6
 * 
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_drawable_set_colormap (GdkDrawable *drawable,
Packit 98cdb6
                           GdkColormap *cmap)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (cmap == NULL || gdk_drawable_get_depth (drawable)
Packit 98cdb6
                    == cmap->visual->depth);
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->set_colormap (drawable, cmap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_colormap:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Gets the colormap for @drawable, if one is set; returns
Packit 98cdb6
 * %NULL otherwise.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: the colormap, or %NULL
Packit 98cdb6
 **/
Packit 98cdb6
GdkColormap*
Packit 98cdb6
gdk_drawable_get_colormap (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_colormap (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_ref:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated equivalent of calling g_object_ref() on @drawable.
Packit 98cdb6
 * (Drawables were not objects in previous versions of GDK.)
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: the same @drawable passed in
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.0: Use g_object_ref() instead.
Packit 98cdb6
 **/
Packit 98cdb6
GdkDrawable*
Packit 98cdb6
gdk_drawable_ref (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  return (GdkDrawable *) g_object_ref (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_unref:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated equivalent of calling g_object_unref() on @drawable.
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated: 2.0: Use g_object_unref() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_drawable_unref (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
Packit 98cdb6
  g_object_unref (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Drawing
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_point:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @x: the x coordinate of the point.
Packit 98cdb6
 * @y: the y coordinate of the point.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a point, using the foreground color and other attributes of 
Packit 98cdb6
 * the #GdkGC.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_rectangle() and cairo_fill() or 
Packit 98cdb6
 * cairo_move_to() and cairo_stroke() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_point (GdkDrawable *drawable,
Packit 98cdb6
                GdkGC       *gc,
Packit 98cdb6
                gint         x,
Packit 98cdb6
                gint         y)
Packit 98cdb6
{
Packit 98cdb6
  GdkPoint point;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  point.x = x;
Packit 98cdb6
  point.y = y;
Packit 98cdb6
  
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_points (drawable, gc, &point, 1);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_line:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap). 
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @x1_: the x coordinate of the start point.
Packit 98cdb6
 * @y1_: the y coordinate of the start point.
Packit 98cdb6
 * @x2_: the x coordinate of the end point.
Packit 98cdb6
 * @y2_: the y coordinate of the end point.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a line, using the foreground color and other attributes of 
Packit 98cdb6
 * the #GdkGC.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_line_to() and cairo_stroke() instead.
Packit 98cdb6
 * Be aware that the default line width in Cairo is 2 pixels and that your
Packit 98cdb6
 * coordinates need to describe the center of the line. To draw a single
Packit 98cdb6
 * pixel wide pixel-aligned line, you would use:
Packit 98cdb6
 * |[cairo_set_line_width (cr, 1.0);
Packit 98cdb6
 * cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
Packit 98cdb6
 * cairo_move_to (cr, 0.5, 0.5);
Packit 98cdb6
 * cairo_line_to (cr, 9.5, 0.5);
Packit 98cdb6
 * cairo_stroke (cr);]|
Packit 98cdb6
 * See also <ulink url="http://cairographics.org/FAQ/#sharp_lines">the Cairo
Packit 98cdb6
 * FAQ</ulink> on this topic.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_line (GdkDrawable *drawable,
Packit 98cdb6
	       GdkGC       *gc,
Packit 98cdb6
	       gint         x1,
Packit 98cdb6
	       gint         y1,
Packit 98cdb6
	       gint         x2,
Packit 98cdb6
	       gint         y2)
Packit 98cdb6
{
Packit 98cdb6
  GdkSegment segment;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  segment.x1 = x1;
Packit 98cdb6
  segment.y1 = y1;
Packit 98cdb6
  segment.x2 = x2;
Packit 98cdb6
  segment.y2 = y2;
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_segments (drawable, gc, &segment, 1);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_rectangle:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @filled: %TRUE if the rectangle should be filled.
Packit 98cdb6
 * @x: the x coordinate of the left edge of the rectangle.
Packit 98cdb6
 * @y: the y coordinate of the top edge of the rectangle.
Packit 98cdb6
 * @width: the width of the rectangle.
Packit 98cdb6
 * @height: the height of the rectangle.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a rectangular outline or filled rectangle, using the foreground color
Packit 98cdb6
 * and other attributes of the #GdkGC.
Packit 98cdb6
 *
Packit 98cdb6
 * A rectangle drawn filled is 1 pixel smaller in both dimensions than a 
Packit 98cdb6
 * rectangle outlined. Calling 
Packit 98cdb6
 * <literal>gdk_draw_rectangle (window, gc, TRUE, 0, 0, 20, 20)</literal> 
Packit 98cdb6
 * results in a filled rectangle 20 pixels wide and 20 pixels high. Calling
Packit 98cdb6
 * <literal>gdk_draw_rectangle (window, gc, FALSE, 0, 0, 20, 20)</literal> 
Packit 98cdb6
 * results in an outlined rectangle with corners at (0, 0), (0, 20), (20, 20),
Packit 98cdb6
 * and (20, 0), which makes it 21 pixels wide and 21 pixels high.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_rectangle() and cairo_fill() or cairo_stroke()
Packit 98cdb6
 * instead. For stroking, the same caveats for converting code apply as for
Packit 98cdb6
 * gdk_draw_line().
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_rectangle (GdkDrawable *drawable,
Packit 98cdb6
		    GdkGC       *gc,
Packit 98cdb6
		    gboolean     filled,
Packit 98cdb6
		    gint         x,
Packit 98cdb6
		    gint         y,
Packit 98cdb6
		    gint         width,
Packit 98cdb6
		    gint         height)
Packit 98cdb6
{  
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  if (width < 0 || height < 0)
Packit 98cdb6
    {
Packit 98cdb6
      gint real_width;
Packit 98cdb6
      gint real_height;
Packit 98cdb6
      
Packit 98cdb6
      gdk_drawable_get_size (drawable, &real_width, &real_height);
Packit 98cdb6
Packit 98cdb6
      if (width < 0)
Packit 98cdb6
        width = real_width;
Packit 98cdb6
      if (height < 0)
Packit 98cdb6
        height = real_height;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_rectangle (drawable, gc, filled, x, y,
Packit 98cdb6
                                                     width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_arc:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @filled: %TRUE if the arc should be filled, producing a 'pie slice'.
Packit 98cdb6
 * @x: the x coordinate of the left edge of the bounding rectangle.
Packit 98cdb6
 * @y: the y coordinate of the top edge of the bounding rectangle.
Packit 98cdb6
 * @width: the width of the bounding rectangle.
Packit 98cdb6
 * @height: the height of the bounding rectangle.
Packit 98cdb6
 * @angle1: the start angle of the arc, relative to the 3 o'clock position,
Packit 98cdb6
 *     counter-clockwise, in 1/64ths of a degree.
Packit 98cdb6
 * @angle2: the end angle of the arc, relative to @angle1, in 1/64ths 
Packit 98cdb6
 *     of a degree.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws an arc or a filled 'pie slice'. The arc is defined by the bounding
Packit 98cdb6
 * rectangle of the entire ellipse, and the start and end angles of the part 
Packit 98cdb6
 * of the ellipse to be drawn.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_arc() and cairo_fill() or cairo_stroke()
Packit 98cdb6
 * instead. Note that arcs just like any drawing operation in Cairo are
Packit 98cdb6
 * antialiased unless you call cairo_set_antialias().
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_arc (GdkDrawable *drawable,
Packit 98cdb6
	      GdkGC       *gc,
Packit 98cdb6
	      gboolean     filled,
Packit 98cdb6
	      gint         x,
Packit 98cdb6
	      gint         y,
Packit 98cdb6
	      gint         width,
Packit 98cdb6
	      gint         height,
Packit 98cdb6
	      gint         angle1,
Packit 98cdb6
	      gint         angle2)
Packit 98cdb6
{  
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  if (width < 0 || height < 0)
Packit 98cdb6
    {
Packit 98cdb6
      gint real_width;
Packit 98cdb6
      gint real_height;
Packit 98cdb6
      
Packit 98cdb6
      gdk_drawable_get_size (drawable, &real_width, &real_height);
Packit 98cdb6
Packit 98cdb6
      if (width < 0)
Packit 98cdb6
        width = real_width;
Packit 98cdb6
      if (height < 0)
Packit 98cdb6
        height = real_height;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_arc (drawable, gc, filled,
Packit 98cdb6
                                               x, y, width, height, angle1, angle2);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_polygon:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @filled: %TRUE if the polygon should be filled. The polygon is closed
Packit 98cdb6
 *     automatically, connecting the last point to the first point if 
Packit 98cdb6
 *     necessary.
Packit 98cdb6
 * @points: an array of #GdkPoint structures specifying the points making 
Packit 98cdb6
 *     up the polygon.
Packit 98cdb6
 * @n_points: the number of points.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws an outlined or filled polygon.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_line_to() or cairo_append_path() and
Packit 98cdb6
 * cairo_fill() or cairo_stroke() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_polygon (GdkDrawable    *drawable,
Packit 98cdb6
		  GdkGC          *gc,
Packit 98cdb6
		  gboolean        filled,
Packit 98cdb6
		  const GdkPoint *points,
Packit 98cdb6
		  gint            n_points)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_polygon (drawable, gc, filled,
Packit 98cdb6
                                                   (GdkPoint *) points,
Packit 98cdb6
                                                   n_points);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* gdk_draw_string
Packit 98cdb6
 *
Packit 98cdb6
 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
Packit 98cdb6
 *
Packit 98cdb6
 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
Packit 98cdb6
 */
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_string:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @font: a #GdkFont.
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @x: the x coordinate of the left edge of the text.
Packit 98cdb6
 * @y: the y coordinate of the baseline of the text.
Packit 98cdb6
 * @string:  the string of characters to draw.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a string of characters in the given font or fontset.
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated: 2.4: Use gdk_draw_layout() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_string (GdkDrawable *drawable,
Packit 98cdb6
		 GdkFont     *font,
Packit 98cdb6
		 GdkGC       *gc,
Packit 98cdb6
		 gint         x,
Packit 98cdb6
		 gint         y,
Packit 98cdb6
		 const gchar *string)
Packit 98cdb6
{
Packit 98cdb6
  gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* gdk_draw_text
Packit 98cdb6
 *
Packit 98cdb6
 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
Packit 98cdb6
 *
Packit 98cdb6
 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
Packit 98cdb6
 */
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_text:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @font: a #GdkFont.
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @x: the x coordinate of the left edge of the text.
Packit 98cdb6
 * @y: the y coordinate of the baseline of the text.
Packit 98cdb6
 * @text:  the characters to draw.
Packit 98cdb6
 * @text_length: the number of characters of @text to draw.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a number of characters in the given font or fontset.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.4: Use gdk_draw_layout() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_text (GdkDrawable *drawable,
Packit 98cdb6
	       GdkFont     *font,
Packit 98cdb6
	       GdkGC       *gc,
Packit 98cdb6
	       gint         x,
Packit 98cdb6
	       gint         y,
Packit 98cdb6
	       const gchar *text,
Packit 98cdb6
	       gint         text_length)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (font != NULL);
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (text != NULL);
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_text (drawable, font, gc, x, y, text, text_length);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_text_wc:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @font: a #GdkFont.
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @x: the x coordinate of the left edge of the text.
Packit 98cdb6
 * @y: the y coordinate of the baseline of the text.
Packit 98cdb6
 * @text: the wide characters to draw.
Packit 98cdb6
 * @text_length: the number of characters to draw.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a number of wide characters using the given font of fontset.
Packit 98cdb6
 * If the font is a 1-byte font, the string is converted into 1-byte 
Packit 98cdb6
 * characters (discarding the high bytes) before output.
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated: 2.4: Use gdk_draw_layout() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_text_wc (GdkDrawable	 *drawable,
Packit 98cdb6
		  GdkFont	 *font,
Packit 98cdb6
		  GdkGC		 *gc,
Packit 98cdb6
		  gint		  x,
Packit 98cdb6
		  gint		  y,
Packit 98cdb6
		  const GdkWChar *text,
Packit 98cdb6
		  gint		  text_length)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (font != NULL);
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (text != NULL);
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_text_wc (drawable, font, gc, x, y, text, text_length);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_drawable:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @gc: a #GdkGC sharing the drawable's visual and colormap
Packit 98cdb6
 * @src: the source #GdkDrawable, which may be the same as @drawable
Packit 98cdb6
 * @xsrc: X position in @src of rectangle to draw
Packit 98cdb6
 * @ysrc: Y position in @src of rectangle to draw
Packit 98cdb6
 * @xdest: X position in @drawable where the rectangle should be drawn
Packit 98cdb6
 * @ydest: Y position in @drawable where the rectangle should be drawn
Packit 98cdb6
 * @width: width of rectangle to draw, or -1 for entire @src width
Packit 98cdb6
 * @height: height of rectangle to draw, or -1 for entire @src height
Packit 98cdb6
 *
Packit 98cdb6
 * Copies the @width x @height region of @src at coordinates (@xsrc,
Packit 98cdb6
 * @ysrc) to coordinates (@xdest, @ydest) in @drawable.
Packit 98cdb6
 * @width and/or @height may be given as -1, in which case the entire
Packit 98cdb6
 * @src drawable will be copied.
Packit 98cdb6
 *
Packit 98cdb6
 * Most fields in @gc are not used for this operation, but notably the
Packit 98cdb6
 * clip mask or clip region will be honored.
Packit 98cdb6
 *
Packit 98cdb6
 * The source and destination drawables must have the same visual and
Packit 98cdb6
 * colormap, or errors will result. (On X11, failure to match
Packit 98cdb6
 * visual/colormap results in a BadMatch error from the X server.)
Packit 98cdb6
 * A common cause of this problem is an attempt to draw a bitmap to
Packit 98cdb6
 * a color drawable. The way to draw a bitmap is to set the bitmap as 
Packit 98cdb6
 * the stipple on the #GdkGC, set the fill mode to %GDK_STIPPLED, and 
Packit 98cdb6
 * then draw the rectangle.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use gdk_cairo_set_source_pixmap(), cairo_rectangle()
Packit 98cdb6
 * and cairo_fill() to draw pixmap on top of other drawables. Also keep
Packit 98cdb6
 * in mind that the limitations on allowed sources do not apply to Cairo.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_drawable (GdkDrawable *drawable,
Packit 98cdb6
		   GdkGC       *gc,
Packit 98cdb6
		   GdkDrawable *src,
Packit 98cdb6
		   gint         xsrc,
Packit 98cdb6
		   gint         ysrc,
Packit 98cdb6
		   gint         xdest,
Packit 98cdb6
		   gint         ydest,
Packit 98cdb6
		   gint         width,
Packit 98cdb6
		   gint         height)
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawable *composite;
Packit 98cdb6
  gint composite_x_offset = 0;
Packit 98cdb6
  gint composite_y_offset = 0;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (src));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  if (width < 0 || height < 0)
Packit 98cdb6
    {
Packit 98cdb6
      gint real_width;
Packit 98cdb6
      gint real_height;
Packit 98cdb6
      
Packit 98cdb6
      gdk_drawable_get_size (src, &real_width, &real_height);
Packit 98cdb6
Packit 98cdb6
      if (width < 0)
Packit 98cdb6
        width = real_width;
Packit 98cdb6
      if (height < 0)
Packit 98cdb6
        height = real_height;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  composite =
Packit 98cdb6
    GDK_DRAWABLE_GET_CLASS (src)->get_composite_drawable (src,
Packit 98cdb6
                                                          xsrc, ysrc,
Packit 98cdb6
                                                          width, height,
Packit 98cdb6
                                                          &composite_x_offset,
Packit 98cdb6
                                                          &composite_y_offset);
Packit 98cdb6
Packit 98cdb6
  /* TODO: For non-native windows this may copy stuff from other overlapping
Packit 98cdb6
     windows. We should clip that and (for windows with bg != None) clear that
Packit 98cdb6
     area in the destination instead. */
Packit 98cdb6
Packit 98cdb6
  if (GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src)
Packit 98cdb6
    GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src (drawable, gc,
Packit 98cdb6
							       composite,
Packit 98cdb6
							       xsrc - composite_x_offset,
Packit 98cdb6
							       ysrc - composite_y_offset,
Packit 98cdb6
							       xdest, ydest,
Packit 98cdb6
							       width, height,
Packit 98cdb6
							       src);
Packit 98cdb6
  else /* backwards compat for old out-of-tree implementations of GdkDrawable (are there any?) */
Packit 98cdb6
    GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc,
Packit 98cdb6
						      composite,
Packit 98cdb6
						      xsrc - composite_x_offset,
Packit 98cdb6
						      ysrc - composite_y_offset,
Packit 98cdb6
						      xdest, ydest,
Packit 98cdb6
						      width, height);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (composite);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_image:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @image: the #GdkImage to draw.
Packit 98cdb6
 * @xsrc: the left edge of the source rectangle within @image.
Packit 98cdb6
 * @ysrc: the top of the source rectangle within @image.
Packit 98cdb6
 * @xdest: the x coordinate of the destination within @drawable.
Packit 98cdb6
 * @ydest: the y coordinate of the destination within @drawable.
Packit 98cdb6
 * @width: the width of the area to be copied, or -1 to make the area 
Packit 98cdb6
 *     extend to the right edge of @image.
Packit 98cdb6
 * @height: the height of the area to be copied, or -1 to make the area 
Packit 98cdb6
 *     extend to the bottom edge of @image.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a #GdkImage onto a drawable.
Packit 98cdb6
 * The depth of the #GdkImage must match the depth of the #GdkDrawable.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Do not use #GdkImage anymore, instead use Cairo image
Packit 98cdb6
 * surfaces.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_image (GdkDrawable *drawable,
Packit 98cdb6
		GdkGC       *gc,
Packit 98cdb6
		GdkImage    *image,
Packit 98cdb6
		gint         xsrc,
Packit 98cdb6
		gint         ysrc,
Packit 98cdb6
		gint         xdest,
Packit 98cdb6
		gint         ydest,
Packit 98cdb6
		gint         width,
Packit 98cdb6
		gint         height)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_IMAGE (image));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  if (width == -1)
Packit 98cdb6
    width = image->width;
Packit 98cdb6
  if (height == -1)
Packit 98cdb6
    height = image->height;
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_image (drawable, gc, image, xsrc, ysrc,
Packit 98cdb6
                                                 xdest, ydest, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_pixbuf:
Packit 98cdb6
 * @drawable: Destination drawable.
Packit 98cdb6
 * @gc: (allow-none): a #GdkGC, used for clipping, or %NULL
Packit 98cdb6
 * @pixbuf: a #GdkPixbuf
Packit 98cdb6
 * @src_x: Source X coordinate within pixbuf.
Packit 98cdb6
 * @src_y: Source Y coordinates within pixbuf.
Packit 98cdb6
 * @dest_x: Destination X coordinate within drawable.
Packit 98cdb6
 * @dest_y: Destination Y coordinate within drawable.
Packit 98cdb6
 * @width: Width of region to render, in pixels, or -1 to use pixbuf width.
Packit 98cdb6
 * @height: Height of region to render, in pixels, or -1 to use pixbuf height.
Packit 98cdb6
 * @dither: Dithering mode for #GdkRGB.
Packit 98cdb6
 * @x_dither: X offset for dither.
Packit 98cdb6
 * @y_dither: Y offset for dither.
Packit 98cdb6
 * 
Packit 98cdb6
 * Renders a rectangular portion of a pixbuf to a drawable.  The destination
Packit 98cdb6
 * drawable must have a colormap. All windows have a colormap, however, pixmaps
Packit 98cdb6
 * only have colormap by default if they were created with a non-%NULL window 
Packit 98cdb6
 * argument. Otherwise a colormap must be set on them with 
Packit 98cdb6
 * gdk_drawable_set_colormap().
Packit 98cdb6
 *
Packit 98cdb6
 * On older X servers, rendering pixbufs with an alpha channel involves round 
Packit 98cdb6
 * trips to the X server, and may be somewhat slow.
Packit 98cdb6
 *
Packit 98cdb6
 * If GDK is built with the Sun mediaLib library, the gdk_draw_pixbuf
Packit 98cdb6
 * function is accelerated using mediaLib, which provides hardware
Packit 98cdb6
 * acceleration on Intel, AMD, and Sparc chipsets.  If desired, mediaLib
Packit 98cdb6
 * support can be turned off by setting the GDK_DISABLE_MEDIALIB environment
Packit 98cdb6
 * variable.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.2
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use gdk_cairo_set_source_pixbuf() and cairo_paint() or
Packit 98cdb6
 * cairo_rectangle() and cairo_fill() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_pixbuf (GdkDrawable     *drawable,
Packit 98cdb6
                 GdkGC           *gc,
Packit 98cdb6
                 const GdkPixbuf *pixbuf,
Packit 98cdb6
                 gint             src_x,
Packit 98cdb6
                 gint             src_y,
Packit 98cdb6
                 gint             dest_x,
Packit 98cdb6
                 gint             dest_y,
Packit 98cdb6
                 gint             width,
Packit 98cdb6
                 gint             height,
Packit 98cdb6
                 GdkRgbDither     dither,
Packit 98cdb6
                 gint             x_dither,
Packit 98cdb6
                 gint             y_dither)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (gc == NULL || GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
Packit 98cdb6
Packit 98cdb6
  if (width == 0 || height == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (width == -1)
Packit 98cdb6
    width = gdk_pixbuf_get_width (pixbuf);
Packit 98cdb6
  if (height == -1)
Packit 98cdb6
    height = gdk_pixbuf_get_height (pixbuf);
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_pixbuf (drawable, gc,
Packit 98cdb6
                                                  (GdkPixbuf *) pixbuf,
Packit 98cdb6
						  src_x, src_y, dest_x, dest_y,
Packit 98cdb6
                                                  width, height,
Packit 98cdb6
						  dither, x_dither, y_dither);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_points:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @points: an array of #GdkPoint structures.
Packit 98cdb6
 * @n_points: the number of points to be drawn.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a number of points, using the foreground color and other 
Packit 98cdb6
 * attributes of the #GdkGC.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use @n_points calls to cairo_rectangle() and
Packit 98cdb6
 * cairo_fill() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_points (GdkDrawable    *drawable,
Packit 98cdb6
		 GdkGC          *gc,
Packit 98cdb6
		 const GdkPoint *points,
Packit 98cdb6
		 gint            n_points)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail ((points != NULL) && (n_points > 0));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (n_points >= 0);
Packit 98cdb6
Packit 98cdb6
  if (n_points == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_points (drawable, gc,
Packit 98cdb6
                                                  (GdkPoint *) points, n_points);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_segments:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @segs: an array of #GdkSegment structures specifying the start and 
Packit 98cdb6
 *   end points of the lines to be drawn.
Packit 98cdb6
 * @n_segs: the number of line segments to draw, i.e. the size of the 
Packit 98cdb6
 *   @segs array.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a number of unconnected lines.
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_move_to(), cairo_line_to() and cairo_stroke()
Packit 98cdb6
 * instead. See the documentation of gdk_draw_line() for notes on line drawing
Packit 98cdb6
 * with Cairo.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_segments (GdkDrawable      *drawable,
Packit 98cdb6
		   GdkGC            *gc,
Packit 98cdb6
		   const GdkSegment *segs,
Packit 98cdb6
		   gint              n_segs)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
Packit 98cdb6
  if (n_segs == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (segs != NULL);
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (n_segs >= 0);
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_segments (drawable, gc,
Packit 98cdb6
                                                    (GdkSegment *) segs, n_segs);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_lines:
Packit 98cdb6
 * @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
Packit 98cdb6
 * @gc: a #GdkGC.
Packit 98cdb6
 * @points: an array of #GdkPoint structures specifying the endpoints of the
Packit 98cdb6
 * @n_points: the size of the @points array.
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a series of lines connecting the given points.
Packit 98cdb6
 * The way in which joins between lines are draw is determined by the
Packit 98cdb6
 * #GdkCapStyle value in the #GdkGC. This can be set with
Packit 98cdb6
 * gdk_gc_set_line_attributes().
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use cairo_line_to() and cairo_stroke() instead. See the
Packit 98cdb6
 * documentation of gdk_draw_line() for notes on line drawing with Cairo.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_lines (GdkDrawable    *drawable,
Packit 98cdb6
		GdkGC          *gc,
Packit 98cdb6
		const GdkPoint *points,
Packit 98cdb6
		gint            n_points)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (points != NULL);
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (n_points >= 0);
Packit 98cdb6
Packit 98cdb6
  if (n_points == 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_lines (drawable, gc,
Packit 98cdb6
                                                 (GdkPoint *) points, n_points);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
real_draw_glyphs (GdkDrawable       *drawable,
Packit 98cdb6
		  GdkGC	            *gc,
Packit 98cdb6
		  const PangoMatrix *matrix,
Packit 98cdb6
		  PangoFont         *font,
Packit 98cdb6
		  gdouble            x,
Packit 98cdb6
		  gdouble            y,
Packit 98cdb6
		  PangoGlyphString  *glyphs)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
Packit 98cdb6
  cr = gdk_cairo_create (drawable);
Packit 98cdb6
  _gdk_gc_update_context (gc, cr, NULL, NULL, TRUE, drawable);
Packit 98cdb6
Packit 98cdb6
  if (matrix)
Packit 98cdb6
    {
Packit 98cdb6
      cairo_matrix_t cairo_matrix;
Packit 98cdb6
Packit 98cdb6
      cairo_matrix.xx = matrix->xx;
Packit 98cdb6
      cairo_matrix.yx = matrix->yx;
Packit 98cdb6
      cairo_matrix.xy = matrix->xy;
Packit 98cdb6
      cairo_matrix.yy = matrix->yy;
Packit 98cdb6
      cairo_matrix.x0 = matrix->x0;
Packit 98cdb6
      cairo_matrix.y0 = matrix->y0;
Packit 98cdb6
      
Packit 98cdb6
      cairo_set_matrix (cr, &cairo_matrix);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  cairo_move_to (cr, x, y);
Packit 98cdb6
  pango_cairo_show_glyph_string (cr, font, glyphs);
Packit 98cdb6
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_glyphs:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @gc: a #GdkGC
Packit 98cdb6
 * @font: font to be used
Packit 98cdb6
 * @x: X coordinate of baseline origin
Packit 98cdb6
 * @y: Y coordinate of baseline origin
Packit 98cdb6
 * @glyphs: the glyph string to draw
Packit 98cdb6
 *
Packit 98cdb6
 * This is a low-level function; 99% of text rendering should be done
Packit 98cdb6
 * using gdk_draw_layout() instead.
Packit 98cdb6
 *
Packit 98cdb6
 * A glyph is a single image in a font. This function draws a sequence of
Packit 98cdb6
 * glyphs.  To obtain a sequence of glyphs you have to understand a
Packit 98cdb6
 * lot about internationalized text handling, which you don't want to
Packit 98cdb6
 * understand; thus, use gdk_draw_layout() instead of this function,
Packit 98cdb6
 * gdk_draw_layout() handles the details.
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated: 2.22: Use pango_cairo_show_glyphs() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_glyphs (GdkDrawable      *drawable,
Packit 98cdb6
		 GdkGC            *gc,
Packit 98cdb6
		 PangoFont        *font,
Packit 98cdb6
		 gint              x,
Packit 98cdb6
		 gint              y,
Packit 98cdb6
		 PangoGlyphString *glyphs)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  
Packit 98cdb6
  real_draw_glyphs (drawable, gc, NULL, font,
Packit 98cdb6
		    x, y, glyphs);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_glyphs_transformed:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @gc: a #GdkGC
Packit 98cdb6
 * @matrix: (allow-none): a #PangoMatrix, or %NULL to use an identity transformation
Packit 98cdb6
 * @font: the font in which to draw the string
Packit 98cdb6
 * @x:       the x position of the start of the string (in Pango
Packit 98cdb6
 *           units in user space coordinates)
Packit 98cdb6
 * @y:       the y position of the baseline (in Pango units
Packit 98cdb6
 *           in user space coordinates)
Packit 98cdb6
 * @glyphs:  the glyph string to draw
Packit 98cdb6
 * 
Packit 98cdb6
 * Renders a #PangoGlyphString onto a drawable, possibly
Packit 98cdb6
 * transforming the layed-out coordinates through a transformation
Packit 98cdb6
 * matrix. Note that the transformation matrix for @font is not
Packit 98cdb6
 * changed, so to produce correct rendering results, the @font
Packit 98cdb6
 * must have been loaded using a #PangoContext with an identical
Packit 98cdb6
 * transformation matrix to that passed in to this function.
Packit 98cdb6
 *
Packit 98cdb6
 * See also gdk_draw_glyphs(), gdk_draw_layout().
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.6
Packit 98cdb6
 * 
Packit 98cdb6
 * Deprecated: 2.22: Use pango_cairo_show_glyphs() instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_glyphs_transformed (GdkDrawable       *drawable,
Packit 98cdb6
			     GdkGC	       *gc,
Packit 98cdb6
			     const PangoMatrix *matrix,
Packit 98cdb6
			     PangoFont         *font,
Packit 98cdb6
			     gint               x,
Packit 98cdb6
			     gint               y,
Packit 98cdb6
			     PangoGlyphString  *glyphs)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
Packit 98cdb6
  real_draw_glyphs (drawable, gc, matrix, font,
Packit 98cdb6
		    x / PANGO_SCALE, y / PANGO_SCALE, glyphs);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_draw_trapezoids:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @gc: a #GdkGC
Packit 98cdb6
 * @trapezoids: an array of #GdkTrapezoid structures
Packit 98cdb6
 * @n_trapezoids: the number of trapezoids to draw
Packit 98cdb6
 * 
Packit 98cdb6
 * Draws a set of anti-aliased trapezoids. The trapezoids are
Packit 98cdb6
 * combined using saturation addition, then drawn over the background
Packit 98cdb6
 * as a set. This is low level functionality used internally to implement
Packit 98cdb6
 * rotated underlines and backgrouds when rendering a PangoLayout and is
Packit 98cdb6
 * likely not useful for applications.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.6
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use Cairo path contruction functions and cairo_fill()
Packit 98cdb6
 * instead.
Packit 98cdb6
 **/
Packit 98cdb6
void
Packit 98cdb6
gdk_draw_trapezoids (GdkDrawable        *drawable,
Packit 98cdb6
		     GdkGC	        *gc,
Packit 98cdb6
		     const GdkTrapezoid *trapezoids,
Packit 98cdb6
		     gint                n_trapezoids)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_DRAWABLE (drawable));
Packit 98cdb6
  g_return_if_fail (GDK_IS_GC (gc));
Packit 98cdb6
  g_return_if_fail (n_trapezoids == 0 || trapezoids != NULL);
Packit 98cdb6
Packit 98cdb6
  cr = gdk_cairo_create (drawable);
Packit 98cdb6
  _gdk_gc_update_context (gc, cr, NULL, NULL, TRUE, drawable);
Packit 98cdb6
  
Packit 98cdb6
  for (i = 0; i < n_trapezoids; i++)
Packit 98cdb6
    {
Packit 98cdb6
      cairo_move_to (cr, trapezoids[i].x11, trapezoids[i].y1);
Packit 98cdb6
      cairo_line_to (cr, trapezoids[i].x21, trapezoids[i].y1);
Packit 98cdb6
      cairo_line_to (cr, trapezoids[i].x22, trapezoids[i].y2);
Packit 98cdb6
      cairo_line_to (cr, trapezoids[i].x12, trapezoids[i].y2);
Packit 98cdb6
      cairo_close_path (cr);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  cairo_fill (cr);
Packit 98cdb6
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_copy_to_image:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @image: (allow-none): a #GdkDrawable, or %NULL if a new @image should be created.
Packit 98cdb6
 * @src_x: x coordinate on @drawable
Packit 98cdb6
 * @src_y: y coordinate on @drawable
Packit 98cdb6
 * @dest_x: x coordinate within @image. Must be 0 if @image is %NULL
Packit 98cdb6
 * @dest_y: y coordinate within @image. Must be 0 if @image is %NULL
Packit 98cdb6
 * @width: width of region to get
Packit 98cdb6
 * @height: height or region to get
Packit 98cdb6
 *
Packit 98cdb6
 * Copies a portion of @drawable into the client side image structure
Packit 98cdb6
 * @image. If @image is %NULL, creates a new image of size @width x @height
Packit 98cdb6
 * and copies into that. See gdk_drawable_get_image() for further details.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: @image, or a new a #GdkImage containing the contents
Packit 98cdb6
 *               of @drawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Since: 2.4
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use @drawable as the source and draw to a Cairo image
Packit 98cdb6
 * surface if you want to download contents to the client.
Packit 98cdb6
 **/
Packit 98cdb6
GdkImage*
Packit 98cdb6
gdk_drawable_copy_to_image (GdkDrawable *drawable,
Packit 98cdb6
			    GdkImage    *image,
Packit 98cdb6
			    gint         src_x,
Packit 98cdb6
			    gint         src_y,
Packit 98cdb6
			    gint         dest_x,
Packit 98cdb6
			    gint         dest_y,
Packit 98cdb6
			    gint         width,
Packit 98cdb6
			    gint         height)
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawable *composite;
Packit 98cdb6
  gint composite_x_offset = 0;
Packit 98cdb6
  gint composite_y_offset = 0;
Packit 98cdb6
  GdkImage *retval;
Packit 98cdb6
  GdkColormap *cmap;
Packit 98cdb6
  
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
  g_return_val_if_fail (src_x >= 0, NULL);
Packit 98cdb6
  g_return_val_if_fail (src_y >= 0, NULL);
Packit 98cdb6
Packit 98cdb6
  /* FIXME? Note race condition since we get the size then
Packit 98cdb6
   * get the image, and the size may have changed.
Packit 98cdb6
   */
Packit 98cdb6
  
Packit 98cdb6
  if (width < 0 || height < 0)
Packit 98cdb6
    gdk_drawable_get_size (drawable,
Packit 98cdb6
                           width < 0 ? &width : NULL,
Packit 98cdb6
                           height < 0 ? &height : NULL);
Packit 98cdb6
  
Packit 98cdb6
  composite =
Packit 98cdb6
    GDK_DRAWABLE_GET_CLASS (drawable)->get_composite_drawable (drawable,
Packit 98cdb6
                                                               src_x, src_y,
Packit 98cdb6
                                                               width, height,
Packit 98cdb6
                                                               &composite_x_offset,
Packit 98cdb6
                                                               &composite_y_offset); 
Packit 98cdb6
  
Packit 98cdb6
  retval = GDK_DRAWABLE_GET_CLASS (composite)->_copy_to_image (composite,
Packit 98cdb6
							       image,
Packit 98cdb6
							       src_x - composite_x_offset,
Packit 98cdb6
							       src_y - composite_y_offset,
Packit 98cdb6
							       dest_x, dest_y,
Packit 98cdb6
							       width, height);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (composite);
Packit 98cdb6
Packit 98cdb6
  if (!image && retval)
Packit 98cdb6
    {
Packit 98cdb6
      cmap = gdk_drawable_get_colormap (drawable);
Packit 98cdb6
      
Packit 98cdb6
      if (cmap)
Packit 98cdb6
	gdk_image_set_colormap (retval, cmap);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  return retval;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_image:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * @x: x coordinate on @drawable
Packit 98cdb6
 * @y: y coordinate on @drawable
Packit 98cdb6
 * @width: width of region to get
Packit 98cdb6
 * @height: height or region to get
Packit 98cdb6
 * 
Packit 98cdb6
 * A #GdkImage stores client-side image data (pixels). In contrast,
Packit 98cdb6
 * #GdkPixmap and #GdkWindow are server-side
Packit 98cdb6
 * objects. gdk_drawable_get_image() obtains the pixels from a
Packit 98cdb6
 * server-side drawable as a client-side #GdkImage.  The format of a
Packit 98cdb6
 * #GdkImage depends on the #GdkVisual of the current display, which
Packit 98cdb6
 * makes manipulating #GdkImage extremely difficult; therefore, in
Packit 98cdb6
 * most cases you should use gdk_pixbuf_get_from_drawable() instead of
Packit 98cdb6
 * this lower-level function. A #GdkPixbuf contains image data in a
Packit 98cdb6
 * canonicalized RGB format, rather than a display-dependent format.
Packit 98cdb6
 * Of course, there's a convenience vs. speed tradeoff here, so you'll
Packit 98cdb6
 * want to think about what makes sense for your application.
Packit 98cdb6
 *
Packit 98cdb6
 * @x, @y, @width, and @height define the region of @drawable to
Packit 98cdb6
 * obtain as an image.
Packit 98cdb6
 *
Packit 98cdb6
 * You would usually copy image data to the client side if you intend
Packit 98cdb6
 * to examine the values of individual pixels, for example to darken
Packit 98cdb6
 * an image or add a red tint. It would be prohibitively slow to
Packit 98cdb6
 * make a round-trip request to the windowing system for each pixel,
Packit 98cdb6
 * so instead you get all of them at once, modify them, then copy
Packit 98cdb6
 * them all back at once.
Packit 98cdb6
 *
Packit 98cdb6
 * If the X server or other windowing system backend is on the local
Packit 98cdb6
 * machine, this function may use shared memory to avoid copying
Packit 98cdb6
 * the image data.
Packit 98cdb6
 *
Packit 98cdb6
 * If the source drawable is a #GdkWindow and partially offscreen
Packit 98cdb6
 * or obscured, then the obscured portions of the returned image
Packit 98cdb6
 * will contain undefined data.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: a #GdkImage containing the contents of @drawable
Packit 98cdb6
 *
Packit 98cdb6
 * Deprecated: 2.22: Use @drawable as the source and draw to a Cairo image
Packit 98cdb6
 * surface if you want to download contents to the client.
Packit 98cdb6
 **/
Packit 98cdb6
GdkImage*
Packit 98cdb6
gdk_drawable_get_image (GdkDrawable *drawable,
Packit 98cdb6
                        gint         x,
Packit 98cdb6
                        gint         y,
Packit 98cdb6
                        gint         width,
Packit 98cdb6
                        gint         height)
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawable *composite;
Packit 98cdb6
  gint composite_x_offset = 0;
Packit 98cdb6
  gint composite_y_offset = 0;
Packit 98cdb6
  GdkImage *retval;
Packit 98cdb6
  GdkColormap *cmap;
Packit 98cdb6
  
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
  g_return_val_if_fail (x >= 0, NULL);
Packit 98cdb6
  g_return_val_if_fail (y >= 0, NULL);
Packit 98cdb6
Packit 98cdb6
  /* FIXME? Note race condition since we get the size then
Packit 98cdb6
   * get the image, and the size may have changed.
Packit 98cdb6
   */
Packit 98cdb6
  
Packit 98cdb6
  if (width < 0 || height < 0)
Packit 98cdb6
    gdk_drawable_get_size (drawable,
Packit 98cdb6
                           width < 0 ? &width : NULL,
Packit 98cdb6
                           height < 0 ? &height : NULL);
Packit 98cdb6
  
Packit 98cdb6
  composite =
Packit 98cdb6
    GDK_DRAWABLE_GET_CLASS (drawable)->get_composite_drawable (drawable,
Packit 98cdb6
                                                               x, y,
Packit 98cdb6
                                                               width, height,
Packit 98cdb6
                                                               &composite_x_offset,
Packit 98cdb6
                                                               &composite_y_offset); 
Packit 98cdb6
  
Packit 98cdb6
  retval = GDK_DRAWABLE_GET_CLASS (composite)->get_image (composite,
Packit 98cdb6
                                                          x - composite_x_offset,
Packit 98cdb6
                                                          y - composite_y_offset,
Packit 98cdb6
                                                          width, height);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (composite);
Packit 98cdb6
Packit 98cdb6
  cmap = gdk_drawable_get_colormap (drawable);
Packit 98cdb6
  
Packit 98cdb6
  if (retval && cmap)
Packit 98cdb6
    gdk_image_set_colormap (retval, cmap);
Packit 98cdb6
  
Packit 98cdb6
  return retval;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkImage*
Packit 98cdb6
gdk_drawable_real_get_image (GdkDrawable     *drawable,
Packit 98cdb6
			     gint             x,
Packit 98cdb6
			     gint             y,
Packit 98cdb6
			     gint             width,
Packit 98cdb6
			     gint             height)
Packit 98cdb6
{
Packit 98cdb6
  return gdk_drawable_copy_to_image (drawable, NULL, x, y, 0, 0, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkDrawable *
Packit 98cdb6
gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
Packit 98cdb6
                                          gint         x,
Packit 98cdb6
                                          gint         y,
Packit 98cdb6
                                          gint         width,
Packit 98cdb6
                                          gint         height,
Packit 98cdb6
                                          gint        *composite_x_offset,
Packit 98cdb6
                                          gint        *composite_y_offset)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  *composite_x_offset = 0;
Packit 98cdb6
  *composite_y_offset = 0;
Packit 98cdb6
  
Packit 98cdb6
  return g_object_ref (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_clip_region:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Computes the region of a drawable that potentially can be written
Packit 98cdb6
 * to by drawing primitives. This region will not take into account
Packit 98cdb6
 * the clip region for the GC, and may also not take into account
Packit 98cdb6
 * other factors such as if the window is obscured by other windows,
Packit 98cdb6
 * but no area outside of this region will be affected by drawing
Packit 98cdb6
 * primitives.
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns: a #GdkRegion. This must be freed with gdk_region_destroy()
Packit 98cdb6
 *          when you are done.
Packit 98cdb6
 **/
Packit 98cdb6
GdkRegion *
Packit 98cdb6
gdk_drawable_get_clip_region (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_clip_region (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_drawable_get_visible_region:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Computes the region of a drawable that is potentially visible.
Packit 98cdb6
 * This does not necessarily take into account if the window is
Packit 98cdb6
 * obscured by other windows, but no area outside of this region
Packit 98cdb6
 * is visible.
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns: a #GdkRegion. This must be freed with gdk_region_destroy()
Packit 98cdb6
 *          when you are done.
Packit 98cdb6
 **/
Packit 98cdb6
GdkRegion *
Packit 98cdb6
gdk_drawable_get_visible_region (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->get_visible_region (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkRegion *
Packit 98cdb6
gdk_drawable_real_get_visible_region (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkRectangle rect;
Packit 98cdb6
Packit 98cdb6
  rect.x = 0;
Packit 98cdb6
  rect.y = 0;
Packit 98cdb6
Packit 98cdb6
  gdk_drawable_get_size (drawable, &rect.width, &rect.height);
Packit 98cdb6
Packit 98cdb6
  return gdk_region_rectangle (&rect);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * _gdk_drawable_ref_cairo_surface:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Obtains a #cairo_surface_t for the given drawable. If a
Packit 98cdb6
 * #cairo_surface_t for the drawable already exists, it will be
Packit 98cdb6
 * referenced, otherwise a new surface will be created.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: a newly referenced #cairo_surface_t that points
Packit 98cdb6
 *  to @drawable. Unref with cairo_surface_destroy()
Packit 98cdb6
 **/
Packit 98cdb6
cairo_surface_t *
Packit 98cdb6
_gdk_drawable_ref_cairo_surface (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->ref_cairo_surface (drawable);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
composite (guchar *src_buf,
Packit 98cdb6
	   gint    src_rowstride,
Packit 98cdb6
	   guchar *dest_buf,
Packit 98cdb6
	   gint    dest_rowstride,
Packit 98cdb6
	   gint    width,
Packit 98cdb6
	   gint    height)
Packit 98cdb6
{
Packit 98cdb6
  guchar *src = src_buf;
Packit 98cdb6
  guchar *dest = dest_buf;
Packit 98cdb6
Packit 98cdb6
  while (height--)
Packit 98cdb6
    {
Packit 98cdb6
      gint twidth = width;
Packit 98cdb6
      guchar *p = src;
Packit 98cdb6
      guchar *q = dest;
Packit 98cdb6
Packit 98cdb6
      while (twidth--)
Packit 98cdb6
	{
Packit 98cdb6
	  guchar a = p[3];
Packit 98cdb6
	  guint t;
Packit 98cdb6
Packit 98cdb6
	  t = a * p[0] + (255 - a) * q[0] + 0x80;
Packit 98cdb6
	  q[0] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	  t = a * p[1] + (255 - a) * q[1] + 0x80;
Packit 98cdb6
	  q[1] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	  t = a * p[2] + (255 - a) * q[2] + 0x80;
Packit 98cdb6
	  q[2] = (t + (t >> 8)) >> 8;
Packit 98cdb6
Packit 98cdb6
	  p += 4;
Packit 98cdb6
	  q += 3;
Packit 98cdb6
	}
Packit 98cdb6
      
Packit 98cdb6
      src += src_rowstride;
Packit 98cdb6
      dest += dest_rowstride;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
composite_0888 (guchar      *src_buf,
Packit 98cdb6
		gint         src_rowstride,
Packit 98cdb6
		guchar      *dest_buf,
Packit 98cdb6
		gint         dest_rowstride,
Packit 98cdb6
		GdkByteOrder dest_byte_order,
Packit 98cdb6
		gint         width,
Packit 98cdb6
		gint         height)
Packit 98cdb6
{
Packit 98cdb6
  guchar *src = src_buf;
Packit 98cdb6
  guchar *dest = dest_buf;
Packit 98cdb6
Packit 98cdb6
  while (height--)
Packit 98cdb6
    {
Packit 98cdb6
      gint twidth = width;
Packit 98cdb6
      guchar *p = src;
Packit 98cdb6
      guchar *q = dest;
Packit 98cdb6
Packit 98cdb6
      if (dest_byte_order == GDK_LSB_FIRST)
Packit 98cdb6
	{
Packit 98cdb6
	  while (twidth--)
Packit 98cdb6
	    {
Packit 98cdb6
	      guint t;
Packit 98cdb6
	      
Packit 98cdb6
	      t = p[3] * p[2] + (255 - p[3]) * q[0] + 0x80;
Packit 98cdb6
	      q[0] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      t = p[3] * p[1] + (255 - p[3]) * q[1] + 0x80;
Packit 98cdb6
	      q[1] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      t = p[3] * p[0] + (255 - p[3]) * q[2] + 0x80;
Packit 98cdb6
	      q[2] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      p += 4;
Packit 98cdb6
	      q += 4;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  while (twidth--)
Packit 98cdb6
	    {
Packit 98cdb6
	      guint t;
Packit 98cdb6
	      
Packit 98cdb6
	      t = p[3] * p[0] + (255 - p[3]) * q[1] + 0x80;
Packit 98cdb6
	      q[1] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      t = p[3] * p[1] + (255 - p[3]) * q[2] + 0x80;
Packit 98cdb6
	      q[2] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      t = p[3] * p[2] + (255 - p[3]) * q[3] + 0x80;
Packit 98cdb6
	      q[3] = (t + (t >> 8)) >> 8;
Packit 98cdb6
	      p += 4;
Packit 98cdb6
	      q += 4;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      
Packit 98cdb6
      src += src_rowstride;
Packit 98cdb6
      dest += dest_rowstride;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
#ifdef USE_MEDIALIB
Packit 98cdb6
static void
Packit 98cdb6
composite_0888_medialib (guchar      *src_buf,
Packit 98cdb6
			 gint         src_rowstride,
Packit 98cdb6
			 guchar      *dest_buf,
Packit 98cdb6
			 gint         dest_rowstride,
Packit 98cdb6
			 GdkByteOrder dest_byte_order,
Packit 98cdb6
			 gint         width,
Packit 98cdb6
			 gint         height)
Packit 98cdb6
{
Packit 98cdb6
  guchar *src  = src_buf;
Packit 98cdb6
  guchar *dest = dest_buf;
Packit 98cdb6
Packit 98cdb6
  mlib_image img_src, img_dst;
Packit 98cdb6
Packit 98cdb6
  mlib_ImageSetStruct (&img_dst,
Packit 98cdb6
                       MLIB_BYTE,
Packit 98cdb6
                       4,
Packit 98cdb6
                       width,
Packit 98cdb6
                       height,
Packit 98cdb6
                       dest_rowstride,
Packit 98cdb6
                       dest_buf);
Packit 98cdb6
Packit 98cdb6
  mlib_ImageSetStruct (&img_src,
Packit 98cdb6
                       MLIB_BYTE,
Packit 98cdb6
                       4,
Packit 98cdb6
                       width,
Packit 98cdb6
                       height,
Packit 98cdb6
                       src_rowstride,
Packit 98cdb6
                       src_buf);
Packit 98cdb6
Packit 98cdb6
  if (dest_byte_order == GDK_LSB_FIRST)
Packit 98cdb6
      mlib_ImageBlendRGBA2BGRA (&img_dst, &img_src);
Packit 98cdb6
  else
Packit 98cdb6
      mlib_ImageBlendRGBA2ARGB (&img_dst, &img_src);
Packit 98cdb6
}
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
composite_565 (guchar      *src_buf,
Packit 98cdb6
	       gint         src_rowstride,
Packit 98cdb6
	       guchar      *dest_buf,
Packit 98cdb6
	       gint         dest_rowstride,
Packit 98cdb6
	       GdkByteOrder dest_byte_order,
Packit 98cdb6
	       gint         width,
Packit 98cdb6
	       gint         height)
Packit 98cdb6
{
Packit 98cdb6
  guchar *src = src_buf;
Packit 98cdb6
  guchar *dest = dest_buf;
Packit 98cdb6
Packit 98cdb6
  while (height--)
Packit 98cdb6
    {
Packit 98cdb6
      gint twidth = width;
Packit 98cdb6
      guchar *p = src;
Packit 98cdb6
      gushort *q = (gushort *)dest;
Packit 98cdb6
Packit 98cdb6
      while (twidth--)
Packit 98cdb6
	{
Packit 98cdb6
	  guchar a = p[3];
Packit 98cdb6
	  guint tr, tg, tb;
Packit 98cdb6
	  guint tr1, tg1, tb1;
Packit 98cdb6
	  guint tmp = *q;
Packit 98cdb6
Packit 98cdb6
#if 1
Packit 98cdb6
	  /* This is fast, and corresponds to what composite() above does
Packit 98cdb6
	   * if we converted to 8-bit first.
Packit 98cdb6
	   */
Packit 98cdb6
	  tr = (tmp & 0xf800);
Packit 98cdb6
	  tr1 = a * p[0] + (255 - a) * ((tr >> 8) + (tr >> 13)) + 0x80;
Packit 98cdb6
	  tg = (tmp & 0x07e0);
Packit 98cdb6
	  tg1 = a * p[1] + (255 - a) * ((tg >> 3) + (tg >> 9)) + 0x80;
Packit 98cdb6
	  tb = (tmp & 0x001f);
Packit 98cdb6
	  tb1 = a * p[2] + (255 - a) * ((tb << 3) + (tb >> 2)) + 0x80;
Packit 98cdb6
Packit 98cdb6
	  *q = (((tr1 + (tr1 >> 8)) & 0xf800) |
Packit 98cdb6
		(((tg1 + (tg1 >> 8)) & 0xfc00) >> 5)  |
Packit 98cdb6
		((tb1 + (tb1 >> 8)) >> 11));
Packit 98cdb6
#else
Packit 98cdb6
	  /* This version correspond to the result we get with XRENDER -
Packit 98cdb6
	   * a bit of precision is lost since we convert to 8 bit after premultiplying
Packit 98cdb6
	   * instead of at the end
Packit 98cdb6
	   */
Packit 98cdb6
	  guint tr2, tg2, tb2;
Packit 98cdb6
	  guint tr3, tg3, tb3;
Packit 98cdb6
	  
Packit 98cdb6
	  tr = (tmp & 0xf800);
Packit 98cdb6
	  tr1 = (255 - a) * ((tr >> 8) + (tr >> 13)) + 0x80;
Packit 98cdb6
	  tr2 = a * p[0] + 0x80;
Packit 98cdb6
	  tr3 = ((tr1 + (tr1 >> 8)) >> 8) + ((tr2 + (tr2 >> 8)) >> 8);
Packit 98cdb6
Packit 98cdb6
	  tg = (tmp & 0x07e0);
Packit 98cdb6
	  tg1 = (255 - a) * ((tg >> 3) + (tg >> 9)) + 0x80;
Packit 98cdb6
	  tg2 = a * p[0] + 0x80;
Packit 98cdb6
	  tg3 = ((tg1 + (tg1 >> 8)) >> 8) + ((tg2 + (tg2 >> 8)) >> 8);
Packit 98cdb6
Packit 98cdb6
	  tb = (tmp & 0x001f);
Packit 98cdb6
	  tb1 = (255 - a) * ((tb << 3) + (tb >> 2)) + 0x80;
Packit 98cdb6
	  tb2 = a * p[0] + 0x80;
Packit 98cdb6
	  tb3 = ((tb1 + (tb1 >> 8)) >> 8) + ((tb2 + (tb2 >> 8)) >> 8);
Packit 98cdb6
Packit 98cdb6
	  *q = (((tr3 & 0xf8) << 8) |
Packit 98cdb6
		((tg3 & 0xfc) << 3) |
Packit 98cdb6
		((tb3 >> 3)));
Packit 98cdb6
#endif
Packit 98cdb6
	  
Packit 98cdb6
	  p += 4;
Packit 98cdb6
	  q++;
Packit 98cdb6
	}
Packit 98cdb6
      
Packit 98cdb6
      src += src_rowstride;
Packit 98cdb6
      dest += dest_rowstride;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Implementation of the old vfunc in terms of the new one
Packit 98cdb6
   in case someone calls it directly (which they shouldn't!) */
Packit 98cdb6
static void
Packit 98cdb6
gdk_drawable_real_draw_drawable (GdkDrawable  *drawable,
Packit 98cdb6
				 GdkGC	       *gc,
Packit 98cdb6
				 GdkDrawable  *src,
Packit 98cdb6
				 gint		xsrc,
Packit 98cdb6
				 gint		ysrc,
Packit 98cdb6
				 gint		xdest,
Packit 98cdb6
				 gint		ydest,
Packit 98cdb6
				 gint		width,
Packit 98cdb6
				 gint		height)
Packit 98cdb6
{
Packit 98cdb6
  GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src (drawable,
Packit 98cdb6
							     gc,
Packit 98cdb6
							     src,
Packit 98cdb6
							     xsrc,
Packit 98cdb6
							     ysrc,
Packit 98cdb6
							     xdest,
Packit 98cdb6
							     ydest,
Packit 98cdb6
							     width,
Packit 98cdb6
							     height,
Packit 98cdb6
							     src);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_drawable_real_draw_pixbuf (GdkDrawable  *drawable,
Packit 98cdb6
			       GdkGC        *gc,
Packit 98cdb6
			       GdkPixbuf    *pixbuf,
Packit 98cdb6
			       gint          src_x,
Packit 98cdb6
			       gint          src_y,
Packit 98cdb6
			       gint          dest_x,
Packit 98cdb6
			       gint          dest_y,
Packit 98cdb6
			       gint          width,
Packit 98cdb6
			       gint          height,
Packit 98cdb6
			       GdkRgbDither  dither,
Packit 98cdb6
			       gint          x_dither,
Packit 98cdb6
			       gint          y_dither)
Packit 98cdb6
{
Packit 98cdb6
  GdkPixbuf *composited = NULL;
Packit 98cdb6
  gint dwidth, dheight;
Packit 98cdb6
  GdkRegion *clip;
Packit 98cdb6
  GdkRegion *drect;
Packit 98cdb6
  GdkRectangle tmp_rect;
Packit 98cdb6
  GdkDrawable  *real_drawable;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
Packit 98cdb6
  g_return_if_fail (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
Packit 98cdb6
  g_return_if_fail (gdk_pixbuf_get_n_channels (pixbuf) == 3 ||
Packit 98cdb6
                    gdk_pixbuf_get_n_channels (pixbuf) == 4);
Packit 98cdb6
  g_return_if_fail (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (drawable != NULL);
Packit 98cdb6
Packit 98cdb6
  if (width == -1) 
Packit 98cdb6
    width = gdk_pixbuf_get_width (pixbuf);
Packit 98cdb6
  if (height == -1)
Packit 98cdb6
    height = gdk_pixbuf_get_height (pixbuf);
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (width >= 0 && height >= 0);
Packit 98cdb6
  g_return_if_fail (src_x >= 0 && src_x + width <= gdk_pixbuf_get_width (pixbuf));
Packit 98cdb6
  g_return_if_fail (src_y >= 0 && src_y + height <= gdk_pixbuf_get_height (pixbuf));
Packit 98cdb6
Packit 98cdb6
  /* Clip to the drawable; this is required for get_from_drawable() so
Packit 98cdb6
   * can't be done implicitly
Packit 98cdb6
   */
Packit 98cdb6
  
Packit 98cdb6
  if (dest_x < 0)
Packit 98cdb6
    {
Packit 98cdb6
      src_x -= dest_x;
Packit 98cdb6
      width += dest_x;
Packit 98cdb6
      dest_x = 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (dest_y < 0)
Packit 98cdb6
    {
Packit 98cdb6
      src_y -= dest_y;
Packit 98cdb6
      height += dest_y;
Packit 98cdb6
      dest_y = 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_drawable_get_size (drawable, &dwidth, &dheight);
Packit 98cdb6
Packit 98cdb6
  if ((dest_x + width) > dwidth)
Packit 98cdb6
    width = dwidth - dest_x;
Packit 98cdb6
Packit 98cdb6
  if ((dest_y + height) > dheight)
Packit 98cdb6
    height = dheight - dest_y;
Packit 98cdb6
Packit 98cdb6
  if (width <= 0 || height <= 0)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* Clip to the clip region; this avoids getting more
Packit 98cdb6
   * image data from the server than we need to.
Packit 98cdb6
   */
Packit 98cdb6
  
Packit 98cdb6
  tmp_rect.x = dest_x;
Packit 98cdb6
  tmp_rect.y = dest_y;
Packit 98cdb6
  tmp_rect.width = width;
Packit 98cdb6
  tmp_rect.height = height;
Packit 98cdb6
Packit 98cdb6
  drect = gdk_region_rectangle (&tmp_rect);
Packit 98cdb6
  clip = gdk_drawable_get_clip_region (drawable);
Packit 98cdb6
Packit 98cdb6
  gdk_region_intersect (drect, clip);
Packit 98cdb6
Packit 98cdb6
  gdk_region_get_clipbox (drect, &tmp_rect);
Packit 98cdb6
  
Packit 98cdb6
  gdk_region_destroy (drect);
Packit 98cdb6
  gdk_region_destroy (clip);
Packit 98cdb6
Packit 98cdb6
  if (tmp_rect.width == 0 ||
Packit 98cdb6
      tmp_rect.height == 0)
Packit 98cdb6
    return;
Packit 98cdb6
  
Packit 98cdb6
  /* Actually draw */
Packit 98cdb6
  if (!gc)
Packit 98cdb6
    gc = _gdk_drawable_get_scratch_gc (drawable, FALSE);
Packit 98cdb6
Packit 98cdb6
  /* Drawable is a wrapper here, but at this time we
Packit 98cdb6
     have already retargeted the destination to any
Packit 98cdb6
     impl window and set the clip, so what we really
Packit 98cdb6
     want to do is draw directly on the impl, ignoring
Packit 98cdb6
     client side subwindows. We also use the impl
Packit 98cdb6
     in the pixmap target case to avoid resetting the
Packit 98cdb6
     already set clip on the GC. */
Packit 98cdb6
  if (GDK_IS_WINDOW (drawable))
Packit 98cdb6
    real_drawable = GDK_WINDOW_OBJECT (drawable)->impl;
Packit 98cdb6
  else
Packit 98cdb6
    real_drawable = GDK_PIXMAP_OBJECT (drawable)->impl;
Packit 98cdb6
Packit 98cdb6
  if (gdk_pixbuf_get_has_alpha (pixbuf))
Packit 98cdb6
    {
Packit 98cdb6
      GdkVisual *visual = gdk_drawable_get_visual (drawable);
Packit 98cdb6
      void (*composite_func) (guchar       *src_buf,
Packit 98cdb6
			      gint          src_rowstride,
Packit 98cdb6
			      guchar       *dest_buf,
Packit 98cdb6
			      gint          dest_rowstride,
Packit 98cdb6
			      GdkByteOrder  dest_byte_order,
Packit 98cdb6
			      gint          width,
Packit 98cdb6
			      gint          height) = NULL;
Packit 98cdb6
Packit 98cdb6
      /* First we see if we have a visual-specific composition function that can composite
Packit 98cdb6
       * the pixbuf data directly onto the image
Packit 98cdb6
       */
Packit 98cdb6
      if (visual)
Packit 98cdb6
	{
Packit 98cdb6
	  gint bits_per_pixel = _gdk_windowing_get_bits_for_depth (gdk_drawable_get_display (drawable),
Packit 98cdb6
								   visual->depth);
Packit 98cdb6
	  
Packit 98cdb6
	  if (visual->byte_order == (G_BYTE_ORDER == G_BIG_ENDIAN ? GDK_MSB_FIRST : GDK_LSB_FIRST) &&
Packit 98cdb6
	      visual->depth == 16 &&
Packit 98cdb6
	      visual->red_mask   == 0xf800 &&
Packit 98cdb6
	      visual->green_mask == 0x07e0 &&
Packit 98cdb6
	      visual->blue_mask  == 0x001f)
Packit 98cdb6
	    composite_func = composite_565;
Packit 98cdb6
	  else if (visual->depth == 24 && bits_per_pixel == 32 &&
Packit 98cdb6
		   visual->red_mask   == 0xff0000 &&
Packit 98cdb6
		   visual->green_mask == 0x00ff00 &&
Packit 98cdb6
		   visual->blue_mask  == 0x0000ff)
Packit 98cdb6
	    {
Packit 98cdb6
#ifdef USE_MEDIALIB
Packit 98cdb6
	      if (_gdk_use_medialib ())
Packit 98cdb6
	        composite_func = composite_0888_medialib;
Packit 98cdb6
	      else
Packit 98cdb6
	        composite_func = composite_0888;
Packit 98cdb6
#else
Packit 98cdb6
	      composite_func = composite_0888;
Packit 98cdb6
#endif
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      /* We can't use our composite func if we are required to dither
Packit 98cdb6
       */
Packit 98cdb6
      if (composite_func && !(dither == GDK_RGB_DITHER_MAX && visual->depth != 24))
Packit 98cdb6
	{
Packit 98cdb6
	  gint x0, y0;
Packit 98cdb6
	  for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
Packit 98cdb6
	    {
Packit 98cdb6
	      gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
Packit 98cdb6
	      for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
Packit 98cdb6
		{
Packit 98cdb6
		  gint xs0, ys0;
Packit 98cdb6
		  
Packit 98cdb6
		  gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
Packit 98cdb6
		  
Packit 98cdb6
		  GdkImage *image = _gdk_image_get_scratch (gdk_drawable_get_screen (drawable),
Packit 98cdb6
							    width1, height1,
Packit 98cdb6
							    gdk_drawable_get_depth (drawable), &xs0, &ys0;;
Packit 98cdb6
		  
Packit 98cdb6
		  gdk_drawable_copy_to_image (drawable, image,
Packit 98cdb6
					      dest_x + x0, dest_y + y0,
Packit 98cdb6
					      xs0, ys0,
Packit 98cdb6
					      width1, height1);
Packit 98cdb6
		  (*composite_func) (gdk_pixbuf_get_pixels (pixbuf) + (src_y + y0) * gdk_pixbuf_get_rowstride (pixbuf) + (src_x + x0) * 4,
Packit 98cdb6
				     gdk_pixbuf_get_rowstride (pixbuf),
Packit 98cdb6
				     (guchar*)image->mem + ys0 * image->bpl + xs0 * image->bpp,
Packit 98cdb6
				     image->bpl,
Packit 98cdb6
				     visual->byte_order,
Packit 98cdb6
				     width1, height1);
Packit 98cdb6
		  gdk_draw_image (real_drawable, gc, image,
Packit 98cdb6
				  xs0, ys0,
Packit 98cdb6
				  dest_x + x0, dest_y + y0,
Packit 98cdb6
				  width1, height1);
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	  
Packit 98cdb6
	  goto out;
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  /* No special composition func, convert dest to 24 bit RGB data, composite against
Packit 98cdb6
	   * that, and convert back.
Packit 98cdb6
	   */
Packit 98cdb6
	  composited = gdk_pixbuf_get_from_drawable (NULL,
Packit 98cdb6
						     drawable,
Packit 98cdb6
						     NULL,
Packit 98cdb6
						     dest_x, dest_y,
Packit 98cdb6
						     0, 0,
Packit 98cdb6
						     width, height);
Packit 98cdb6
	  
Packit 98cdb6
	  if (composited)
Packit 98cdb6
	    composite (gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 4,
Packit 98cdb6
		       gdk_pixbuf_get_rowstride (pixbuf),
Packit 98cdb6
		       gdk_pixbuf_get_pixels (composited),
Packit 98cdb6
		       gdk_pixbuf_get_rowstride (composited),
Packit 98cdb6
		       width, height);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (composited)
Packit 98cdb6
    {
Packit 98cdb6
      src_x = 0;
Packit 98cdb6
      src_y = 0;
Packit 98cdb6
      pixbuf = composited;
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (gdk_pixbuf_get_n_channels (pixbuf) == 4)
Packit 98cdb6
    {
Packit 98cdb6
      guchar *buf = gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 4;
Packit 98cdb6
Packit 98cdb6
      gdk_draw_rgb_32_image_dithalign (real_drawable, gc,
Packit 98cdb6
				       dest_x, dest_y,
Packit 98cdb6
				       width, height,
Packit 98cdb6
				       dither,
Packit 98cdb6
				       buf, gdk_pixbuf_get_rowstride (pixbuf),
Packit 98cdb6
				       x_dither, y_dither);
Packit 98cdb6
    }
Packit 98cdb6
  else				/* n_channels == 3 */
Packit 98cdb6
    {
Packit 98cdb6
      guchar *buf = gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 3;
Packit 98cdb6
Packit 98cdb6
      gdk_draw_rgb_image_dithalign (real_drawable, gc,
Packit 98cdb6
				    dest_x, dest_y,
Packit 98cdb6
				    width, height,
Packit 98cdb6
				    dither,
Packit 98cdb6
				    buf, gdk_pixbuf_get_rowstride (pixbuf),
Packit 98cdb6
				    x_dither, y_dither);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
 out:
Packit 98cdb6
  if (composited)
Packit 98cdb6
    g_object_unref (composited);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/************************************************************************/
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * _gdk_drawable_get_scratch_gc:
Packit 98cdb6
 * @drawable: A #GdkDrawable
Packit 98cdb6
 * @graphics_exposures: Whether the returned #GdkGC should generate graphics exposures 
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns a #GdkGC suitable for drawing on @drawable. The #GdkGC has
Packit 98cdb6
 * the standard values for @drawable, except for the graphics_exposures
Packit 98cdb6
 * field which is determined by the @graphics_exposures parameter.
Packit 98cdb6
 *
Packit 98cdb6
 * The foreground color of the returned #GdkGC is undefined. The #GdkGC
Packit 98cdb6
 * must not be altered in any way, except to change its foreground color.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: A #GdkGC suitable for drawing on @drawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Since: 2.4
Packit 98cdb6
 **/
Packit 98cdb6
GdkGC *
Packit 98cdb6
_gdk_drawable_get_scratch_gc (GdkDrawable *drawable,
Packit 98cdb6
			      gboolean     graphics_exposures)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreen *screen;
Packit 98cdb6
  gint depth;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  screen = gdk_drawable_get_screen (drawable);
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (!screen->closed, NULL);
Packit 98cdb6
Packit 98cdb6
  depth = gdk_drawable_get_depth (drawable) - 1;
Packit 98cdb6
Packit 98cdb6
  if (graphics_exposures)
Packit 98cdb6
    {
Packit 98cdb6
      if (!screen->exposure_gcs[depth])
Packit 98cdb6
	{
Packit 98cdb6
	  GdkGCValues values;
Packit 98cdb6
	  GdkGCValuesMask mask;
Packit 98cdb6
Packit 98cdb6
	  values.graphics_exposures = TRUE;
Packit 98cdb6
	  mask = GDK_GC_EXPOSURES;  
Packit 98cdb6
Packit 98cdb6
	  screen->exposure_gcs[depth] =
Packit 98cdb6
	    gdk_gc_new_with_values (drawable, &values, mask);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      return screen->exposure_gcs[depth];
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (!screen->normal_gcs[depth])
Packit 98cdb6
	{
Packit 98cdb6
	  screen->normal_gcs[depth] =
Packit 98cdb6
	    gdk_gc_new (drawable);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      return screen->normal_gcs[depth];
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * _gdk_drawable_get_subwindow_scratch_gc:
Packit 98cdb6
 * @drawable: A #GdkDrawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Returns a #GdkGC suitable for drawing on @drawable. The #GdkGC has
Packit 98cdb6
 * the standard values for @drawable, except for the graphics_exposures
Packit 98cdb6
 * field which is %TRUE and the subwindow mode which is %GDK_INCLUDE_INFERIORS.
Packit 98cdb6
 *
Packit 98cdb6
 * The foreground color of the returned #GdkGC is undefined. The #GdkGC
Packit 98cdb6
 * must not be altered in any way, except to change its foreground color.
Packit 98cdb6
 * 
Packit 98cdb6
 * Return value: A #GdkGC suitable for drawing on @drawable
Packit 98cdb6
 * 
Packit 98cdb6
 * Since: 2.18
Packit 98cdb6
 **/
Packit 98cdb6
GdkGC *
Packit 98cdb6
_gdk_drawable_get_subwindow_scratch_gc (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreen *screen;
Packit 98cdb6
  gint depth;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  screen = gdk_drawable_get_screen (drawable);
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (!screen->closed, NULL);
Packit 98cdb6
Packit 98cdb6
  depth = gdk_drawable_get_depth (drawable) - 1;
Packit 98cdb6
Packit 98cdb6
  if (!screen->subwindow_gcs[depth])
Packit 98cdb6
    {
Packit 98cdb6
      GdkGCValues values;
Packit 98cdb6
      GdkGCValuesMask mask;
Packit 98cdb6
      
Packit 98cdb6
      values.graphics_exposures = TRUE;
Packit 98cdb6
      values.subwindow_mode = GDK_INCLUDE_INFERIORS;
Packit 98cdb6
      mask = GDK_GC_EXPOSURES | GDK_GC_SUBWINDOW;  
Packit 98cdb6
      
Packit 98cdb6
      screen->subwindow_gcs[depth] =
Packit 98cdb6
	gdk_gc_new_with_values (drawable, &values, mask);
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  return screen->subwindow_gcs[depth];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * _gdk_drawable_get_source_drawable:
Packit 98cdb6
 * @drawable: a #GdkDrawable
Packit 98cdb6
 *
Packit 98cdb6
 * Returns a drawable for the passed @drawable that is guaranteed to be
Packit 98cdb6
 * usable to create a pixmap (e.g.: not an offscreen window).
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.16
Packit 98cdb6
 */
Packit 98cdb6
GdkDrawable *
Packit 98cdb6
_gdk_drawable_get_source_drawable (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_DRAWABLE_GET_CLASS (drawable)->get_source_drawable)
Packit 98cdb6
    return GDK_DRAWABLE_GET_CLASS (drawable)->get_source_drawable (drawable);
Packit 98cdb6
Packit 98cdb6
  return drawable;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
cairo_surface_t *
Packit 98cdb6
_gdk_drawable_create_cairo_surface (GdkDrawable *drawable,
Packit 98cdb6
				    int width,
Packit 98cdb6
				    int height)
Packit 98cdb6
{
Packit 98cdb6
  return GDK_DRAWABLE_GET_CLASS (drawable)->create_cairo_surface (drawable,
Packit 98cdb6
								  width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
#define __GDK_DRAW_C__
Packit 98cdb6
#include "gdkaliasdef.c"