API: Remove gdk_cursor_new_from_pixmap()
gdk_cursor_new_from_pixbuf() is the proper replacement.
This commit is contained in:
		| @ -178,169 +178,6 @@ color_is_white (const GdkColor *color) | ||||
| 	  && color->blue == 0xFFFF); | ||||
| } | ||||
|  | ||||
| GdkCursor* | ||||
| gdk_cursor_new_from_pixmap (GdkPixmap      *source, | ||||
| 			    GdkPixmap      *mask, | ||||
| 			    const GdkColor *fg, | ||||
| 			    const GdkColor *bg, | ||||
| 			    gint            x, | ||||
| 			    gint            y) | ||||
| { | ||||
|   GdkPixmapImplWin32 *source_impl, *mask_impl; | ||||
|   guchar *source_bits, *mask_bits; | ||||
|   gint source_bpl, mask_bpl; | ||||
|   HCURSOR hcursor; | ||||
|   guchar *p, *q, *xor_mask, *and_mask; | ||||
|   gint width, height, cursor_width, cursor_height; | ||||
|   guchar residue; | ||||
|   gint ix, iy; | ||||
|   const gboolean bg_is_white = color_is_white (bg); | ||||
|    | ||||
|   g_return_val_if_fail (GDK_IS_PIXMAP (source), NULL); | ||||
|   g_return_val_if_fail (GDK_IS_PIXMAP (mask), NULL); | ||||
|   g_return_val_if_fail (fg != NULL, NULL); | ||||
|   g_return_val_if_fail (bg != NULL, NULL); | ||||
|  | ||||
|   source_impl = GDK_PIXMAP_IMPL_WIN32 (GDK_PIXMAP_OBJECT (source)->impl); | ||||
|   mask_impl = GDK_PIXMAP_IMPL_WIN32 (GDK_PIXMAP_OBJECT (mask)->impl); | ||||
|  | ||||
|   g_return_val_if_fail (source_impl->width == mask_impl->width | ||||
| 			&& source_impl->height == mask_impl->height, | ||||
| 			NULL); | ||||
|   width = source_impl->width; | ||||
|   height = source_impl->height; | ||||
|   cursor_width = GetSystemMetrics (SM_CXCURSOR); | ||||
|   cursor_height = GetSystemMetrics (SM_CYCURSOR); | ||||
|  | ||||
|   g_return_val_if_fail (width <= cursor_width && height <= cursor_height, | ||||
| 			NULL); | ||||
|  | ||||
|   residue = (1 << ((8-(width%8))%8)) - 1; | ||||
|  | ||||
|   source_bits = source_impl->bits; | ||||
|   mask_bits = mask_impl->bits; | ||||
|  | ||||
|   g_return_val_if_fail (GDK_PIXMAP_OBJECT (source)->depth == 1 | ||||
|   			&& GDK_PIXMAP_OBJECT (mask)->depth == 1, | ||||
| 			NULL); | ||||
|  | ||||
|   source_bpl = ((width - 1)/32 + 1)*4; | ||||
|   mask_bpl = ((mask_impl->width - 1)/32 + 1)*4; | ||||
|  | ||||
|   GDK_NOTE (CURSOR, { | ||||
|       g_print ("gdk_cursor_new_from_pixmap: source=%p:\n", | ||||
| 	       source_impl->parent_instance.handle); | ||||
|       for (iy = 0; iy < height; iy++) | ||||
| 	{ | ||||
| 	  if (iy == 16) | ||||
| 	    break; | ||||
|  | ||||
| 	  p = source_bits + iy*source_bpl; | ||||
| 	  for (ix = 0; ix < width; ix++) | ||||
| 	    { | ||||
| 	      if (ix == 79) | ||||
| 		break; | ||||
| 	      g_print ("%c", ".X"[((*p)>>(7-(ix%8)))&1]); | ||||
| 	      if ((ix%8) == 7) | ||||
| 		p++; | ||||
| 	    } | ||||
| 	  g_print ("\n"); | ||||
| 	} | ||||
|       g_print ("...mask=%p:\n", mask_impl->parent_instance.handle); | ||||
|       for (iy = 0; iy < height; iy++) | ||||
| 	{ | ||||
| 	  if (iy == 16) | ||||
| 	    break; | ||||
|  | ||||
| 	  p = mask_bits + iy*source_bpl; | ||||
| 	  for (ix = 0; ix < width; ix++) | ||||
| 	    { | ||||
| 	      if (ix == 79) | ||||
| 		break; | ||||
| 	      g_print ("%c", ".X"[((*p)>>(7-(ix%8)))&1]); | ||||
| 	      if ((ix%8) == 7) | ||||
| 		p++; | ||||
| 	    } | ||||
| 	  g_print ("\n"); | ||||
| 	} | ||||
|     }); | ||||
|  | ||||
|   /* Such complex bit manipulation for this simple task, sigh. | ||||
|    * The X cursor and Windows cursor concepts are quite different. | ||||
|    * We assume here that we are always called with fg == black and | ||||
|    * bg == white, *or* the other way around. Random colours won't work. | ||||
|    * (Well, you will get a cursor, but not in those colours.) | ||||
|    */ | ||||
|  | ||||
|   /* Note: The comments below refer to the case fg==black and | ||||
|    * bg==white, as that was what was implemented first. The fg==white | ||||
|    * (the "if (fg->pixel)" branches) case was added later. | ||||
|    */ | ||||
|  | ||||
|   /* First set masked-out source bits, as all source bits matter on Windoze. | ||||
|    * As we invert them below, they will be clear in the final xor_mask. | ||||
|    */ | ||||
|   for (iy = 0; iy < height; iy++) | ||||
|     { | ||||
|       p = source_bits + iy*source_bpl; | ||||
|       q = mask_bits + iy*mask_bpl; | ||||
|        | ||||
|       for (ix = 0; ix < ((width-1)/8+1); ix++) | ||||
| 	if (bg_is_white) | ||||
| 	  *p++ |= ~(*q++); | ||||
| 	else | ||||
| 	  *p++ &= *q++; | ||||
|     } | ||||
|  | ||||
|   /* XOR mask is initialized to zero */ | ||||
|   xor_mask = g_malloc0 (cursor_width/8 * cursor_height); | ||||
|  | ||||
|   for (iy = 0; iy < height; iy++) | ||||
|     { | ||||
|       p = source_bits + iy*source_bpl; | ||||
|       q = xor_mask + iy*cursor_width/8; | ||||
|  | ||||
|       for (ix = 0; ix < ((width-1)/8+1); ix++) | ||||
| 	if (bg_is_white) | ||||
| 	  *q++ = ~(*p++); | ||||
| 	else | ||||
| 	  *q++ = *p++; | ||||
|  | ||||
|       q[-1] &= ~residue;	/* Clear left-over bits */ | ||||
|     } | ||||
|        | ||||
|   /* AND mask is initialized to ones */ | ||||
|   and_mask = g_malloc (cursor_width/8 * cursor_height); | ||||
|   memset (and_mask, 0xFF, cursor_width/8 * cursor_height); | ||||
|  | ||||
|   for (iy = 0; iy < height; iy++) | ||||
|     { | ||||
|       p = mask_bits + iy*mask_bpl; | ||||
|       q = and_mask + iy*cursor_width/8; | ||||
|  | ||||
|       for (ix = 0; ix < ((width-1)/8+1); ix++) | ||||
| 	*q++ = ~(*p++); | ||||
|  | ||||
|       q[-1] |= residue;	/* Set left-over bits */ | ||||
|     } | ||||
|        | ||||
|   hcursor = CreateCursor (_gdk_app_hmodule, x, y, cursor_width, cursor_height, | ||||
| 			  and_mask, xor_mask); | ||||
|  | ||||
|   GDK_NOTE (CURSOR, g_print ("gdk_cursor_new_from_pixmap: " | ||||
| 			     "%p (%dx%d) %p (%dx%d) = %p (%dx%d)\n", | ||||
| 			     GDK_PIXMAP_HBITMAP (source), | ||||
| 			     source_impl->width, source_impl->height, | ||||
| 			     GDK_PIXMAP_HBITMAP (mask), | ||||
| 			     mask_impl->width, mask_impl->height, | ||||
| 			     hcursor, cursor_width, cursor_height)); | ||||
|  | ||||
|   g_free (xor_mask); | ||||
|   g_free (and_mask); | ||||
|  | ||||
|   return cursor_new_from_hcursor (hcursor, GDK_CURSOR_IS_PIXMAP); | ||||
| } | ||||
|  | ||||
| /* FIXME: The named cursors below are presumably not really useful, as | ||||
|  * the names are Win32-specific. No GTK+ application developed on Unix | ||||
|  * (and most cross-platform GTK+ apps are developed on Unix) is going | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Benjamin Otte
					Benjamin Otte