Blame gtk/gtkpreview.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include <math.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include <sys/types.h>
Packit Service fb6fa5
#ifdef HAVE_SYS_PARAM_H
Packit Service fb6fa5
#include <sys/param.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#undef GDK_DISABLE_DEPRECATED
Packit Service fb6fa5
#undef GTK_DISABLE_DEPRECATED
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkpreview.h"
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
#define PREVIEW_CLASS(w)      GTK_PREVIEW_CLASS (GTK_OBJECT (w)->klass)
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  PROP_0,
Packit Service fb6fa5
  PROP_EXPAND
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void   gtk_preview_set_property  (GObject          *object,
Packit Service fb6fa5
					 guint             prop_id,
Packit Service fb6fa5
					 const GValue     *value,
Packit Service fb6fa5
					 GParamSpec       *pspec);
Packit Service fb6fa5
static void   gtk_preview_get_property  (GObject          *object,
Packit Service fb6fa5
					 guint             prop_id,
Packit Service fb6fa5
					 GValue           *value,
Packit Service fb6fa5
					 GParamSpec       *pspec);
Packit Service fb6fa5
static void   gtk_preview_finalize      (GObject          *object);
Packit Service fb6fa5
static void   gtk_preview_realize       (GtkWidget        *widget);
Packit Service fb6fa5
static void   gtk_preview_size_allocate (GtkWidget        *widget,
Packit Service fb6fa5
					 GtkAllocation    *allocation);
Packit Service fb6fa5
static gint   gtk_preview_expose        (GtkWidget        *widget,
Packit Service fb6fa5
				         GdkEventExpose   *event);
Packit Service fb6fa5
static void   gtk_preview_make_buffer   (GtkPreview       *preview);
Packit Service fb6fa5
static void   gtk_fill_lookup_array     (guchar           *array);
Packit Service fb6fa5
Packit Service fb6fa5
static GtkPreviewClass *preview_class = NULL;
Packit Service fb6fa5
static gint install_cmap = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE (GtkPreview, gtk_preview, GTK_TYPE_WIDGET)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_class_init (GtkPreviewClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service fb6fa5
  GtkWidgetClass *widget_class;
Packit Service fb6fa5
Packit Service fb6fa5
  widget_class = (GtkWidgetClass*) klass;
Packit Service fb6fa5
Packit Service fb6fa5
  preview_class = klass;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class->finalize = gtk_preview_finalize;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class->set_property = gtk_preview_set_property;
Packit Service fb6fa5
  gobject_class->get_property = gtk_preview_get_property;
Packit Service fb6fa5
Packit Service fb6fa5
  widget_class->realize = gtk_preview_realize;
Packit Service fb6fa5
  widget_class->size_allocate = gtk_preview_size_allocate;
Packit Service fb6fa5
  widget_class->expose_event = gtk_preview_expose;
Packit Service fb6fa5
Packit Service fb6fa5
  klass->info.lookup = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  klass->info.gamma = 1.0;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_EXPAND,
Packit Service fb6fa5
                                   g_param_spec_boolean ("expand",
Packit Service fb6fa5
							 P_("Expand"),
Packit Service fb6fa5
							 P_("Whether the preview widget should take up the entire space it is allocated"),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_set_property (GObject      *object,
Packit Service fb6fa5
			  guint         prop_id,
Packit Service fb6fa5
			  const GValue *value,
Packit Service fb6fa5
			  GParamSpec   *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview = GTK_PREVIEW (object);
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_EXPAND:
Packit Service fb6fa5
      gtk_preview_set_expand (preview, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_get_property (GObject      *object,
Packit Service fb6fa5
			  guint         prop_id,
Packit Service fb6fa5
			  GValue       *value,
Packit Service fb6fa5
			  GParamSpec   *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview;
Packit Service fb6fa5
  
Packit Service fb6fa5
  preview = GTK_PREVIEW (object);
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_EXPAND:
Packit Service fb6fa5
      g_value_set_boolean (value, preview->expand);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_reset (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* unimplemented */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_init (GtkPreview *preview)
Packit Service fb6fa5
{
Packit Service fb6fa5
  preview->buffer = NULL;
Packit Service fb6fa5
  preview->buffer_width = 0;
Packit Service fb6fa5
  preview->buffer_height = 0;
Packit Service fb6fa5
  preview->expand = FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_uninit (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* unimplemented */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_preview_new (GtkPreviewType type)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview;
Packit Service fb6fa5
Packit Service fb6fa5
  preview = gtk_type_new (gtk_preview_get_type ());
Packit Service fb6fa5
  preview->type = type;
Packit Service fb6fa5
Packit Service fb6fa5
  if (type == GTK_PREVIEW_COLOR)
Packit Service fb6fa5
    preview->bpp = 3;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    preview->bpp = 1;
Packit Service fb6fa5
Packit Service fb6fa5
  preview->dither = GDK_RGB_DITHER_NORMAL;
Packit Service fb6fa5
Packit Service fb6fa5
  return GTK_WIDGET (preview);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_size (GtkPreview *preview,
Packit Service fb6fa5
		  gint        width,
Packit Service fb6fa5
		  gint        height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PREVIEW (preview));
Packit Service fb6fa5
Packit Service fb6fa5
  if ((width != GTK_WIDGET (preview)->requisition.width) ||
Packit Service fb6fa5
      (height != GTK_WIDGET (preview)->requisition.height))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_WIDGET (preview)->requisition.width = width;
Packit Service fb6fa5
      GTK_WIDGET (preview)->requisition.height = height;
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (preview->buffer);
Packit Service fb6fa5
      preview->buffer = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_put (GtkPreview   *preview,
Packit Service fb6fa5
		 GdkWindow    *window,
Packit Service fb6fa5
		 GdkGC        *gc,
Packit Service fb6fa5
		 gint          srcx,
Packit Service fb6fa5
		 gint          srcy,
Packit Service fb6fa5
		 gint          destx,
Packit Service fb6fa5
		 gint          desty,
Packit Service fb6fa5
		 gint          width,
Packit Service fb6fa5
		 gint          height)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkRectangle r1, r2, r3;
Packit Service fb6fa5
  guchar *src;
Packit Service fb6fa5
  guint bpp;
Packit Service fb6fa5
  guint rowstride;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PREVIEW (preview));
Packit Service fb6fa5
  g_return_if_fail (window != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!preview->buffer)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  r1.x = 0;
Packit Service fb6fa5
  r1.y = 0;
Packit Service fb6fa5
  r1.width = preview->buffer_width;
Packit Service fb6fa5
  r1.height = preview->buffer_height;
Packit Service fb6fa5
Packit Service fb6fa5
  r2.x = srcx;
Packit Service fb6fa5
  r2.y = srcy;
Packit Service fb6fa5
  r2.width = width;
Packit Service fb6fa5
  r2.height = height;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gdk_rectangle_intersect (&r1, &r2, &r3))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  bpp = preview->bpp;
Packit Service fb6fa5
  rowstride = preview->rowstride;
Packit Service fb6fa5
Packit Service fb6fa5
  src = preview->buffer + r3.y * rowstride + r3.x * bpp;
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview->type == GTK_PREVIEW_COLOR)
Packit Service fb6fa5
    gdk_draw_rgb_image (window,
Packit Service fb6fa5
			gc,
Packit Service fb6fa5
			destx + (r3.x - srcx),
Packit Service fb6fa5
			desty + (r3.y - srcy),
Packit Service fb6fa5
			r3.width,
Packit Service fb6fa5
			r3.height,
Packit Service fb6fa5
			preview->dither,
Packit Service fb6fa5
			src,
Packit Service fb6fa5
			rowstride);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    gdk_draw_gray_image (window,
Packit Service fb6fa5
			 gc,
Packit Service fb6fa5
			 destx + (r3.x - srcx),
Packit Service fb6fa5
			 desty + (r3.y - srcy),
Packit Service fb6fa5
			 r3.width,
Packit Service fb6fa5
			 r3.height,
Packit Service fb6fa5
			 preview->dither,
Packit Service fb6fa5
			 src,
Packit Service fb6fa5
			 rowstride);
Packit Service fb6fa5
			
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_draw_row (GtkPreview *preview,
Packit Service fb6fa5
		      guchar     *data,
Packit Service fb6fa5
		      gint        x,
Packit Service fb6fa5
		      gint        y,
Packit Service fb6fa5
		      gint        w)
Packit Service fb6fa5
{
Packit Service fb6fa5
  guint bpp;
Packit Service fb6fa5
  guint rowstride;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PREVIEW (preview));
Packit Service fb6fa5
  g_return_if_fail (data != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  bpp = (preview->type == GTK_PREVIEW_COLOR ? 3 : 1);
Packit Service fb6fa5
  rowstride = (preview->buffer_width * bpp + 3) & -4;
Packit Service fb6fa5
Packit Service fb6fa5
  if ((w <= 0) || (y < 0))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (data != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_preview_make_buffer (preview);
Packit Service fb6fa5
Packit Service fb6fa5
  if (x + w > preview->buffer_width)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (y + 1 > preview->buffer_height)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview_class->info.gamma == 1.0)
Packit Service fb6fa5
    memcpy (preview->buffer + y * rowstride + x * bpp, data, w * bpp);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      guint i, size;
Packit Service fb6fa5
      guchar *src, *dst;
Packit Service fb6fa5
      guchar *lookup;
Packit Service fb6fa5
Packit Service fb6fa5
      if (preview_class->info.lookup != NULL)
Packit Service fb6fa5
	lookup = preview_class->info.lookup;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  preview_class->info.lookup = g_new (guchar, 256);
Packit Service fb6fa5
	  gtk_fill_lookup_array (preview_class->info.lookup);
Packit Service fb6fa5
	  lookup = preview_class->info.lookup;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      size = w * bpp;
Packit Service fb6fa5
      src = data;
Packit Service fb6fa5
      dst = preview->buffer + y * rowstride + x * bpp;
Packit Service fb6fa5
      for (i = 0; i < size; i++)
Packit Service fb6fa5
	*dst++ = lookup[*src++];
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_expand (GtkPreview *preview,
Packit Service fb6fa5
			gboolean    expand)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PREVIEW (preview));
Packit Service fb6fa5
Packit Service fb6fa5
  expand = expand != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview->expand != expand)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      preview->expand = expand;
Packit Service fb6fa5
      gtk_widget_queue_resize (GTK_WIDGET (preview));
Packit Service fb6fa5
 
Packit Service fb6fa5
      g_object_notify (G_OBJECT (preview), "expand"); 
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_gamma (double _gamma)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!preview_class)
Packit Service fb6fa5
    preview_class = gtk_type_class (gtk_preview_get_type ());
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview_class->info.gamma != _gamma)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      preview_class->info.gamma = _gamma;
Packit Service fb6fa5
      if (preview_class->info.lookup != NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_free (preview_class->info.lookup);
Packit Service fb6fa5
	  preview_class->info.lookup = NULL;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_color_cube (guint nred_shades,
Packit Service fb6fa5
			    guint ngreen_shades,
Packit Service fb6fa5
			    guint nblue_shades,
Packit Service fb6fa5
			    guint ngray_shades)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* unimplemented */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_install_cmap (gint _install_cmap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* effectively unimplemented */
Packit Service fb6fa5
  install_cmap = _install_cmap;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_reserved (gint nreserved)
Packit Service fb6fa5
{
Packit Service fb6fa5
Packit Service fb6fa5
  /* unimplemented */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_preview_set_dither (GtkPreview      *preview,
Packit Service fb6fa5
			GdkRgbDither     dither)
Packit Service fb6fa5
{
Packit Service fb6fa5
  preview->dither = dither;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkVisual*
Packit Service fb6fa5
gtk_preview_get_visual (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_screen_get_rgb_visual (gdk_screen_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkColormap*
Packit Service fb6fa5
gtk_preview_get_cmap (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_screen_get_rgb_colormap (gdk_screen_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GtkPreviewInfo*
Packit Service fb6fa5
gtk_preview_get_info (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!preview_class)
Packit Service fb6fa5
    preview_class = gtk_type_class (gtk_preview_get_type ());
Packit Service fb6fa5
Packit Service fb6fa5
  return &preview_class->info;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_finalize (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview = GTK_PREVIEW (object);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (preview->buffer);
Packit Service fb6fa5
Packit Service fb6fa5
  G_OBJECT_CLASS (gtk_preview_parent_class)->finalize (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_realize (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview = GTK_PREVIEW (widget);
Packit Service fb6fa5
  GdkWindowAttr attributes;
Packit Service fb6fa5
  gint attributes_mask;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_set_realized (widget, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  attributes.window_type = GDK_WINDOW_CHILD;
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview->expand)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      attributes.width = widget->allocation.width;
Packit Service fb6fa5
      attributes.height = widget->allocation.height;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      attributes.width = MIN (widget->requisition.width, widget->allocation.width);
Packit Service fb6fa5
      attributes.height = MIN (widget->requisition.height, widget->allocation.height);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  attributes.x = widget->allocation.x + (widget->allocation.width - attributes.width) / 2;
Packit Service fb6fa5
  attributes.y = widget->allocation.y + (widget->allocation.height - attributes.height) / 2;;
Packit Service fb6fa5
Packit Service fb6fa5
  attributes.wclass = GDK_INPUT_OUTPUT;
Packit Service fb6fa5
  attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
Packit Service fb6fa5
  attributes_mask = GDK_WA_X | GDK_WA_Y;
Packit Service fb6fa5
Packit Service fb6fa5
  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
Packit Service fb6fa5
  gdk_window_set_user_data (widget->window, widget);
Packit Service fb6fa5
Packit Service fb6fa5
  widget->style = gtk_style_attach (widget->style, widget->window);
Packit Service fb6fa5
  gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void   
Packit Service fb6fa5
gtk_preview_size_allocate (GtkWidget        *widget,
Packit Service fb6fa5
			   GtkAllocation    *allocation)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview = GTK_PREVIEW (widget);
Packit Service fb6fa5
  gint width, height;
Packit Service fb6fa5
Packit Service fb6fa5
  widget->allocation = *allocation;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_widget_get_realized (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (preview->expand)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  width = widget->allocation.width;
Packit Service fb6fa5
	  height = widget->allocation.height;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  width = MIN (widget->allocation.width, widget->requisition.width);
Packit Service fb6fa5
	  height = MIN (widget->allocation.height, widget->requisition.height);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_window_move_resize (widget->window,
Packit Service fb6fa5
			      widget->allocation.x + (widget->allocation.width - width) / 2,
Packit Service fb6fa5
			      widget->allocation.y + (widget->allocation.height - height) / 2,
Packit Service fb6fa5
			      width, height);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gtk_preview_expose (GtkWidget      *widget,
Packit Service fb6fa5
		    GdkEventExpose *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPreview *preview;
Packit Service fb6fa5
  gint width, height;
Packit Service fb6fa5
Packit Service fb6fa5
  if (GTK_WIDGET_DRAWABLE (widget))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      preview = GTK_PREVIEW (widget);
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_drawable_get_size (widget->window, &width, &height);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_preview_put (GTK_PREVIEW (widget),
Packit Service fb6fa5
		       widget->window, widget->style->black_gc,
Packit Service fb6fa5
		       event->area.x - (width - preview->buffer_width)/2,
Packit Service fb6fa5
		       event->area.y - (height - preview->buffer_height)/2,
Packit Service fb6fa5
		       event->area.x, event->area.y,
Packit Service fb6fa5
		       event->area.width, event->area.height);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_preview_make_buffer (GtkPreview *preview)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *widget;
Packit Service fb6fa5
  gint width;
Packit Service fb6fa5
  gint height;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PREVIEW (preview));
Packit Service fb6fa5
Packit Service fb6fa5
  widget = GTK_WIDGET (preview);
Packit Service fb6fa5
Packit Service fb6fa5
  if (preview->expand &&
Packit Service fb6fa5
      (widget->allocation.width != 0) &&
Packit Service fb6fa5
      (widget->allocation.height != 0))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      width = widget->allocation.width;
Packit Service fb6fa5
      height = widget->allocation.height;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      width = widget->requisition.width;
Packit Service fb6fa5
      height = widget->requisition.height;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!preview->buffer ||
Packit Service fb6fa5
      (preview->buffer_width != width) ||
Packit Service fb6fa5
      (preview->buffer_height != height))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_free (preview->buffer);
Packit Service fb6fa5
Packit Service fb6fa5
      preview->buffer_width = width;
Packit Service fb6fa5
      preview->buffer_height = height;
Packit Service fb6fa5
Packit Service fb6fa5
      preview->rowstride = (preview->buffer_width * preview->bpp + 3) & -4;
Packit Service fb6fa5
      preview->buffer = g_new0 (guchar,
Packit Service fb6fa5
				preview->buffer_height *
Packit Service fb6fa5
				preview->rowstride);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This is used for implementing gamma. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_fill_lookup_array (guchar *array)
Packit Service fb6fa5
{
Packit Service fb6fa5
  double one_over_gamma;
Packit Service fb6fa5
  double ind;
Packit Service fb6fa5
  int val;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  one_over_gamma = 1.0 / preview_class->info.gamma;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < 256; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      ind = (double) i / 255.0;
Packit Service fb6fa5
      val = (int) (255 * pow (ind, one_over_gamma));
Packit Service fb6fa5
      array[i] = val;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_PREVIEW_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"