]> Pileus Git - ~andy/gtk/commitdiff
New function to create a pixbuf pointing to a subregion of another pixbuf.
authorHavoc Pennington <hp@pobox.com>
Wed, 1 Nov 2000 07:07:46 +0000 (07:07 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Wed, 1 Nov 2000 07:07:46 +0000 (07:07 +0000)
2000-11-01  Havoc Pennington  <hp@pobox.com>

* gdk-pixbuf.c (gdk_pixbuf_new_subpixbuf): New function to create
a pixbuf pointing to a subregion of another pixbuf.

2000-11-01  Havoc Pennington  <hp@pobox.com>

* gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
on a label
(gtk_label_finalize): unref the attr list if any.

* gtk/testgtk.c (create_get_image): close test on second click
(make_message_dialog): close dialog if it exists

* gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute

* gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
gdk-pixbuf

* gtk/gtklabel.c (gtk_label_set_markup): new function to set label
from Pango markup format
(gtk_label_set_markup_with_accel): ditto but with accelerator
parsing

* gtk/gtkimage.c (gtk_image_expose): reformatting.

* gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
reflect current state of GDK - use gdk_drawable_get_colormap, etc.
Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to
call gdk_window_get_origin().

* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
implement GDK_PIXBUF_ALPHA_FULL

22 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gdk-2.0.pc.in
gdk-pixbuf/ChangeLog
gdk-pixbuf/gdk-pixbuf.c
gdk-pixbuf/gdk-pixbuf.h
gdk/gdkpango.c
gdk/gdkpixbuf-drawable.c
gdk/gdkpixbuf-render.c
gtk/gtkimage.c
gtk/gtklabel.c
gtk/gtklabel.h
gtk/gtktextbuffer.c
gtk/testgtk.c
tests/testgtk.c

index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 88b586bf5a748e091c2ee005231e294aab0f0b5d..dffcbe8578d55235027a0f92160d01ffad2f53f0 100644 (file)
@@ -1,3 +1,32 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtklabel.c (gtk_label_set_attributes): Set a PangoAttrList
+       on a label
+       (gtk_label_finalize): unref the attr list if any.
+
+       * gtk/testgtk.c (create_get_image): close test on second click
+       (make_message_dialog): close dialog if it exists
+
+       * gdk/gdkpango.c (gdk_draw_layout): Handle rise attribute
+
+       * gdk-2.0.pc.in (Requires): Make it require gdk-pixbuf-2.0 not
+       gdk-pixbuf
+
+       * gtk/gtklabel.c (gtk_label_set_markup): new function to set label
+       from Pango markup format
+       (gtk_label_set_markup_with_accel): ditto but with accelerator
+       parsing
+
+       * gtk/gtkimage.c (gtk_image_expose): reformatting.
+
+       * gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_drawable): Hack to
+       reflect current state of GDK - use gdk_drawable_get_colormap, etc.
+       Check GDK_IS_WINDOW() not !GDK_IS_PIXMAP() to decide whether to 
+       call gdk_window_get_origin().
+
+       * gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable_alpha):
+       implement GDK_PIXBUF_ALPHA_FULL
+       
 Wed Nov  1 03:43:42 2000  Tim Janik  <timj@gtk.org>
 
        * gtk/gtksignal.c (gtk_signal_compat_matched): make use of
index 867ce4c757bbaf747a8c248d02da81e48130dae9..160d5e9c95be88e42a6dbb35bf326379cb5c0e0d 100644 (file)
@@ -1,3 +1,7 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gtk/gtk-sections.txt: Add new label functions
+
 Sun Oct 29 02:59:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * **: Updates to new gtk-doc, gsignal, causing quite
index f1bfa9cdf9c85c52b5b8a791be867610cfa2699e..64296e3fe94cf481914c9ea85ea5ee2d09d48ecf 100644 (file)
@@ -1102,13 +1102,16 @@ GTK_ITEM_FACTORY_GET_CLASS
 GtkLabel
 GtkLabelWord
 gtk_label_new
-gtk_label_set
+gtk_label_set_text
+gtk_label_set_attributes
+gtk_label_set_markup
+gtk_label_set_markup_with_accel
 gtk_label_set_pattern
 gtk_label_set_justify
 gtk_label_get
 gtk_label_parse_uline
 gtk_label_set_line_wrap
-gtk_label_set_text
+gtk_label_set
 <SUBSECTION Standard>
 GTK_LABEL
 GTK_IS_LABEL
index 0dc03329c934ee1ab8115a926414b118685d28ac..38a24948ea6ab48c4a39a58d26967e82c0730192 100644 (file)
@@ -7,6 +7,6 @@ target=@gdktarget@
 Name: GDK
 Description: GIMP Drawing Kit
 Version: @VERSION@
-Requires: gdk-pixbuf,pangox
+Requires: gdk-pixbuf-2.0,pangox
 Libs: -L${libdir} @more_ldflags@ -lgdk-${target}-1.3 @more_libs@ @GDK_WLIBS@
 Cflags: -I${includedir}/gtk-2.0 -I${libdir}/gtk-2.0/include @more_cflags@
index d6165192f752b82e9674422567605a5594c7644f..3ce42c569fb5651d9011dfc5d999f52d498bebf4 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-01  Havoc Pennington  <hp@pobox.com>
+
+       * gdk-pixbuf.c (gdk_pixbuf_new_subpixbuf): New function to create 
+       a pixbuf pointing to a subregion of another pixbuf.
+
 2000-10-16  Tor Lillqvist  <tml@iki.fi>
 
        * gdk-pixbuf-io.c: Define also m_save (for the non-gmodule case).
index 84e086e725b8481ebb69caf77291373f04ea08cb..b2e3f53969dcd411a4329a70bfb16c6e3bc8b90b 100644 (file)
@@ -203,6 +203,60 @@ gdk_pixbuf_copy (const GdkPixbuf *pixbuf)
                                         NULL);
 }
 
+/**
+ * gdk_pixbuf_new_subpixbuf:
+ * @src_pixbuf: a #GdkPixbuf
+ * @src_x: X coord in @src_pixbuf
+ * @src_y: Y coord in @src_pixbuf
+ * @width: width of region in @src_pixbuf
+ * @height: height of region in @src_pixbuf
+ * 
+ * Creates a new pixbuf which represents a sub-region of
+ * @src_pixbuf. The new pixbuf shares its pixels with the
+ * original pixbuf, so writing to one affects both.
+ * The new pixbuf holds a reference to @src_pixbuf, so
+ * @src_pixbuf will not be finalized until the new pixbuf
+ * is finalized.
+ * 
+ * Return value: a new pixbuf 
+ **/
+GdkPixbuf*
+gdk_pixbuf_new_subpixbuf (GdkPixbuf *src_pixbuf,
+                          int        src_x,
+                          int        src_y,
+                          int        width,
+                          int        height)
+{
+        guchar *pixels;
+        GdkPixbuf *sub;
+
+        g_return_val_if_fail (GDK_IS_PIXBUF (src_pixbuf), NULL);
+        g_return_val_if_fail (src_x >= 0 && src_x + width <= src_pixbuf->width, NULL);
+        g_return_val_if_fail (src_y >= 0 && src_y + height <= src_pixbuf->height, NULL);
+
+        pixels = (gdk_pixbuf_get_pixels (src_pixbuf)
+                  + src_y * src_pixbuf->rowstride
+                  + src_x * src_pixbuf->n_channels);
+
+        sub = gdk_pixbuf_new_from_data (pixels,
+                                        src_pixbuf->colorspace,
+                                        src_pixbuf->has_alpha,
+                                        src_pixbuf->bits_per_sample,
+                                        width, height,
+                                        src_pixbuf->rowstride,
+                                        NULL, NULL);
+
+        /* Keep a reference to src_pixbuf */
+        g_object_ref (G_OBJECT (src_pixbuf));
+  
+        g_object_set_qdata_full (G_OBJECT (sub),
+                                 g_quark_from_static_string ("gdk-pixbuf-subpixbuf-src"),
+                                 src_pixbuf,
+                                 (GDestroyNotify) g_object_unref);
+
+        return sub;
+}
+
 \f
 
 /* Accessors */
index e877372779360b7d76a8be6186070643b4bafaa2..ee87b82bb2da0b16e0053ba063fed64af0152aca 100644 (file)
@@ -116,6 +116,13 @@ GdkPixbuf *gdk_pixbuf_new (GdkColorspace colorspace, gboolean has_alpha, int bit
 
 GdkPixbuf *gdk_pixbuf_copy (const GdkPixbuf *pixbuf);
 
+/* Create a pixbuf which points to the pixels of another pixbuf */
+GdkPixbuf *gdk_pixbuf_new_subpixbuf (GdkPixbuf *src_pixbuf,
+                                     int        src_x,
+                                     int        src_y,
+                                     int        width,
+                                     int        height);
+
 /* Simple loading */
 
 GdkPixbuf *gdk_pixbuf_new_from_file (const char *filename,
index 53af8371d4385ad744429b75a5d4a6d7b4e5e41c..2a10fcc8e2f911480f75899d999251e5e7c6b927 100644 (file)
@@ -33,6 +33,7 @@ struct _GdkPangoContextInfo
 
 static void gdk_pango_get_item_properties (PangoItem      *item,
                                           PangoUnderline *uline,
+                                           gint           *rise,
                                           PangoAttrColor *fg_color,
                                           gboolean       *fg_set,
                                           PangoAttrColor *bg_color,
@@ -133,7 +134,6 @@ gdk_pango_context_set_colormap (PangoContext *context,
     }
 }
 
-
 /**
  * gdk_draw_layout_line:
  * @drawable:  the drawable on which to draw the line
@@ -157,7 +157,8 @@ gdk_draw_layout_line (GdkDrawable      *drawable,
   PangoRectangle ink_rect;
   PangoContext *context;
   gint x_off = 0;
-
+  gint rise = 0;
+  
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (gc != NULL);
   g_return_if_fail (line != NULL);
@@ -173,12 +174,21 @@ gdk_draw_layout_line (GdkDrawable      *drawable,
       PangoAttrColor fg_color, bg_color;
       gboolean fg_set, bg_set, shape_set;
       GdkGC *fg_gc;
+      gint risen_y;
       
       tmp_list = tmp_list->next;
-
-      gdk_pango_get_item_properties (run->item, &uline, &fg_color, &fg_set, &bg_color, &bg_set, &shape_set, &ink_rect,
+      
+      gdk_pango_get_item_properties (run->item, &uline,
+                                     &rise,
+                                     &fg_color, &fg_set,
+                                     &bg_color, &bg_set,
+                                     &shape_set,
+                                     &ink_rect,
                                     &logical_rect);
 
+      /* we subtract the rise because X coordinates are upside down */
+      risen_y = y - rise / PANGO_SCALE;
+      
       if (!shape_set)
        {
          if (uline == PANGO_UNDERLINE_NONE)
@@ -195,7 +205,7 @@ gdk_draw_layout_line (GdkDrawable      *drawable,
 
          gdk_draw_rectangle (drawable, bg_gc, TRUE,
                              x + (x_off + logical_rect.x) / PANGO_SCALE,
-                             y + overall_rect.y / PANGO_SCALE,
+                             risen_y + overall_rect.y / PANGO_SCALE,
                              logical_rect.width / PANGO_SCALE,
                              overall_rect.height / PANGO_SCALE);
 
@@ -209,7 +219,9 @@ gdk_draw_layout_line (GdkDrawable      *drawable,
 
       if (!shape_set)
        gdk_draw_glyphs (drawable, fg_gc, run->item->analysis.font,
-                        x + x_off / PANGO_SCALE, y, run->glyphs);
+                        x + x_off / PANGO_SCALE,
+                         risen_y,
+                         run->glyphs);
 
       switch (uline)
        {
@@ -217,18 +229,22 @@ gdk_draw_layout_line (GdkDrawable      *drawable,
          break;
        case PANGO_UNDERLINE_DOUBLE:
          gdk_draw_line (drawable, fg_gc,
-                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1, y + 4,
+                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1,
+                         risen_y + 4,
                         x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, y + 4);
          /* Fall through */
        case PANGO_UNDERLINE_SINGLE:
          gdk_draw_line (drawable, fg_gc,
-                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1, y + 2,
+                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1,
+                         risen_y + 2,
                         x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, y + 2);
          break;
        case PANGO_UNDERLINE_LOW:
          gdk_draw_line (drawable, fg_gc,
-                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1, y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 2,
-                        x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE, y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 2);
+                        x + (x_off + ink_rect.x) / PANGO_SCALE - 1,
+                         risen_y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 2,
+                        x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE,
+                         risen_y + (ink_rect.y + ink_rect.height) / PANGO_SCALE + 2);
          break;
        }
 
@@ -328,6 +344,7 @@ gdk_draw_layout (GdkDrawable     *drawable,
 static void
 gdk_pango_get_item_properties (PangoItem      *item,
                               PangoUnderline *uline,
+                               gint           *rise,
                               PangoAttrColor *fg_color,
                               gboolean       *fg_set,
                               PangoAttrColor *bg_color,
@@ -346,6 +363,9 @@ gdk_pango_get_item_properties (PangoItem      *item,
 
   if (shape_set)
     *shape_set = FALSE;
+
+  if (rise)
+    *rise = 0;
   
   while (tmp_list)
     {
@@ -382,7 +402,12 @@ gdk_pango_get_item_properties (PangoItem      *item,
          if (ink_rect)
            *ink_rect = ((PangoAttrShape *)attr)->ink_rect;
          break;
-         
+
+        case PANGO_ATTR_RISE:
+          if (rise)
+            *rise = ((PangoAttrInt *)attr)->value;
+          break;
+          
        default:
          break;
        }
index 07175a6381b16e122e61c444d5dae577d9564c82..776ebe6067c229d49bee109ec13c15f1e08d9ac6 100644 (file)
@@ -1195,14 +1195,12 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf   *dest,
   int src_width, src_height;
   GdkImage *image;
   int rowstride, bpp, alpha;
-
+  
   /* General sanity checks */
 
   g_return_val_if_fail (src != NULL, NULL);
 
-  if (GDK_IS_PIXMAP (src))
-    g_return_val_if_fail (cmap != NULL, NULL);
-  else
+  if (GDK_IS_WINDOW (src))
     /* FIXME: this is not perfect, since is_viewable() only tests
      * recursively up the Gdk parent window tree, but stops at
      * foreign windows or Gdk toplevels.  I.e. if a window manager
@@ -1219,6 +1217,17 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf   *dest,
       g_return_val_if_fail (dest->bits_per_sample == 8, NULL);
     }
 
+  if (cmap == NULL)
+    cmap = gdk_drawable_get_colormap (src);
+
+  if (cmap == NULL)
+    {
+      g_warning ("%s: Source drawable has no colormap; either pass "
+                 "in a colormap, or set the colormap on the drawable "
+                 "with gdk_drawable_set_colormap()", G_STRLOC);
+      return NULL;
+    }
+  
   /* Coordinate sanity checks */
 
   gdk_drawable_get_size (src, &src_width, &src_height);
@@ -1233,7 +1242,7 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf   *dest,
       g_return_val_if_fail (dest_y + height <= dest->height, NULL);
     }
 
-  if (!GDK_IS_PIXMAP (src))
+  if (GDK_IS_WINDOW (src))
     {
       int ret;
       int src_xorigin, src_yorigin;
@@ -1269,10 +1278,6 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf   *dest,
        }
     }
 
-  /* Get the colormap if needed */
-  if (!GDK_IS_PIXMAP (src))
-    cmap = gdk_window_get_colormap (src);
-
   alpha = dest->has_alpha;
   rowstride = dest->rowstride;
   bpp = alpha ? 4 : 3;
index 5ad39f7607531c6f26fd59e43db40fa3332f9d39..9ef7bb6f6bc0bbb2ff2f295565eff2b88fc381d0 100644 (file)
@@ -246,6 +246,11 @@ gdk_pixbuf_render_to_drawable (GdkPixbuf   *pixbuf,
  * the alpha channel of the image.  If performance is crucial, consider handling
  * the alpha channel yourself (possibly by caching it in your application) and
  * using gdk_pixbuf_render_to_drawable() or GdkRGB directly instead.
+ *
+ * The #GDK_PIXBUF_ALPHA_FULL mode involves round trips to the X
+ * server, and may also be somewhat slow in its current implementation
+ * (though in the future it could be made significantly faster, in
+ * principle).
  **/
 void
 gdk_pixbuf_render_to_drawable_alpha (GdkPixbuf   *pixbuf,
@@ -260,7 +265,8 @@ gdk_pixbuf_render_to_drawable_alpha (GdkPixbuf   *pixbuf,
 {
   GdkBitmap *bitmap = NULL;
   GdkGC *gc;
-
+  GdkPixbuf *composited = NULL;
+  
   g_return_if_fail (pixbuf != NULL);
   g_return_if_fail (pixbuf->colorspace == GDK_COLORSPACE_RGB);
   g_return_if_fail (pixbuf->n_channels == 3 || pixbuf->n_channels == 4);
@@ -278,31 +284,76 @@ gdk_pixbuf_render_to_drawable_alpha (GdkPixbuf   *pixbuf,
 
   if (pixbuf->has_alpha)
     {
-      /* Right now we only support GDK_PIXBUF_ALPHA_BILEVEL, so we
-       * unconditionally create the clipping mask.
-       */
-
-      bitmap = gdk_pixmap_new (NULL, width, height, 1);
-      gdk_pixbuf_render_threshold_alpha (pixbuf, bitmap,
-                                        src_x, src_y,
-                                        0, 0,
-                                        width, height,
-                                        alpha_threshold);
-
-      gdk_gc_set_clip_mask (gc, bitmap);
-      gdk_gc_set_clip_origin (gc, dest_x, dest_y);
+      if (alpha_mode == GDK_PIXBUF_ALPHA_BILEVEL)
+        {
+          bitmap = gdk_pixmap_new (NULL, width, height, 1);
+          gdk_pixbuf_render_threshold_alpha (pixbuf, bitmap,
+                                             src_x, src_y,
+                                             0, 0,
+                                             width, height,
+                                             alpha_threshold);
+          
+          gdk_gc_set_clip_mask (gc, bitmap);
+          gdk_gc_set_clip_origin (gc, dest_x, dest_y);
+        }
+      else if (alpha_mode == GDK_PIXBUF_ALPHA_FULL)
+        {
+          GdkPixbuf *sub = NULL;
+          
+          composited = gdk_pixbuf_get_from_drawable (NULL,
+                                                     drawable,
+                                                     NULL,
+                                                     dest_x, dest_y,
+                                                     0, 0,
+                                                     width, height);
+
+          if (src_x != 0 || src_y != 0)
+            {
+              sub = gdk_pixbuf_new_subpixbuf (pixbuf, src_x, src_y,
+                                              width, height);
+            }
+          
+          gdk_pixbuf_composite (sub ? sub : pixbuf,
+                                composited,
+                                0, 0,
+                                width, height,
+                                0, 0,
+                                1.0, 1.0,
+                                GDK_INTERP_BILINEAR,
+                                255);
+
+          if (sub)
+            g_object_unref (G_OBJECT (sub));
+        }
     }
 
-  gdk_pixbuf_render_to_drawable (pixbuf, drawable, gc,
-                                src_x, src_y,
-                                dest_x, dest_y,
-                                width, height,
-                                dither,
-                                x_dither, y_dither);
+  if (composited)
+    {
+      gdk_pixbuf_render_to_drawable (composited,
+                                     drawable, gc,
+                                     0, 0,
+                                     dest_x, dest_y,
+                                     width, height,
+                                     dither,
+                                     x_dither, y_dither);
+    }
+  else
+    {
+      gdk_pixbuf_render_to_drawable (pixbuf,
+                                     drawable, gc,
+                                     src_x, src_y,
+                                     dest_x, dest_y,
+                                     width, height,
+                                     dither,
+                                     x_dither, y_dither);
+    }
 
   if (bitmap)
     gdk_bitmap_unref (bitmap);
 
+  if (composited)
+    g_object_unref (G_OBJECT (composited));
+
   gdk_gc_unref (gc);
 }
 
index a4de696dd0a6481035ac37f321f706aae115c00b..8ac1d34ef96c9078b443d0cf375e78cfb05f0fd0 100644 (file)
@@ -520,9 +520,8 @@ gtk_image_expose (GtkWidget      *widget,
                                                        image->data.stock.stock_id,
                                                        image->data.stock.size,
                                                        NULL);
-
           if (stock_pixbuf)
-            {
+            {              
               image_bound.width = gdk_pixbuf_get_width (stock_pixbuf);
               image_bound.height = gdk_pixbuf_get_height (stock_pixbuf);
             }
@@ -583,8 +582,10 @@ gtk_image_expose (GtkWidget      *widget,
             case GTK_IMAGE_PIXBUF:
               gdk_pixbuf_render_to_drawable_alpha (image->data.pixbuf.pixbuf,
                                                    widget->window,
-                                                   image_bound.x - x, image_bound.y - y,
-                                                   image_bound.x, image_bound.y,
+                                                   image_bound.x - x,
+                                                   image_bound.y - y,
+                                                   image_bound.x,
+                                                   image_bound.y,
                                                    image_bound.width, image_bound.height,
                                                    GDK_PIXBUF_ALPHA_FULL,
                                                    128,
@@ -598,8 +599,10 @@ gtk_image_expose (GtkWidget      *widget,
                 {
                   gdk_pixbuf_render_to_drawable_alpha (stock_pixbuf,
                                                        widget->window,
-                                                       image_bound.x - x, image_bound.y - y,
-                                                       image_bound.x, image_bound.y,
+                                                       image_bound.x - x,
+                                                       image_bound.y - y,
+                                                       image_bound.x - 4,
+                                                       image_bound.y - 4,
                                                        image_bound.width, image_bound.height,
                                                        GDK_PIXBUF_ALPHA_FULL,
                                                        128,
index e7fcde574c32612c4f9a8fa3719a83b2e6a572b9..9030d9a6002b9c649ce23be4756a4b75edd42cf5 100644 (file)
@@ -180,8 +180,9 @@ gtk_label_init (GtkLabel *label)
 
   label->jtype = GTK_JUSTIFY_CENTER;
   label->wrap = FALSE;
-
+  
   label->layout = NULL;
+  label->attrs = NULL;
   
   gtk_label_set_text (label, "");
 }
@@ -204,10 +205,13 @@ gtk_label_set_text_internal (GtkLabel *label,
                             gchar    *str)
 {
   g_free (label->label);
-
+  
   label->label = str;
   if (label->layout)
-    pango_layout_set_text (label->layout, str, -1);
+    {
+      g_object_unref (G_OBJECT (label->layout));
+      label->layout = NULL;
+    }
   
   gtk_widget_queue_resize (GTK_WIDGET (label));
 }
@@ -217,10 +221,113 @@ gtk_label_set_text (GtkLabel    *label,
                    const gchar *str)
 {
   g_return_if_fail (GTK_IS_LABEL (label));
-
+  
   gtk_label_set_text_internal (label, g_strdup (str ? str : ""));
 }
 
+/**
+ * gtk_label_set_attributes:
+ * @label: a #GtkLabel
+ * @attrs: a #PangoAttrList
+ * 
+ * Sets a #PangoAttrList; the attributes in the list are applied to the
+ * label text.
+ **/
+void
+gtk_label_set_attributes (GtkLabel         *label,
+                          PangoAttrList    *attrs)
+{
+  g_return_if_fail (GTK_IS_LABEL (label));
+
+  if (attrs)
+    pango_attr_list_ref (attrs);
+  
+  if (label->attrs)
+    pango_attr_list_unref (label->attrs);
+
+  label->attrs = attrs;
+}
+
+static guint
+set_markup (GtkLabel    *label,
+            const gchar *str,
+            gboolean     with_uline)
+{
+  gchar *text = NULL;
+  GError *error = NULL;
+  PangoAttrList *attrs = NULL;
+  gunichar accel_char = 0;
+
+  if (str == NULL)
+    str = "";
+  
+  if (!pango_parse_markup (str,
+                           -1,
+                           with_uline ? '_' : 0,
+                           &attrs,
+                           &text,
+                           with_uline ? &accel_char : NULL,
+                           &error))
+    {
+      g_warning ("Failed to set label from markup due to error parsing markup: %s",
+                 error->message);
+      g_error_free (error);
+      return 0;
+    }
+
+  if (text)
+    gtk_label_set_text (label, text);
+
+  if (attrs)
+    {
+      gtk_label_set_attributes (label, attrs);
+      pango_attr_list_unref (attrs);
+    }
+
+  if (accel_char != 0)
+    return gdk_keyval_to_lower (accel_char);
+  else
+    return GDK_VoidSymbol;
+}
+
+/**
+ * gtk_label_set_markup:
+ * @label: a #GtkLabel
+ * @str: a markup string (see <link linkend="PangoMarkupFormat">Pango markup format</link>)
+ * 
+ * Parses @str which is marked up with the Pango text markup language,
+ * setting the label's text and attribute list based on the parse results.
+ **/
+void
+gtk_label_set_markup (GtkLabel    *label,
+                      const gchar *str)
+{  
+  g_return_if_fail (GTK_IS_LABEL (label));
+
+  set_markup (label, str, FALSE);
+}
+
+/**
+ * gtk_label_set_markup:
+ * @label: a #GtkLabel
+ * @str: a markup string (see <link linkend="PangoMarkupFormat">Pango markup format</link>)
+ * 
+ * Parses @str which is marked up with the Pango text markup language,
+ * setting the label's text and attribute list based on the parse results.
+ * If characters in @str are preceded by an underscore, they are underlined
+ * indicating that they represent a keyboard accelerator, and the GDK
+ * keyval for the first underlined accelerator is returned. If there are
+ * no underlines in the text, GDK_VoidSymbol will be returned.
+ **/
+guint
+gtk_label_set_markup_with_accel (GtkLabel    *label,
+                                 const gchar *str)
+{
+  g_return_if_fail (GTK_IS_LABEL (label));
+
+  return set_markup (label, str, TRUE);
+}
+
 /**
  * gtk_label_get_text:
  * @label: a #GtkLabel
@@ -315,14 +422,16 @@ gtk_label_finalize (GObject *object)
   if (label->layout)
     g_object_unref (G_OBJECT (label->layout));
 
+  if (label->attrs)
+    pango_attr_list_unref (label->attrs);
+  
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
-static PangoAttrList *
-gtk_label_pattern_to_attrs (GtkLabel *label)
+static void
+gtk_label_pattern_to_attrs (GtkLabel      *label,
+                            PangoAttrList *attrs)
 {
-  PangoAttrList *attrs = pango_attr_list_new ();
-
   if (label->pattern)
     {
       const char *start;
@@ -355,8 +464,6 @@ gtk_label_pattern_to_attrs (GtkLabel *label)
            break;
        }
     }
-
-  return attrs;
 }
 
 static void
@@ -398,13 +505,24 @@ gtk_label_size_request (GtkWidget      *widget,
   if (!label->layout)
     {
       PangoAlignment align = PANGO_ALIGN_LEFT; /* Quiet gcc */
-      PangoAttrList *attrs = gtk_label_pattern_to_attrs (label);
+      PangoAttrList *attrs = NULL;
 
       label->layout = gtk_widget_create_pango_layout (widget, label->label);
 
-      pango_layout_set_attributes (label->layout, attrs);
+      /* FIXME move to a model where the pattern isn't stored
+       * permanently, and just modifes or creates the AttrList
+       */
+      if (label->attrs)
+        {
+          attrs = pango_attr_list_copy (label->attrs);
+          pango_layout_set_attributes (label->layout, attrs);
+        }
+      else
+        attrs = pango_attr_list_new ();
+      
+      gtk_label_pattern_to_attrs (label, attrs);
       pango_attr_list_unref (attrs);
-
+      
       switch (label->jtype)
        {
        case GTK_JUSTIFY_LEFT:
index b71ccae4100ae662c3c5f1a4aea115d5c8482ddf..b0524af66c7c3a0007ef6da45e70edb1bacd7cc1 100644 (file)
@@ -57,10 +57,11 @@ struct _GtkLabel
   gchar    *pattern;
 
   guint   jtype : 2;
-  gboolean wrap : 1;
-
+  guint   wrap : 1;
+  
   /*< private >*/
   PangoLayout *layout;
+  PangoAttrList *attrs;
 };
 
 struct _GtkLabelClass
@@ -68,10 +69,19 @@ struct _GtkLabelClass
   GtkMiscClass parent_class;
 };
 
-GtkType    gtk_label_get_type      (void) G_GNUC_CONST;
-GtkWidget *gtk_label_new           (const char       *str);
-void       gtk_label_set_text      (GtkLabel         *label,
-                                   const char       *str);
+GtkType    gtk_label_get_type       (void) G_GNUC_CONST;
+GtkWidget *gtk_label_new            (const char       *str);
+void       gtk_label_set_text       (GtkLabel         *label,
+                                    const char       *str);
+void       gtk_label_set_attributes (GtkLabel         *label,
+                                     PangoAttrList    *attrs);
+
+void  gtk_label_set_markup            (GtkLabel    *label,
+                                       const gchar *str);
+guint gtk_label_set_markup_with_accel (GtkLabel    *label,
+                                       const gchar *str);
+                                            
+
 /* Temporarily commented out until memory management behavior is figured out *//* gchar *    gtk_label_get_text      (GtkLabel         *label); */
 void       gtk_label_set_justify   (GtkLabel         *label,
                                    GtkJustification  jtype);
index 54414acc1bf3e79819cb4749a32f1180b686ac45..085335be5a8b4794c4ed0f9bb368a68c7fc1dd27 100644 (file)
@@ -388,6 +388,7 @@ gtk_text_buffer_set_text (GtkTextBuffer *buffer,
  */
 
 static void
+
 gtk_text_buffer_real_insert_text (GtkTextBuffer *buffer,
                                   GtkTextIter *iter,
                                   const gchar *text,
@@ -556,11 +557,11 @@ gtk_text_buffer_insert_interactive_at_cursor (GtkTextBuffer *buffer,
  * Copies text, tags, and pixbufs between @start and @end (the order
  * of @start and @end doesn't matter) and inserts the copy at @iter.
  * Used instead of simply getting/inserting text because it preserves
- * images and tags. If @start and @end are in a different buffer
- * from @buffer, the two buffers must share the same tag table.
+ * images and tags. If @start and @end are in a different buffer from
+ * @buffer, the two buffers must share the same tag table.
  *
- * Implemented via multiple emissions of the insert_text and
- * apply_tag signals, so expect those.
+ * Implemented via emissions of the insert_text and apply_tag signals,
+ * so expect those.
  **/
 void
 gtk_text_buffer_insert_range (GtkTextBuffer     *buffer,
index 9a256b57013b525210f51feaab367c8091079217..6f8542535a584fa86d1af154e88ef6178f8cd2a5 100644 (file)
@@ -1902,7 +1902,9 @@ create_get_image (void)
 {
   static GtkWidget *window = NULL;
 
-  if (!window)
+  if (window)
+    gtk_widget_destroy (window);
+  else
     {
       GtkWidget *sw;
       GtkWidget *src;
@@ -2085,6 +2087,28 @@ void create_labels (void)
       gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __  ___ ____ _____");
       gtk_container_add (GTK_CONTAINER (frame), label);
       gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+      frame = gtk_frame_new ("Markup label");
+      label = gtk_label_new (NULL);
+
+      gtk_label_set_markup (GTK_LABEL (label),
+                            "This <span foreground=\"blue\" background=\"orange\">label</span> has "
+                            "<b>markup</b> such as "
+                            "<big><i>Big Italics</i></big>\n"
+                            "<tt>Monospace font</tt>\n"
+                            "<u>Underline!</u>\n"
+                            "foo\n"
+                            "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
+                            "and nothing on this line,\n"
+                            "or this.\n"
+                            "or this either\n"
+                            "or even on this one\n"
+                            "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
+                            "but this word is <span foreground=\"purple\"><big>purple</big></span>\n"
+                            "We like <sup>superscript</sup> and <sub>subscript</sub> too");
+      gtk_container_add (GTK_CONTAINER (frame), label);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+      
     }
   if (!GTK_WIDGET_VISIBLE (window))
     gtk_widget_show_all (window);
@@ -3031,8 +3055,7 @@ make_message_dialog (GtkWidget **dialog,
 {
   if (*dialog)
     {
-      if (GTK_WIDGET_REALIZED (*dialog))
-        gdk_window_show ((*dialog)->window);
+      gtk_widget_destroy (*dialog);
 
       return;
     }
index 9a256b57013b525210f51feaab367c8091079217..6f8542535a584fa86d1af154e88ef6178f8cd2a5 100644 (file)
@@ -1902,7 +1902,9 @@ create_get_image (void)
 {
   static GtkWidget *window = NULL;
 
-  if (!window)
+  if (window)
+    gtk_widget_destroy (window);
+  else
     {
       GtkWidget *sw;
       GtkWidget *src;
@@ -2085,6 +2087,28 @@ void create_labels (void)
       gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __  ___ ____ _____");
       gtk_container_add (GTK_CONTAINER (frame), label);
       gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+
+      frame = gtk_frame_new ("Markup label");
+      label = gtk_label_new (NULL);
+
+      gtk_label_set_markup (GTK_LABEL (label),
+                            "This <span foreground=\"blue\" background=\"orange\">label</span> has "
+                            "<b>markup</b> such as "
+                            "<big><i>Big Italics</i></big>\n"
+                            "<tt>Monospace font</tt>\n"
+                            "<u>Underline!</u>\n"
+                            "foo\n"
+                            "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
+                            "and nothing on this line,\n"
+                            "or this.\n"
+                            "or this either\n"
+                            "or even on this one\n"
+                            "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
+                            "but this word is <span foreground=\"purple\"><big>purple</big></span>\n"
+                            "We like <sup>superscript</sup> and <sub>subscript</sub> too");
+      gtk_container_add (GTK_CONTAINER (frame), label);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+      
     }
   if (!GTK_WIDGET_VISIBLE (window))
     gtk_widget_show_all (window);
@@ -3031,8 +3055,7 @@ make_message_dialog (GtkWidget **dialog,
 {
   if (*dialog)
     {
-      if (GTK_WIDGET_REALIZED (*dialog))
-        gdk_window_show ((*dialog)->window);
+      gtk_widget_destroy (*dialog);
 
       return;
     }