API: Remove gdk_cursor_new_from_pixmap()

gdk_cursor_new_from_pixbuf() is the proper replacement.
This commit is contained in:
Benjamin Otte 2010-08-12 15:43:23 +02:00
parent 0178bff5c0
commit 6218c16ff8
7 changed files with 54 additions and 341 deletions

View File

@ -939,7 +939,6 @@ gdk_owner_change_get_type
GdkCursor
GdkCursorType
gdk_cursor_new
gdk_cursor_new_from_pixmap
gdk_cursor_new_from_pixbuf
gdk_cursor_new_from_name
gdk_cursor_new_for_display

View File

@ -125,7 +125,7 @@ The standard cursors available.
@GDK_LAST_CURSOR: last cursor type
@GDK_BLANK_CURSOR: Blank cursor. Since 2.16
@GDK_CURSOR_IS_PIXMAP: type of cursors constructed with
gdk_cursor_new_from_pixmap() or gdk_cursor_new_from_pixbuf()
gdk_cursor_new_from_pixbuf()
<!-- ##### FUNCTION gdk_cursor_new ##### -->
<para>
@ -136,19 +136,6 @@ The standard cursors available.
@Returns:
<!-- ##### FUNCTION gdk_cursor_new_from_pixmap ##### -->
<para>
</para>
@source:
@mask:
@fg:
@bg:
@x:
@y:
@Returns:
<!-- ##### FUNCTION gdk_cursor_new_from_pixbuf ##### -->
<para>

View File

@ -336,7 +336,6 @@ gdk_cursor_unref
gdk_cursor_get_display
gdk_cursor_new_for_display
gdk_cursor_new_from_pixbuf
gdk_cursor_new_from_pixmap
gdk_cursor_new_from_name
gdk_cursor_get_image
#endif

View File

@ -141,12 +141,6 @@ GdkCursor* gdk_cursor_new_for_display (GdkDisplay *display,
#ifndef GDK_MULTIHEAD_SAFE
GdkCursor* gdk_cursor_new (GdkCursorType cursor_type);
#endif
GdkCursor* gdk_cursor_new_from_pixmap (GdkPixmap *source,
GdkPixmap *mask,
const GdkColor *fg,
const GdkColor *bg,
gint x,
gint y);
GdkCursor* gdk_cursor_new_from_pixbuf (GdkDisplay *display,
GdkPixbuf *pixbuf,
gint x,

View File

@ -237,91 +237,6 @@ gdk_cursor_new_for_display (GdkDisplay *display,
return gdk_quartz_cursor_new_from_nscursor (nscursor, cursor_type);
}
GdkCursor*
gdk_cursor_new_from_pixmap (GdkPixmap *source,
GdkPixmap *mask,
const GdkColor *fg,
const GdkColor *bg,
gint x,
gint y)
{
NSBitmapImageRep *bitmap_rep;
NSImage *image;
NSCursor *nscursor;
GdkCursor *cursor;
int width, height;
gint tmp_x, tmp_y;
guchar *dst_data, *mask_data, *src_data;
guchar *mask_start, *src_start;
int dst_stride;
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);
GDK_QUARTZ_ALLOC_POOL;
gdk_drawable_get_size (source, &width, &height);
bitmap_rep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:(NSInteger)width pixelsHigh:(NSInteger)height
bitsPerSample:8 samplesPerPixel:4
hasAlpha:YES isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:0 bitsPerPixel:0];
dst_stride = [bitmap_rep bytesPerRow];
mask_start = GDK_PIXMAP_IMPL_QUARTZ (GDK_PIXMAP_OBJECT (mask)->impl)->data;
src_start = GDK_PIXMAP_IMPL_QUARTZ (GDK_PIXMAP_OBJECT (source)->impl)->data;
for (tmp_y = 0; tmp_y < height; tmp_y++)
{
dst_data = [bitmap_rep bitmapData] + tmp_y * dst_stride;
mask_data = mask_start + tmp_y * width;
src_data = src_start + tmp_y * width;
for (tmp_x = 0; tmp_x < width; tmp_x++)
{
if (*mask_data++)
{
const GdkColor *color;
if (*src_data++)
color = fg;
else
color = bg;
*dst_data++ = (color->red >> 8) & 0xff;
*dst_data++ = (color->green >> 8) & 0xff;
*dst_data++ = (color->blue >> 8) & 0xff;
*dst_data++ = 0xff;
}
else
{
*dst_data++ = 0x00;
*dst_data++ = 0x00;
*dst_data++ = 0x00;
*dst_data++ = 0x00;
src_data++;
}
}
}
image = [[NSImage alloc] init];
[image addRepresentation:bitmap_rep];
[bitmap_rep release];
nscursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(x, y)];
[image release];
cursor = gdk_quartz_cursor_new_from_nscursor (nscursor, GDK_CURSOR_IS_PIXMAP);
GDK_QUARTZ_RELEASE_POOL;
return cursor;
}
static NSImage *
_gdk_quartz_pixbuf_to_ns_image (GdkPixbuf *pixbuf)
{

View File

@ -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

View File

@ -306,75 +306,6 @@ gdk_cursor_new_for_display (GdkDisplay *display,
return cursor;
}
/**
* gdk_cursor_new_from_pixmap:
* @source: the pixmap specifying the cursor.
* @mask: the pixmap specifying the mask, which must be the same size as
* @source.
* @fg: the foreground color, used for the bits in the source which are 1.
* The color does not have to be allocated first.
* @bg: the background color, used for the bits in the source which are 0.
* The color does not have to be allocated first.
* @x: the horizontal offset of the 'hotspot' of the cursor.
* @y: the vertical offset of the 'hotspot' of the cursor.
*
* Creates a new cursor from a given pixmap and mask. Both the pixmap and mask
* must have a depth of 1 (i.e. each pixel has only 2 values - on or off).
* The standard cursor size is 16 by 16 pixels.
*
* Return value: a new #GdkCursor.
**/
GdkCursor*
gdk_cursor_new_from_pixmap (GdkPixmap *source,
GdkPixmap *mask,
const GdkColor *fg,
const GdkColor *bg,
gint x,
gint y)
{
GdkCursorPrivate *private;
GdkCursor *cursor;
Pixmap source_pixmap, mask_pixmap;
Cursor xcursor;
XColor xfg, xbg;
GdkDisplay *display;
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_pixmap = GDK_PIXMAP_XID (source);
mask_pixmap = GDK_PIXMAP_XID (mask);
display = GDK_PIXMAP_DISPLAY (source);
xfg.pixel = fg->pixel;
xfg.red = fg->red;
xfg.blue = fg->blue;
xfg.green = fg->green;
xbg.pixel = bg->pixel;
xbg.red = bg->red;
xbg.blue = bg->blue;
xbg.green = bg->green;
if (display->closed)
xcursor = None;
else
xcursor = XCreatePixmapCursor (GDK_DISPLAY_XDISPLAY (display),
source_pixmap, mask_pixmap, &xfg, &xbg, x, y);
private = g_new (GdkCursorPrivate, 1);
private->display = display;
private->xcursor = xcursor;
private->name = NULL;
private->serial = theme_serial;
cursor = (GdkCursor *) private;
cursor->type = GDK_CURSOR_IS_PIXMAP;
cursor->ref_count = 1;
return cursor;
}
void
_gdk_cursor_destroy (GdkCursor *cursor)
{
@ -588,8 +519,8 @@ update_cursor (gpointer data,
* If the windowing system supports it, existing cursors created
* with gdk_cursor_new(), gdk_cursor_new_for_display() and
* gdk_cursor_new_for_name() are updated to reflect the theme
* change. Custom cursors constructed with gdk_cursor_new_from_pixmap()
* or gdk_cursor_new_from_pixbuf() will have to be handled
* change. Custom cursors constructed with
* gdk_cursor_new_from_pixbuf() will have to be handled
* by the application (GTK+ applications can learn about
* cursor theme changes by listening for change notification
* for the corresponding #GtkSetting).
@ -891,6 +822,57 @@ gdk_display_get_default_cursor_size (GdkDisplay *display)
#else
static GdkCursor*
gdk_cursor_new_from_pixmap (GdkPixmap *source,
GdkPixmap *mask,
const GdkColor *fg,
const GdkColor *bg,
gint x,
gint y)
{
GdkCursorPrivate *private;
GdkCursor *cursor;
Pixmap source_pixmap, mask_pixmap;
Cursor xcursor;
XColor xfg, xbg;
GdkDisplay *display;
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_pixmap = GDK_PIXMAP_XID (source);
mask_pixmap = GDK_PIXMAP_XID (mask);
display = GDK_PIXMAP_DISPLAY (source);
xfg.pixel = fg->pixel;
xfg.red = fg->red;
xfg.blue = fg->blue;
xfg.green = fg->green;
xbg.pixel = bg->pixel;
xbg.red = bg->red;
xbg.blue = bg->blue;
xbg.green = bg->green;
if (display->closed)
xcursor = None;
else
xcursor = XCreatePixmapCursor (GDK_DISPLAY_XDISPLAY (display),
source_pixmap, mask_pixmap, &xfg, &xbg, x, y);
private = g_new (GdkCursorPrivate, 1);
private->display = display;
private->xcursor = xcursor;
private->name = NULL;
private->serial = theme_serial;
cursor = (GdkCursor *) private;
cursor->type = GDK_CURSOR_IS_PIXMAP;
cursor->ref_count = 1;
return cursor;
}
GdkCursor *
gdk_cursor_new_from_pixbuf (GdkDisplay *display,
GdkPixbuf *pixbuf,