Re: get_from_drawable for bitmaps



Hmm, the patch would be good.

Havoc


Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gtk+/ChangeLog,v
retrieving revision 1.2207
diff -u -p -u -r1.2207 ChangeLog
--- ChangeLog	2001/08/23 23:38:31	1.2207
+++ ChangeLog	2001/08/24 03:34:10
@@ -1,3 +1,23 @@
+2001-08-23  Havoc Pennington  <hp pobox com>
+
+	* gdk/gdkpixbuf-drawable.c (gdk_pixbuf_get_from_image):
+	special-case bitmaps to allow no colormap
+	(bitmap1): implement no-colormap bitmap-getting
+	(bitmap1a): implement no-colormap bitmap-getting to pixbuf with
+	alpha
+	(rgb8): indentation
+	(rgb1a, rgb1): change the way we read the data out of the image, 
+	old way didn't seem to work quite right.
+
+	* gtk/gtkwindow.c (gtk_window_move_resize): move hints comparison
+	above position constraint (I really intended to do this before,
+	don't know what's up with that)
+	(gtk_XParseGeometry): shut up gcc
+
+	* gdk/gdkpixbuf-drawable.c (rgb1a): fix bug where "x1" was used
+	and "0" should have been. remove the attempted 4-bytes-at-once
+	optimization, it was totally broken.
+
 Thu Aug 23 19:33:54 2001  Owen Taylor  <otaylor redhat com>
 
 	* gtk/gtkcontainer.[ch]: Rename gtk_container_children()
Index: docs/reference/gtk/tmpl/gtk-unused.sgml
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/tmpl/gtk-unused.sgml,v
retrieving revision 1.57
diff -u -p -u -r1.57 gtk-unused.sgml
--- docs/reference/gtk/tmpl/gtk-unused.sgml	2001/08/23 16:54:48	1.57
+++ docs/reference/gtk/tmpl/gtk-unused.sgml	2001/08/24 03:34:10
@@ -2296,6 +2296,13 @@ fundamental type.
 
 @style: 
 
+<!-- ##### FUNCTION gtk_widget_set_default_style ##### -->
+<para>
+
+</para>
+
+ style: 
+
 <!-- ##### FUNCTION gtk_window_activate_mnemonic ##### -->
 <para>
 
Index: docs/reference/gtk/tmpl/gtkcontainer.sgml
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/tmpl/gtkcontainer.sgml,v
retrieving revision 1.12
diff -u -p -u -r1.12 gtkcontainer.sgml
--- docs/reference/gtk/tmpl/gtkcontainer.sgml	2001/07/02 05:03:18	1.12
+++ docs/reference/gtk/tmpl/gtkcontainer.sgml	2001/08/24 03:34:10
@@ -92,13 +92,14 @@ GtkContainer
 @notify: 
 
 
-<!-- ##### FUNCTION gtk_container_children ##### -->
+<!-- ##### MACRO gtk_container_children ##### -->
 <para>
 
 </para>
 
- container: 
 @Returns: 
+<!-- # Unused Parameters # -->
+ container: 
 
 
 <!-- ##### FUNCTION gtk_container_set_reallocate_redraws ##### -->
Index: docs/reference/gtk/tmpl/gtkmenubar.sgml
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/tmpl/gtkmenubar.sgml,v
retrieving revision 1.6
diff -u -p -u -r1.6 gtkmenubar.sgml
--- docs/reference/gtk/tmpl/gtkmenubar.sgml	2001/04/28 00:12:42	1.6
+++ docs/reference/gtk/tmpl/gtkmenubar.sgml	2001/08/24 03:34:10
@@ -28,31 +28,38 @@ Creates the new #GtkMenuBar
 @Returns: the #GtkMenuBar
 
 
-<!-- ##### FUNCTION gtk_menu_bar_append ##### -->
+<!-- ##### MACRO gtk_menu_bar_append ##### -->
 <para>
 Adds a new #GtkMenuItem to the end of the GtkMenuBar
 </para>
 
- menu_bar: a #GtkMenuBar
+ menu: 
 @child: the #GtkMenuItem to add
+<!-- # Unused Parameters # -->
+ menu_bar: a #GtkMenuBar
 
 
-<!-- ##### FUNCTION gtk_menu_bar_prepend ##### -->
+<!-- ##### MACRO gtk_menu_bar_prepend ##### -->
 <para>
 Adds a new #GtkMenuItem to the beginning of the GtkMenuBar
 </para>
 
+ menu_child: 
+<!-- # Unused Parameters # -->
 @menu_bar: a #GtkMenuBar
 @child: the #GtkMenuItem to add
 
 
-<!-- ##### FUNCTION gtk_menu_bar_insert ##### -->
+<!-- ##### MACRO gtk_menu_bar_insert ##### -->
 <para>
 Adds a new #GtkMenuItem to the GtkMenuBar at the position defined by @position
 </para>
 
- menu_bar: a #GtkMenuBar
+ menu: 
 @child: the #GtkMenuItem to add
+ pos: 
+<!-- # Unused Parameters # -->
+ menu_bar: a #GtkMenuBar
 @position: the position in the item list where the @child is added.
 
 
Index: docs/reference/gtk/tmpl/gtkrc.sgml
===================================================================
RCS file: /cvs/gnome/gtk+/docs/reference/gtk/tmpl/gtkrc.sgml,v
retrieving revision 1.47
diff -u -p -u -r1.47 gtkrc.sgml
--- docs/reference/gtk/tmpl/gtkrc.sgml	2001/08/23 16:54:48	1.47
+++ docs/reference/gtk/tmpl/gtkrc.sgml	2001/08/24 03:34:10
@@ -495,7 +495,6 @@ This can later be composited together wi
 #GtkRcStyle structures to form a #GtkStyle.
 </para>
 
- parent_instance: 
 @name: 
 @bg_pixmap_name: 
 @font_desc: 
Index: gdk/gdkpixbuf-drawable.c
===================================================================
RCS file: /cvs/gnome/gtk+/gdk/gdkpixbuf-drawable.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 gdkpixbuf-drawable.c
--- gdk/gdkpixbuf-drawable.c	2001/06/29 01:58:59	1.26
+++ gdk/gdkpixbuf-drawable.c	2001/08/24 03:34:10
@@ -56,6 +56,116 @@ static guint32 mask_table[] = {
 
 
 /*
+ * convert bitmap data to pixbuf without alpha,
+ * without using a colormap 
+ */
+static void
+bitmap1 (GdkImage    *image,
+         guchar      *pixels,
+         int          rowstride,
+         int          x1,
+         int          y1,
+         int          x2,
+         int          y2)
+{
+  int xx, yy;
+  int bpl;
+  register guint8 data;
+  guint8 *o;
+  guint8 *srow = image->mem, *orow = pixels;
+
+  d (printf ("bitmap, no alpha\n"));
+
+  bpl = image->bpl;
+
+  for (yy = y1; yy < y2; yy++)
+    {
+      o = orow;
+      
+      for (xx = x1; xx < x2; xx ++)
+	{
+          /* top 29 bits of xx (xx >> 3) indicate the byte the bit is inside,
+           * bottom 3 bits (xx & 7) indicate bit inside that byte,
+           * we don't bother to canonicalize data to 1 or 0, just
+           * leave the relevant bit in-place.
+           */
+          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
+                                  (0x80 >> (xx & 7)) :
+                                  (1 << (xx & 7)));
+
+          if (data)
+            {
+              *o++ = 255;
+              *o++ = 255;
+              *o++ = 255;
+            }
+          else
+            {
+              *o++ = 0;
+              *o++ = 0;
+              *o++ = 0;
+            }
+	}
+      srow += bpl;
+      orow += rowstride;
+    }
+}
+
+/*
+ * convert bitmap data to pixbuf with alpha,
+ * without using a colormap 
+ */
+static void
+bitmap1a (GdkImage    *image,
+          guchar      *pixels,
+          int          rowstride,
+          int          x1,
+          int          y1,
+          int          x2,
+          int          y2)
+{
+  int xx, yy;
+  int bpl;
+  register guint8 data;
+  guint8 *o;
+  guint8 *srow = image->mem, *orow = pixels;
+
+  d (printf ("bitmap, with alpha\n"));
+
+  bpl = image->bpl;
+
+  for (yy = y1; yy < y2; yy++)
+    {
+      o = orow;
+      
+      for (xx = x1; xx < x2; xx ++)
+	{
+          /* see comment in bitmap1() */
+          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
+                                  (0x80 >> (xx & 7)) :
+                                  (1 << (xx & 7)));
+
+          if (data)
+            {
+              *o++ = 255;
+              *o++ = 255;
+              *o++ = 255;
+              *o++ = 255;
+            }
+          else
+            {
+              *o++ = 0;
+              *o++ = 0;
+              *o++ = 0;
+              *o++ = 0;
+            }
+	}
+      srow += bpl;
+      orow += rowstride;
+    }
+}
+
+/*
  * convert 1 bits-pixel data
  * no alpha
  */
@@ -71,7 +181,6 @@ rgb1 (GdkImage    *image,
 {
   int xx, yy;
   int bpl;
-  guint8 *s;
   register guint8 data;
   guint8 *o;
   guint8 *srow = image->mem, *orow = pixels;
@@ -86,12 +195,15 @@ rgb1 (GdkImage    *image,
 
   for (yy = y1; yy < y2; yy++)
     {
-      s = srow;
       o = orow;
       
       for (xx = x1; xx < x2; xx ++)
 	{
-	  data = srow[xx >> 3] >> (7 - (xx & 7)) & 1;
+          /* see comment in bitmap1() */
+          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
+                                  (0x80 >> (xx & 7)) :
+                                  (1 << (xx & 7)));
+
 	  *o++ = colormap->colors[data].red;
 	  *o++ = colormap->colors[data].green;
 	  *o++ = colormap->colors[data].blue;
@@ -117,12 +229,10 @@ rgb1a (GdkImage    *image,
 {
   int xx, yy;
   int bpl;
-  guint8 *s;
   register guint8 data;
   guint8 *o;
   guint8 *srow = image->mem, *orow = pixels;
-  guint32 remap[2];
-
+  
   d (printf ("1 bits/pixel\n"));
 
   /* convert upto 8 pixels/time */
@@ -130,30 +240,21 @@ rgb1a (GdkImage    *image,
    * 1 bit displays anymore? */
   bpl = image->bpl;
 
-  for (xx = x1; xx < 2; xx++)
-    {
-#ifdef LITTLE
-      remap[xx] = 0xff000000
-	| colormap->colors[xx].blue << 16
-	| colormap->colors[xx].green << 8
-	| colormap->colors[xx].red;
-#else
-      remap[xx] = 0xff
-	| colormap->colors[xx].red << 24
-	| colormap->colors[xx].green << 16
-	| colormap->colors[xx].blue << 8;
-#endif
-    }
-
   for (yy = y1; yy < y2; yy++)
     {
-      s = srow;
       o = orow;
       
       for (xx = x1; xx < x2; xx ++)
 	{
-	  data = srow[xx >> 3] >> (7 - (xx & 7)) & 1;
-	  *o++ = remap[data];
+          /* see comment in bitmap1() */
+          data = srow[xx >> 3] & (image->byte_order == GDK_MSB_FIRST ?
+                                  (0x80 >> (xx & 7)) :
+                                  (1 << (xx & 7)));
+
+          *o++ = colormap->colors[data].red;
+	  *o++ = colormap->colors[data].green;
+	  *o++ = colormap->colors[data].blue;
+	  *o++ = 255;
 	}
       srow += bpl;
       orow += rowstride;
@@ -192,12 +293,13 @@ rgb8 (GdkImage    *image,
     {
       s = srow;
       o = orow;
-      for (xx = x1; xx < x2; xx++) {
-	data = *s++ & mask;
-	*o++ = colormap->colors[data].red;
-	*o++ = colormap->colors[data].green;
-	*o++ = colormap->colors[data].blue;
-      }
+      for (xx = x1; xx < x2; xx++)
+        {
+          data = *s++ & mask;
+          *o++ = colormap->colors[data].red;
+          *o++ = colormap->colors[data].green;
+          *o++ = colormap->colors[data].blue;
+        }
       srow += bpl;
       orow += rowstride;
     }
@@ -1206,16 +1308,35 @@ rgbconvert (GdkImage    *image,
             int          height,
 	    GdkColormap *cmap)
 {
-  int index = (image->byte_order == GDK_MSB_FIRST) | (alpha != 0) << 1;
-  int bank = 5;		/* default fallback converter */
-  GdkVisual *v = gdk_colormap_get_visual (cmap);
-
-  d(printf("masks = %x:%x:%x\n", v->red_mask, v->green_mask, v->blue_mask));
-  d(printf("image depth = %d, bits per pixel = %d\n", image->depth, image->bits_per_pixel));
+  int index;
+  int bank;
+  GdkVisual *v;
 
   g_assert ((x + width) <= image->width);
   g_assert ((y + height) <= image->height);
   
+  if (cmap == NULL)
+    {
+      /* Only allowed for bitmaps */
+      g_return_if_fail (image->depth == 1);
+      
+      if (alpha)
+        bitmap1a (image, pixels, rowstride,
+                  x, y, x + width, y + height);
+      else
+        bitmap1 (image, pixels, rowstride,
+                  x, y, x + width, y + height);
+      
+      return;
+    }
+  
+  v = gdk_colormap_get_visual (cmap);
+  bank = 5; /* default fallback converter */
+  index = (image->byte_order == GDK_MSB_FIRST) | (alpha != 0) << 1;
+  
+  d(printf("masks = %x:%x:%x\n", v->red_mask, v->green_mask, v->blue_mask));
+  d(printf("image depth = %d, bits per pixel = %d\n", image->depth, image->bits_per_pixel));
+  
   switch (v->type)
     {
 				/* I assume this is right for static & greyscale's too? */
@@ -1285,8 +1406,7 @@ rgbconvert (GdkImage    *image,
  * gdk_pixbuf_get_from_drawable:
  * @dest: Destination pixbuf, or %NULL if a new pixbuf should be created.
  * @src: Source drawable.
- * @cmap: A colormap if @src is a pixmap.  If it is a window, this argument will
- * be ignored.
+ * @cmap: A colormap if @src doesn't have one set.
  * @src_x: Source X coordinate within drawable.
  * @src_y: Source Y coordinate within drawable.
  * @dest_x: Destination X coordinate in pixbuf, or 0 if @dest is NULL.
@@ -1298,12 +1418,17 @@ rgbconvert (GdkImage    *image,
  * representation inside a #GdkPixbuf. In other words, copies
  * image data from a server-side drawable to a client-side RGB(A) buffer.
  * This allows you to efficiently read individual pixels on the client side.
- *
- * If the drawable @src is a pixmap, then a suitable colormap must be
- * specified, since pixmaps are just blocks of pixel data without an
- * associated colormap.  If the drawable is a window, the @cmap
- * argument will be ignored and the window's own colormap will be used
- * instead.
+ * 
+ * If the drawable @src has no colormap (gdk_drawable_get_colormap()
+ * returns %NULL), then a suitable colormap must be specified.
+ * Typically a #GdkWindow or a pixmap created by passing a #GdkWindow
+ * to gdk_pixmap_new() will already have a colormap associated with
+ * it.  If the drawable has a colormap, the @cmap argument will be
+ * ignored.  If the drawable is a bitmap (1 bit per pixel pixmap),
+ * then a colormap is not required; pixels with a value of 1 are
+ * assumed to be white, and pixels with a value of 0 are assumed to be
+ * black. For taking screenshots, gdk_colormap_get_system() returns
+ * the correct colormap to use.
  *
  * If the specified destination pixbuf @dest is %NULL, then this
  * function will create an RGB pixbuf with 8 bits per channel and no
@@ -1355,6 +1480,7 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf 
 {
   int src_width, src_height;
   GdkImage *image;
+  int depth;
   
   /* General sanity checks */
 
@@ -1380,7 +1506,9 @@ gdk_pixbuf_get_from_drawable (GdkPixbuf 
   if (cmap == NULL)
     cmap = gdk_drawable_get_colormap (src);
 
-  if (cmap == NULL)
+  depth = gdk_drawable_get_depth (src);
+  
+  if (depth != 1 && cmap == NULL)
     {
       g_warning ("%s: Source drawable has no colormap; either pass "
                  "in a colormap, or set the colormap on the drawable "
@@ -1469,8 +1597,8 @@ gdk_pixbuf_get_from_image (GdkPixbuf   *
 
   if (cmap == NULL)
     cmap = gdk_image_get_colormap (src);
-
-  if (cmap == NULL)
+  
+  if (src->depth != 1 && cmap == NULL)
     {
       g_warning ("%s: Source image has no colormap; either pass "
                  "in a colormap, or set the colormap on the image "
Index: gtk/gtkwindow.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwindow.c,v
retrieving revision 1.142
diff -u -p -u -r1.142 gtkwindow.c
--- gtk/gtkwindow.c	2001/08/18 17:03:27	1.142
+++ gtk/gtkwindow.c	2001/08/24 03:34:11
@@ -3482,6 +3482,15 @@ gtk_window_move_resize (GtkWindow *windo
        widget->allocation.height != new_request.height))
     configure_request_size_changed = TRUE;
 
+  
+  hints_changed = FALSE;
+  
+  if (!gtk_window_compare_hints (&info->last.geometry, info->last.flags,
+				 &new_geometry, new_flags))
+    {
+      hints_changed = TRUE;
+    }
+  
   /* Position Constraints
    * ====================
    * 
@@ -3545,14 +3554,6 @@ gtk_window_move_resize (GtkWindow *windo
       else
         configure_request_pos_changed = FALSE;
     }
-  
-  hints_changed = FALSE;
-  
-  if (!gtk_window_compare_hints (&info->last.geometry, info->last.flags,
-				 &new_geometry, new_flags))
-    {
-      hints_changed = TRUE;
-    }
 
 #if 0
   {
@@ -4791,6 +4792,12 @@ gtk_XParseGeometry (const char   *string
   int tempX, tempY;
   char *nextCharacter;
 
+  /* These initializations are just to silence gcc */
+  tempWidth = 0;
+  tempHeight = 0;
+  tempX = 0;
+  tempY = 0;
+  
   if ( (string == NULL) || (*string == '\0')) return(mask);
   if (*string == '=')
     string++;  /* ignore possible '=' at beg of geometry spec */




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]