2008-07-01 22:57:50 +00:00
|
|
|
/* GDK - The GIMP Drawing Kit
|
1997-11-24 22:37:52 +00:00
|
|
|
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2000-07-26 11:33:08 +00:00
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
1997-11-24 22:37:52 +00:00
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
2000-07-26 11:33:08 +00:00
|
|
|
* Lesser General Public License for more details.
|
1997-11-24 22:37:52 +00:00
|
|
|
*
|
2000-07-26 11:33:08 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
1998-04-13 02:02:47 +00:00
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
1997-11-24 22:37:52 +00:00
|
|
|
*/
|
1999-02-24 07:37:18 +00:00
|
|
|
|
|
|
|
/*
|
2000-07-26 11:33:08 +00:00
|
|
|
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
1999-02-24 07:37:18 +00:00
|
|
|
* file for a list of people on the GTK+ Team. See the ChangeLog
|
|
|
|
* files for a list of changes. These files are distributed with
|
|
|
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
|
|
|
*/
|
|
|
|
|
2008-06-22 14:28:52 +00:00
|
|
|
#include "config.h"
|
1998-09-15 17:08:38 +00:00
|
|
|
#include <stdlib.h>
|
1997-11-24 22:37:52 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
2002-01-04 05:58:01 +00:00
|
|
|
#include "gdk.h" /* For gdk_flush() */
|
1999-10-01 23:18:30 +00:00
|
|
|
#include "gdkimage.h"
|
1997-11-24 22:37:52 +00:00
|
|
|
#include "gdkprivate.h"
|
2002-01-04 05:58:01 +00:00
|
|
|
#include "gdkinternals.h" /* For scratch_image code */
|
2005-03-16 03:17:27 +00:00
|
|
|
#include "gdkalias.h"
|
1997-11-24 22:37:52 +00:00
|
|
|
|
Clip the retrieved image data to the screen, using a server grab to avoid
2001-06-28 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkimage-x11.c (_gdk_x11_get_image): Clip the retrieved
image data to the screen, using a server grab to avoid race
conditions.
* gtk/gtkitemfactory.c (gtk_item_factory_create_item): remove
check for NULL return from gtk_image_new_from_stock(), it never
returns NULL.
(gtk_item_factory_create_item): fix bug where we parsed the stock
ID as an inline pixbuf
* gtk/gtktext.c (gtk_text_key_press): numeric keypad support
* gtk/gtkspinbutton.c (gtk_spin_button_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkoptionmenu.c (gtk_option_menu_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkmenushell.c (gtk_menu_shell_class_init): numeric keypad
support
* gtk/gtkmenu.c (gtk_menu_class_init): numeric keypad support
* gtk/gtkmenubar.c (gtk_menu_bar_class_init): numeric keypad
* gtk/gtklistitem.c (gtk_list_item_class_init): numeric keypad
* gtk/gtkimcontextsimple.c
(gtk_im_context_simple_filter_keypress): keypad
* gtk/gtkfilesel.c (gtk_file_selection_key_press): keypad
* gtk/gtkentry.c (gtk_entry_class_init): numeric keypad fixes
* gtk/gtkctree.c (gtk_ctree_class_init): numeric keypad support
* gtk/gtkcolorsel.c (palette_activate): keypad support (of course,
should be binding-setted)
* gtk/gtkwindow.c (gtk_window_class_init): numeric keypad fixes
* gtk/gtkclist.c (gtk_clist_class_init): numeric keypad fixes
* gtk/gtkcalendar.c: numeric keypad fixes
* gtk/gtktextview.c (gtk_text_view_class_init): numeric keypad
support
* gdk/gdkwindow.c (gdk_window_get_clip_region): fix infinite loop
screwup
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
clip the render area to the drawable's clip region in advance,
so we don't get data from the server that we don't need.
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
check return value of gdk_pixbuf_get_from_drawable(), fall back
to bilevel alpha if we can't get the pixbuf to composite against.
* gdk/gdkdraw.c (gdk_drawable_get_image): set the image colormap
* gdk/gdkimage.c (gdk_image_get_colormap): add
gdk_image_set_colormap, gdk_image_get_colormap
* gdk/gdkpixbuf-drawable.c (rgbconvert): Change all converters to
take a region of the image, instead of converting the entire
image.
* gtk/gtkwidget.h (struct _GtkWidgetClass): add show_help
keybinding signal. Add default bindings for it. Add default
handler for show_help that shows the tooltip for the widget.
* gtk/gtkdialog.c (gtk_dialog_class_init): add binding set and
"close" keybinding signal, remove key press handler.
* gtk/gtktooltips.c (gtk_tooltips_set_colors): Just remove this,
it's not our usual practice to leave a deprecated function around
with a runtime warning, plus we don't want it to appear in docs,
plus if we make them yellow no one will want to change them
anyhow.
2001-06-29 01:59:02 +00:00
|
|
|
/**
|
|
|
|
* gdk_image_set_colormap:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
* @colormap: a #GdkColormap
|
|
|
|
*
|
|
|
|
* Sets the colormap for the image to the given colormap. Normally
|
|
|
|
* there's no need to use this function, images are created with the
|
|
|
|
* correct colormap if you get the image from a drawable. If you
|
|
|
|
* create the image from scratch, use the colormap of the drawable you
|
|
|
|
* intend to render the image to.
|
|
|
|
**/
|
|
|
|
void
|
|
|
|
gdk_image_set_colormap (GdkImage *image,
|
|
|
|
GdkColormap *colormap)
|
|
|
|
{
|
|
|
|
g_return_if_fail (GDK_IS_IMAGE (image));
|
|
|
|
g_return_if_fail (GDK_IS_COLORMAP (colormap));
|
|
|
|
|
|
|
|
if (image->colormap != colormap)
|
|
|
|
{
|
|
|
|
if (image->colormap)
|
2002-09-25 07:23:55 +00:00
|
|
|
g_object_unref (image->colormap);
|
Clip the retrieved image data to the screen, using a server grab to avoid
2001-06-28 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkimage-x11.c (_gdk_x11_get_image): Clip the retrieved
image data to the screen, using a server grab to avoid race
conditions.
* gtk/gtkitemfactory.c (gtk_item_factory_create_item): remove
check for NULL return from gtk_image_new_from_stock(), it never
returns NULL.
(gtk_item_factory_create_item): fix bug where we parsed the stock
ID as an inline pixbuf
* gtk/gtktext.c (gtk_text_key_press): numeric keypad support
* gtk/gtkspinbutton.c (gtk_spin_button_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkoptionmenu.c (gtk_option_menu_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkmenushell.c (gtk_menu_shell_class_init): numeric keypad
support
* gtk/gtkmenu.c (gtk_menu_class_init): numeric keypad support
* gtk/gtkmenubar.c (gtk_menu_bar_class_init): numeric keypad
* gtk/gtklistitem.c (gtk_list_item_class_init): numeric keypad
* gtk/gtkimcontextsimple.c
(gtk_im_context_simple_filter_keypress): keypad
* gtk/gtkfilesel.c (gtk_file_selection_key_press): keypad
* gtk/gtkentry.c (gtk_entry_class_init): numeric keypad fixes
* gtk/gtkctree.c (gtk_ctree_class_init): numeric keypad support
* gtk/gtkcolorsel.c (palette_activate): keypad support (of course,
should be binding-setted)
* gtk/gtkwindow.c (gtk_window_class_init): numeric keypad fixes
* gtk/gtkclist.c (gtk_clist_class_init): numeric keypad fixes
* gtk/gtkcalendar.c: numeric keypad fixes
* gtk/gtktextview.c (gtk_text_view_class_init): numeric keypad
support
* gdk/gdkwindow.c (gdk_window_get_clip_region): fix infinite loop
screwup
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
clip the render area to the drawable's clip region in advance,
so we don't get data from the server that we don't need.
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
check return value of gdk_pixbuf_get_from_drawable(), fall back
to bilevel alpha if we can't get the pixbuf to composite against.
* gdk/gdkdraw.c (gdk_drawable_get_image): set the image colormap
* gdk/gdkimage.c (gdk_image_get_colormap): add
gdk_image_set_colormap, gdk_image_get_colormap
* gdk/gdkpixbuf-drawable.c (rgbconvert): Change all converters to
take a region of the image, instead of converting the entire
image.
* gtk/gtkwidget.h (struct _GtkWidgetClass): add show_help
keybinding signal. Add default bindings for it. Add default
handler for show_help that shows the tooltip for the widget.
* gtk/gtkdialog.c (gtk_dialog_class_init): add binding set and
"close" keybinding signal, remove key press handler.
* gtk/gtktooltips.c (gtk_tooltips_set_colors): Just remove this,
it's not our usual practice to leave a deprecated function around
with a runtime warning, plus we don't want it to appear in docs,
plus if we make them yellow no one will want to change them
anyhow.
2001-06-29 01:59:02 +00:00
|
|
|
|
|
|
|
image->colormap = colormap;
|
2002-09-25 07:23:55 +00:00
|
|
|
g_object_ref (image->colormap);
|
Clip the retrieved image data to the screen, using a server grab to avoid
2001-06-28 Havoc Pennington <hp@pobox.com>
* gdk/x11/gdkimage-x11.c (_gdk_x11_get_image): Clip the retrieved
image data to the screen, using a server grab to avoid race
conditions.
* gtk/gtkitemfactory.c (gtk_item_factory_create_item): remove
check for NULL return from gtk_image_new_from_stock(), it never
returns NULL.
(gtk_item_factory_create_item): fix bug where we parsed the stock
ID as an inline pixbuf
* gtk/gtktext.c (gtk_text_key_press): numeric keypad support
* gtk/gtkspinbutton.c (gtk_spin_button_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkoptionmenu.c (gtk_option_menu_key_press): numeric keypad
support (should be using binding set here)
* gtk/gtkmenushell.c (gtk_menu_shell_class_init): numeric keypad
support
* gtk/gtkmenu.c (gtk_menu_class_init): numeric keypad support
* gtk/gtkmenubar.c (gtk_menu_bar_class_init): numeric keypad
* gtk/gtklistitem.c (gtk_list_item_class_init): numeric keypad
* gtk/gtkimcontextsimple.c
(gtk_im_context_simple_filter_keypress): keypad
* gtk/gtkfilesel.c (gtk_file_selection_key_press): keypad
* gtk/gtkentry.c (gtk_entry_class_init): numeric keypad fixes
* gtk/gtkctree.c (gtk_ctree_class_init): numeric keypad support
* gtk/gtkcolorsel.c (palette_activate): keypad support (of course,
should be binding-setted)
* gtk/gtkwindow.c (gtk_window_class_init): numeric keypad fixes
* gtk/gtkclist.c (gtk_clist_class_init): numeric keypad fixes
* gtk/gtkcalendar.c: numeric keypad fixes
* gtk/gtktextview.c (gtk_text_view_class_init): numeric keypad
support
* gdk/gdkwindow.c (gdk_window_get_clip_region): fix infinite loop
screwup
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
clip the render area to the drawable's clip region in advance,
so we don't get data from the server that we don't need.
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
check return value of gdk_pixbuf_get_from_drawable(), fall back
to bilevel alpha if we can't get the pixbuf to composite against.
* gdk/gdkdraw.c (gdk_drawable_get_image): set the image colormap
* gdk/gdkimage.c (gdk_image_get_colormap): add
gdk_image_set_colormap, gdk_image_get_colormap
* gdk/gdkpixbuf-drawable.c (rgbconvert): Change all converters to
take a region of the image, instead of converting the entire
image.
* gtk/gtkwidget.h (struct _GtkWidgetClass): add show_help
keybinding signal. Add default bindings for it. Add default
handler for show_help that shows the tooltip for the widget.
* gtk/gtkdialog.c (gtk_dialog_class_init): add binding set and
"close" keybinding signal, remove key press handler.
* gtk/gtktooltips.c (gtk_tooltips_set_colors): Just remove this,
it's not our usual practice to leave a deprecated function around
with a runtime warning, plus we don't want it to appear in docs,
plus if we make them yellow no one will want to change them
anyhow.
2001-06-29 01:59:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_colormap:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Retrieves the colormap for a given image, if it exists. An image
|
|
|
|
* will have a colormap if the drawable from which it was created has
|
|
|
|
* a colormap, or if a colormap was set explicitely with
|
|
|
|
* gdk_image_set_colormap().
|
|
|
|
*
|
|
|
|
* Return value: colormap for the image
|
|
|
|
**/
|
|
|
|
GdkColormap *
|
|
|
|
gdk_image_get_colormap (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), NULL);
|
|
|
|
|
|
|
|
return image->colormap;
|
|
|
|
}
|
2002-01-04 05:58:01 +00:00
|
|
|
|
2010-05-25 15:54:16 +00:00
|
|
|
/**
|
|
|
|
* gdk_image_get_image_type:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the type of a given image.
|
|
|
|
*
|
|
|
|
* Return value: the #GdkImageType of the image
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
GdkImageType
|
|
|
|
gdk_image_get_image_type (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->type;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_visual:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the visual that was used to create the image.
|
|
|
|
*
|
|
|
|
* Return value: a #GdkVisual
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
GdkVisual *
|
|
|
|
gdk_image_get_visual (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), NULL);
|
|
|
|
|
|
|
|
return image->visual;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_byte_order:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the byte order of the image.
|
|
|
|
*
|
|
|
|
* Return value: a #GdkVisual
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
GdkByteOrder
|
|
|
|
gdk_image_get_byte_order (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->byte_order;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_width:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the width of the image.
|
|
|
|
*
|
|
|
|
* Return value: the width
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
gint
|
|
|
|
gdk_image_get_width (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->width;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_height:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the height of the image.
|
|
|
|
*
|
|
|
|
* Return value: the height
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
gint
|
|
|
|
gdk_image_get_height (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->height;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_depth:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the depth of the image.
|
|
|
|
*
|
|
|
|
* Return value: the depth
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
guint16
|
|
|
|
gdk_image_get_depth (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->depth;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_bytes_per_pixel:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the number of bytes per pixel of the image.
|
|
|
|
*
|
|
|
|
* Return value: the bytes per pixel
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
guint16
|
|
|
|
gdk_image_get_bytes_per_pixel (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->bpp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_bytes_per_line:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the number of bytes per line of the image.
|
|
|
|
*
|
|
|
|
* Return value: the bytes per line
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
guint16
|
|
|
|
gdk_image_get_bytes_per_line (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->bpl;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gdk_image_get_bits_per_pixel:
|
|
|
|
* @image: a #GdkImage
|
|
|
|
*
|
|
|
|
* Determines the number of bits per pixel of the image.
|
|
|
|
*
|
|
|
|
* Return value: the bits per pixel
|
|
|
|
*
|
|
|
|
* Since: 2.22
|
|
|
|
**/
|
|
|
|
guint16
|
|
|
|
gdk_image_get_bits_per_pixel (GdkImage *image)
|
|
|
|
{
|
|
|
|
g_return_val_if_fail (GDK_IS_IMAGE (image), 0);
|
|
|
|
|
|
|
|
return image->bits_per_pixel;
|
|
|
|
}
|
|
|
|
|
2002-01-04 05:58:01 +00:00
|
|
|
/* We have N_REGION GDK_SCRATCH_IMAGE_WIDTH x GDK_SCRATCH_IMAGE_HEIGHT regions divided
|
|
|
|
* up between n_images different images. possible_n_images gives
|
|
|
|
* various divisors of N_REGIONS. The reason for allowing this
|
|
|
|
* flexibility is that we want to create as few images as possible,
|
|
|
|
* but we want to deal with the abberant systems that have a SHMMAX
|
|
|
|
* limit less than
|
|
|
|
*
|
|
|
|
* GDK_SCRATCH_IMAGE_WIDTH * GDK_SCRATCH_IMAGE_HEIGHT * N_REGIONS * 4 (384k)
|
|
|
|
*
|
|
|
|
* (Are there any such?)
|
|
|
|
*/
|
|
|
|
#define N_REGIONS 6
|
|
|
|
static const int possible_n_images[] = { 1, 2, 3, 6 };
|
|
|
|
|
|
|
|
/* We allocate one GdkScratchImageInfo structure for each
|
|
|
|
* depth where we are allocating scratch images. (Future: one
|
|
|
|
* per depth, per display)
|
|
|
|
*/
|
|
|
|
typedef struct _GdkScratchImageInfo GdkScratchImageInfo;
|
|
|
|
|
|
|
|
struct _GdkScratchImageInfo {
|
|
|
|
gint depth;
|
|
|
|
|
|
|
|
gint n_images;
|
|
|
|
GdkImage *static_image[N_REGIONS];
|
|
|
|
gint static_image_idx;
|
|
|
|
|
|
|
|
/* In order to optimize filling fractions, we simultaneously fill in up
|
|
|
|
* to three regions of size GDK_SCRATCH_IMAGE_WIDTH * GDK_SCRATCH_IMAGE_HEIGHT: one
|
|
|
|
* for images that are taller than GDK_SCRATCH_IMAGE_HEIGHT / 2, and must
|
|
|
|
* be tiled horizontally. One for images that are wider than
|
|
|
|
* GDK_SCRATCH_IMAGE_WIDTH / 2 and must be tiled vertically, and a third
|
|
|
|
* for images smaller than GDK_SCRATCH_IMAGE_HEIGHT / 2 x GDK_SCRATCH_IMAGE_WIDTH x 2
|
|
|
|
* that we tile in horizontal rows.
|
|
|
|
*/
|
|
|
|
gint horiz_idx;
|
|
|
|
gint horiz_y;
|
|
|
|
gint vert_idx;
|
|
|
|
gint vert_x;
|
|
|
|
|
|
|
|
/* tile_y1 and tile_y2 define the horizontal band into
|
|
|
|
* which we are tiling images. tile_x is the x extent to
|
|
|
|
* which that is filled
|
|
|
|
*/
|
|
|
|
gint tile_idx;
|
|
|
|
gint tile_x;
|
|
|
|
gint tile_y1;
|
|
|
|
gint tile_y2;
|
2002-04-25 22:29:14 +00:00
|
|
|
|
|
|
|
GdkScreen *screen;
|
2002-01-04 05:58:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static GSList *scratch_image_infos = NULL;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
allocate_scratch_images (GdkScratchImageInfo *info,
|
|
|
|
gint n_images,
|
|
|
|
gboolean shared)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
for (i = 0; i < n_images; i++)
|
|
|
|
{
|
2002-04-25 22:29:14 +00:00
|
|
|
info->static_image[i] = _gdk_image_new_for_depth (info->screen,
|
|
|
|
shared ? GDK_IMAGE_SHARED : GDK_IMAGE_NORMAL,
|
2002-01-04 05:58:01 +00:00
|
|
|
NULL,
|
2002-04-25 22:29:14 +00:00
|
|
|
GDK_SCRATCH_IMAGE_WIDTH * (N_REGIONS / n_images),
|
|
|
|
GDK_SCRATCH_IMAGE_HEIGHT,
|
2002-01-04 05:58:01 +00:00
|
|
|
info->depth);
|
|
|
|
|
|
|
|
if (!info->static_image[i])
|
|
|
|
{
|
|
|
|
gint j;
|
|
|
|
|
|
|
|
for (j = 0; j < i; j++)
|
2004-08-24 14:32:15 +00:00
|
|
|
g_object_unref (info->static_image[j]);
|
2002-01-04 05:58:01 +00:00
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2006-01-12 13:50:51 +00:00
|
|
|
static void
|
|
|
|
scratch_image_info_display_closed (GdkDisplay *display,
|
|
|
|
gboolean is_error,
|
|
|
|
GdkScratchImageInfo *image_info)
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
g_signal_handlers_disconnect_by_func (display,
|
|
|
|
scratch_image_info_display_closed,
|
|
|
|
image_info);
|
|
|
|
|
|
|
|
scratch_image_infos = g_slist_remove (scratch_image_infos, image_info);
|
|
|
|
|
|
|
|
for (i = 0; i < image_info->n_images; i++)
|
|
|
|
g_object_unref (image_info->static_image[i]);
|
|
|
|
|
|
|
|
g_free (image_info);
|
|
|
|
}
|
|
|
|
|
2002-01-31 15:48:58 +00:00
|
|
|
static GdkScratchImageInfo *
|
2002-04-25 22:29:14 +00:00
|
|
|
scratch_image_info_for_depth (GdkScreen *screen,
|
|
|
|
gint depth)
|
2002-01-04 05:58:01 +00:00
|
|
|
{
|
|
|
|
GSList *tmp_list;
|
|
|
|
GdkScratchImageInfo *image_info;
|
|
|
|
gint i;
|
|
|
|
|
|
|
|
tmp_list = scratch_image_infos;
|
|
|
|
while (tmp_list)
|
|
|
|
{
|
|
|
|
image_info = tmp_list->data;
|
2002-04-25 22:29:14 +00:00
|
|
|
if (image_info->depth == depth && image_info->screen == screen)
|
2002-01-04 05:58:01 +00:00
|
|
|
return image_info;
|
|
|
|
|
|
|
|
tmp_list = tmp_list->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
image_info = g_new (GdkScratchImageInfo, 1);
|
|
|
|
|
|
|
|
image_info->depth = depth;
|
2002-04-25 22:29:14 +00:00
|
|
|
image_info->screen = screen;
|
2002-01-04 05:58:01 +00:00
|
|
|
|
2006-01-12 13:50:51 +00:00
|
|
|
g_signal_connect (gdk_screen_get_display (screen), "closed",
|
|
|
|
G_CALLBACK (scratch_image_info_display_closed),
|
|
|
|
image_info);
|
|
|
|
|
2004-02-02 23:26:55 +00:00
|
|
|
/* Try to allocate as few possible shared images */
|
2002-01-04 05:58:01 +00:00
|
|
|
for (i=0; i < G_N_ELEMENTS (possible_n_images); i++)
|
|
|
|
{
|
|
|
|
if (allocate_scratch_images (image_info, possible_n_images[i], TRUE))
|
|
|
|
{
|
|
|
|
image_info->n_images = possible_n_images[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If that fails, just allocate N_REGIONS normal images */
|
|
|
|
if (i == G_N_ELEMENTS (possible_n_images))
|
|
|
|
{
|
|
|
|
allocate_scratch_images (image_info, N_REGIONS, FALSE);
|
|
|
|
image_info->n_images = N_REGIONS;
|
|
|
|
}
|
|
|
|
|
|
|
|
image_info->static_image_idx = 0;
|
|
|
|
|
|
|
|
image_info->horiz_y = GDK_SCRATCH_IMAGE_HEIGHT;
|
|
|
|
image_info->vert_x = GDK_SCRATCH_IMAGE_WIDTH;
|
|
|
|
image_info->tile_x = GDK_SCRATCH_IMAGE_WIDTH;
|
|
|
|
image_info->tile_y1 = image_info->tile_y2 = GDK_SCRATCH_IMAGE_HEIGHT;
|
|
|
|
|
|
|
|
scratch_image_infos = g_slist_prepend (scratch_image_infos, image_info);
|
|
|
|
|
|
|
|
return image_info;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Defining NO_FLUSH can cause inconsistent screen updates, but is useful
|
|
|
|
for performance evaluation. */
|
|
|
|
|
|
|
|
#undef NO_FLUSH
|
|
|
|
|
|
|
|
#ifdef VERBOSE
|
|
|
|
static gint sincelast;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static gint
|
|
|
|
alloc_scratch_image (GdkScratchImageInfo *image_info)
|
|
|
|
{
|
|
|
|
if (image_info->static_image_idx == N_REGIONS)
|
|
|
|
{
|
|
|
|
#ifndef NO_FLUSH
|
|
|
|
gdk_flush ();
|
|
|
|
#endif
|
|
|
|
#ifdef VERBOSE
|
|
|
|
g_print ("flush, %d puts since last flush\n", sincelast);
|
|
|
|
sincelast = 0;
|
|
|
|
#endif
|
|
|
|
image_info->static_image_idx = 0;
|
|
|
|
|
|
|
|
/* Mark all regions that we might be filling in as completely
|
|
|
|
* full, to force new tiles to be allocated for subsequent
|
|
|
|
* images
|
|
|
|
*/
|
|
|
|
image_info->horiz_y = GDK_SCRATCH_IMAGE_HEIGHT;
|
|
|
|
image_info->vert_x = GDK_SCRATCH_IMAGE_WIDTH;
|
|
|
|
image_info->tile_x = GDK_SCRATCH_IMAGE_WIDTH;
|
|
|
|
image_info->tile_y1 = image_info->tile_y2 = GDK_SCRATCH_IMAGE_HEIGHT;
|
|
|
|
}
|
|
|
|
return image_info->static_image_idx++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* _gdk_image_get_scratch:
|
2002-04-25 22:29:14 +00:00
|
|
|
* @screen: a #GdkScreen
|
2002-01-04 05:58:01 +00:00
|
|
|
* @width: desired width
|
|
|
|
* @height: desired height
|
|
|
|
* @depth: depth of image
|
|
|
|
* @x: X location within returned image of scratch image
|
|
|
|
* @y: Y location within returned image of scratch image
|
|
|
|
*
|
|
|
|
* Allocates an image of size width/height, up to a maximum
|
2002-04-25 22:29:14 +00:00
|
|
|
* of GDK_SCRATCH_IMAGE_WIDTHxGDK_SCRATCH_IMAGE_HEIGHT that is
|
|
|
|
* suitable to use on @screen.
|
2002-01-04 05:58:01 +00:00
|
|
|
*
|
|
|
|
* Return value: a scratch image. This must be used by a
|
|
|
|
* call to gdk_image_put() before any other calls to
|
|
|
|
* _gdk_image_get_scratch()
|
|
|
|
**/
|
|
|
|
GdkImage *
|
2002-04-25 22:29:14 +00:00
|
|
|
_gdk_image_get_scratch (GdkScreen *screen,
|
|
|
|
gint width,
|
|
|
|
gint height,
|
|
|
|
gint depth,
|
|
|
|
gint *x,
|
|
|
|
gint *y)
|
2002-01-04 05:58:01 +00:00
|
|
|
{
|
|
|
|
GdkScratchImageInfo *image_info;
|
|
|
|
GdkImage *image;
|
|
|
|
gint idx;
|
2002-04-25 22:29:14 +00:00
|
|
|
|
|
|
|
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
|
2002-01-04 05:58:01 +00:00
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
image_info = scratch_image_info_for_depth (screen, depth);
|
2002-01-04 05:58:01 +00:00
|
|
|
|
|
|
|
if (width >= (GDK_SCRATCH_IMAGE_WIDTH >> 1))
|
|
|
|
{
|
|
|
|
if (height >= (GDK_SCRATCH_IMAGE_HEIGHT >> 1))
|
|
|
|
{
|
|
|
|
idx = alloc_scratch_image (image_info);
|
|
|
|
*x = 0;
|
|
|
|
*y = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (height + image_info->horiz_y > GDK_SCRATCH_IMAGE_HEIGHT)
|
|
|
|
{
|
|
|
|
image_info->horiz_idx = alloc_scratch_image (image_info);
|
|
|
|
image_info->horiz_y = 0;
|
|
|
|
}
|
|
|
|
idx = image_info->horiz_idx;
|
|
|
|
*x = 0;
|
|
|
|
*y = image_info->horiz_y;
|
|
|
|
image_info->horiz_y += height;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (height >= (GDK_SCRATCH_IMAGE_HEIGHT >> 1))
|
|
|
|
{
|
|
|
|
if (width + image_info->vert_x > GDK_SCRATCH_IMAGE_WIDTH)
|
|
|
|
{
|
|
|
|
image_info->vert_idx = alloc_scratch_image (image_info);
|
|
|
|
image_info->vert_x = 0;
|
|
|
|
}
|
|
|
|
idx = image_info->vert_idx;
|
|
|
|
*x = image_info->vert_x;
|
|
|
|
*y = 0;
|
|
|
|
/* using 3 and -4 would be slightly more efficient on 32-bit machines
|
|
|
|
with > 1bpp displays */
|
|
|
|
image_info->vert_x += (width + 7) & -8;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (width + image_info->tile_x > GDK_SCRATCH_IMAGE_WIDTH)
|
|
|
|
{
|
|
|
|
image_info->tile_y1 = image_info->tile_y2;
|
|
|
|
image_info->tile_x = 0;
|
|
|
|
}
|
|
|
|
if (height + image_info->tile_y1 > GDK_SCRATCH_IMAGE_HEIGHT)
|
|
|
|
{
|
|
|
|
image_info->tile_idx = alloc_scratch_image (image_info);
|
|
|
|
image_info->tile_x = 0;
|
|
|
|
image_info->tile_y1 = 0;
|
|
|
|
image_info->tile_y2 = 0;
|
|
|
|
}
|
|
|
|
if (height + image_info->tile_y1 > image_info->tile_y2)
|
|
|
|
image_info->tile_y2 = height + image_info->tile_y1;
|
|
|
|
idx = image_info->tile_idx;
|
|
|
|
*x = image_info->tile_x;
|
|
|
|
*y = image_info->tile_y1;
|
|
|
|
image_info->tile_x += (width + 7) & -8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
image = image_info->static_image[idx * image_info->n_images / N_REGIONS];
|
|
|
|
*x += GDK_SCRATCH_IMAGE_WIDTH * (idx % (N_REGIONS / image_info->n_images));
|
|
|
|
#ifdef VERBOSE
|
|
|
|
g_print ("index %d, x %d, y %d (%d x %d)\n", idx, *x, *y, width, height);
|
|
|
|
sincelast++;
|
|
|
|
#endif
|
|
|
|
return image;
|
|
|
|
}
|
Changes multihead reorganizing code for win32 support, mostly from a patch
Wed Jun 5 18:34:47 2002 Owen Taylor <otaylor@redhat.com>
Changes multihead reorganizing code for win32 support,
mostly from a patch by Hans Breuer.
* gdk/gdkcolor.c gdk/x11/gdkcolor-x11.c gdk/gdkcursor.c
gdk/x11/gdkcursor-x11.c gdk/gdkevents.c gdk/x11/gdkevents-x11.c
gdk/gdkfont.c gdk/x11/gdkfont-x11.c gdk/gdkkeys.c
gdk/x11/gdkkeys-x11.c gdk/gdkimage.c gdk/x11/gdkimage-x11.c
gdk/gdkscreen.c gdk/x11/gdkmain-x11.c
gdk/gdkdisplay.c gdk/gdkevents-x11.c gdk/gdkpango.c
gdk/x11/gdkpango-x11.c gdk/gdkselection.c
gdk/x11/gdkselection-x11.c gdk/gdkwindow.c
gdk/x11/gdkwindow-x11.c gdk/gdkvisual.c gdk/x11/gdkvisual-x11.c:
Move port-independent singlehead wrapper functions into
port-independent part of GDK. (#80009)
* gdk/win32/gdkcolor-win32.c gdk/win32/gdkcursor-win32.c
gdk/win32/gdkevents-win32.c gdk/win32/gdkfont-win32.c
gdk/win32/gdkimage-win32.c gdk/win32/gdkkeys-win32.c
gdk/win32/gdkmain-win32.c gdk/win32/gdkproperty-win32.c
gdk/win32/gdkselection-win32.c gdk/win32/gkwindow-win32.c:
Turn singlehead functions into "multihead" functions that ignore
their GdkDisplay or GdkScreen arguments.
* gdk/win32/gdkdrawable-win32.c gdk/win32/gdkevents-win32.c
gdk/win32/gdkinput-win32.c gdk/win32/gdkprivate-win32.h:
Misc multihead-compatibility changes.
* gtk/gtk.def gdk/gdk.def: Update for multihead functions.
* gdk/gdkcolormap.h gdk/gdkvisual.h gdk/x11/gdkcolormap-x11.c
gdk/x11/gdkvisual-x11.c: Remove the screen fields
from the public parts of the colormap/visual structures, add accessors
instead.
* gdk/gdkpixbuf-render.c gdk/gdkpixmap.c gdk/gdkrgb.c
gdk/x11/gdkcolormap-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkimage-x11.c gdk/x11/gdkprivate-x11.h gtk/gtkgc.c
gtk/gtkstyle.c gtk/gtkwidget.c: Use accessors to get the screen
for colormaps, visuals; move the fields into the private
structures for the x11 backend.
* gdk/gdkdisplay.[ch] gdk/x11/gdkdisplay-x11.[ch]
gdk/gdkscreen.[ch] gdk/x11/gdkscreen-x11.c:
Remove virtualization of screen and display functions.
(#79990, patch from Erwann Chenede)
* gdk/win32/gdkdisplay-x11.c gdk/win32/gdkscreen-win32.c
gdk/win32/{Makefile.am, makefile.msc, makefile.mingw}:
New files containing stub implementations of Display,
Screen functions.
* gdk/x11/gdkscreen-x11.[ch] gdk/x11/gdkdisplay-x11.[ch]
gdk/x11/gdkx.h: Clean up function exports and what
headers they are in. (#79954)
* gdk/x11/gdkx.h: Fix macro that was referring to a non-existant
screen->screen_num. (In the patch for #79972, Erwann Chenede)
* gdk/gdkscreen.c gdk/gdkwindow.c gdk/x11/gdkinternals.h
gdk/x11/gdkscreen-x11.c: Fix gdk_screen_get_window_at_pointer()
to use window hooks. (#79972, patch partly from Erwann Chenede)
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkevents-x11.c: Fix
some warnings.
2002-06-06 00:26:42 +00:00
|
|
|
|
|
|
|
GdkImage*
|
|
|
|
gdk_image_new (GdkImageType type,
|
|
|
|
GdkVisual *visual,
|
|
|
|
gint width,
|
|
|
|
gint height)
|
|
|
|
{
|
|
|
|
return _gdk_image_new_for_depth (gdk_visual_get_screen (visual), type,
|
|
|
|
visual, width, height, -1);
|
|
|
|
}
|
2005-03-16 03:17:27 +00:00
|
|
|
|
|
|
|
#define __GDK_IMAGE_C__
|
|
|
|
#include "gdkaliasdef.c"
|