[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/gtkutil.c
From: |
Jan Dj�rv |
Subject: |
[Emacs-diffs] Changes to emacs/src/gtkutil.c |
Date: |
Mon, 14 Jun 2004 17:56:42 -0400 |
Index: emacs/src/gtkutil.c
diff -c emacs/src/gtkutil.c:1.38 emacs/src/gtkutil.c:1.39
*** emacs/src/gtkutil.c:1.38 Mon May 3 15:27:47 2004
--- emacs/src/gtkutil.c Mon Jun 14 21:53:24 2004
***************
*** 229,251 ****
return gdk_cursor_new_for_display (gdpy, GDK_LEFT_PTR);
}
! /* For the image defined in IMG, make and return a GdkPixmap for
! the pixmap in *GPIX, and a GdkBitmap for the mask in *GMASK.
! If IMG has no mask, *GMASK is set to NULL.
! The image is defined on the display where frame F is. */
! static void
! xg_get_gdk_pixmap_and_mask (f, img, gpix, gmask)
FRAME_PTR f;
struct image *img;
! GdkPixmap **gpix;
! GdkBitmap **gmask;
{
GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
! *gpix = gdk_pixmap_foreign_new_for_display (gdpy, img->pixmap);
! *gmask = img->mask ?
! (GdkBitmap*) gdk_pixmap_foreign_new_for_display (gdpy, img->mask)
! : 0;
}
--- 229,328 ----
return gdk_cursor_new_for_display (gdpy, GDK_LEFT_PTR);
}
! /* For the image defined in IMG, make and return a GtkImage. For displays
with
! 8 planes or less we must make a GdkPixbuf and apply the mask manually.
! Otherwise the highlightning and dimming the tool bar code in GTK does
! will look bad. For display with more than 8 planes we just use the
! pixmap and mask directly. For monochrome displays, GTK doesn't seem
! able to use external pixmaps, it looks bad whatever we do.
! The image is defined on the display where frame F is.
! WIDGET is used to find the GdkColormap to use for the GdkPixbuf.
! If OLD_WIDGET is NULL, a new widget is constructed and returned.
! If OLD_WIDGET is not NULL, that widget is modified. */
! static GtkWidget *
! xg_get_image_for_pixmap (f, img, widget, old_widget)
FRAME_PTR f;
struct image *img;
! GtkWidget *widget;
! GtkImage *old_widget;
{
+ GdkPixmap *gpix;
+ GdkPixmap *gmask;
GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
! gpix = gdk_pixmap_foreign_new_for_display (gdpy, img->pixmap);
! gmask = img->mask ? gdk_pixmap_foreign_new_for_display (gdpy, img->mask) :
0;
!
! if (x_screen_planes (f) > 8 || x_screen_planes (f) == 1)
! {
! if (! old_widget)
! old_widget = GTK_IMAGE (gtk_image_new_from_pixmap (gpix, gmask));
! else
! gtk_image_set_from_pixmap (old_widget, gpix, gmask);
! }
! else
! {
! int x, y, width, height, rowstride, mask_rowstride;
! GdkPixbuf *icon_buf, *tmp_buf;
! guchar *pixels;
! guchar *mask_pixels;
!
! gdk_drawable_get_size (gpix, &width, &height);
! tmp_buf = gdk_pixbuf_get_from_drawable (NULL,
! gpix,
! gtk_widget_get_colormap (widget),
! 0, 0, 0, 0, width, height);
! icon_buf = gdk_pixbuf_add_alpha (tmp_buf, FALSE, 0, 0, 0);
! g_object_unref (G_OBJECT (tmp_buf));
!
! if (gmask)
! {
! GdkPixbuf *mask_buf = gdk_pixbuf_get_from_drawable (NULL,
! gmask,
! NULL,
! 0, 0, 0, 0,
! width, height);
! guchar *pixels = gdk_pixbuf_get_pixels (icon_buf);
! guchar *mask_pixels = gdk_pixbuf_get_pixels (mask_buf);
! int rowstride = gdk_pixbuf_get_rowstride (icon_buf);
! int mask_rowstride = gdk_pixbuf_get_rowstride (mask_buf);
! int y;
!
! for (y = 0; y < height; ++y)
! {
! guchar *iconptr, *maskptr;
! int x;
!
! iconptr = pixels + y * rowstride;
! maskptr = mask_pixels + y * mask_rowstride;
!
! for (x = 0; x < width; ++x)
! {
! /* In a bitmap, RGB is either 255/255/255 or 0/0/0.
Checking
! just R is sufficient. */
! if (maskptr[0] == 0)
! iconptr[3] = 0; /* 0, 1, 2 is R, G, B. 3 is alpha. */
!
! iconptr += rowstride/width;
! maskptr += mask_rowstride/width;
! }
! }
!
! g_object_unref (G_OBJECT (gmask));
! g_object_unref (G_OBJECT (mask_buf));
! }
!
! g_object_unref (G_OBJECT (gpix));
!
! if (! old_widget)
! old_widget = GTK_IMAGE (gtk_image_new_from_pixbuf (icon_buf));
! else
! gtk_image_set_from_pixbuf (old_widget, icon_buf);
!
! g_object_unref (G_OBJECT (icon_buf));
! }
!
! return GTK_WIDGET (old_widget);
}
***************
*** 3205,3216 ****
if (! wicon)
{
! GdkPixmap *gpix;
! GdkBitmap *gmask;
! GtkWidget *w;
- xg_get_gdk_pixmap_and_mask (f, img, &gpix, &gmask);
- w = gtk_image_new_from_pixmap (gpix, gmask);
gtk_toolbar_append_item (GTK_TOOLBAR (x->toolbar_widget),
0, 0, 0,
w,
--- 3282,3289 ----
if (! wicon)
{
! GtkWidget *w = xg_get_image_for_pixmap (f, img, x->widget, NULL);
gtk_toolbar_append_item (GTK_TOOLBAR (x->toolbar_widget),
0, 0, 0,
w,
***************
*** 3267,3279 ****
g_list_free (chlist);
if (old_img != img->pixmap)
! {
! GdkPixmap *gpix;
! GdkBitmap *gmask;
!
! xg_get_gdk_pixmap_and_mask (f, img, &gpix, &gmask);
! gtk_image_set_from_pixmap (wimage, gpix, gmask);
! }
g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
(gpointer)img->pixmap);
--- 3340,3346 ----
g_list_free (chlist);
if (old_img != img->pixmap)
! (void) xg_get_image_for_pixmap (f, img, x->widget, wimage);
g_object_set_data (G_OBJECT (wimage), XG_TOOL_BAR_IMAGE_DATA,
(gpointer)img->pixmap);
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,
Jan Dj�rv <=