diff --git a/ChangeLog b/ChangeLog index 173f8d5e9..c82e49995 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2000-05-22 Andy Hertzfeld + + first, incomplete attempt to use the anti-aliased canvas. + For now, it's a compile-time flag in nautilus-icon-container to + optionally enable it, and there's no text drawing in aa mode yet. + + * libnautilus-extensions/nautilus-icon-canvas-item.c: + (nautilus_icon_canvas_item_initialize_class), (draw_pixbuf), + (nautilus_icon_canvas_item_render): + added a render method to draw the item in anti-aliased mode + + * libnautilus-extensions/nautilus-icon-container.c: + (start_rubberbanding), (nautilus_icon_container_new): + optionally put the canvas in anti-aliased mode if a compile-time + flag is set; added code to make the selection rectangle semi-transparent + in anti-aliased mode. + + * libnautilus-extensions/nautilus-icon-dnd.c: + (nautilus_icon_dnd_begin_drag): + at Arlo's suggestion, changed the alpha threshold used to compute + the pixmap to drag from the pixbuf, so it doesn't look so lumpy when + there's lots of information in the alpha channel + 2000-05-22 J Shane Culpepper * components/services/time/service/.cvsignore: Adding .cvsignore. diff --git a/libnautilus-extensions/nautilus-icon-canvas-item.c b/libnautilus-extensions/nautilus-icon-canvas-item.c index ca7a25d4a..8323741fe 100644 --- a/libnautilus-extensions/nautilus-icon-canvas-item.c +++ b/libnautilus-extensions/nautilus-icon-canvas-item.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include "nautilus-icon-private.h" #include "nautilus-string.h" #include "nautilus-glib-extensions.h" @@ -131,6 +133,8 @@ static void nautilus_icon_canvas_item_draw (GnomeCanvasItem int y, int width, int height); +static void nautilus_icon_canvas_item_render (GnomeCanvasItem *item, + GnomeCanvasBuf *buffer); static double nautilus_icon_canvas_item_point (GnomeCanvasItem *item, double x, double y, @@ -210,6 +214,7 @@ nautilus_icon_canvas_item_initialize_class (NautilusIconCanvasItemClass *class) item_class->update = nautilus_icon_canvas_item_update; item_class->draw = nautilus_icon_canvas_item_draw; + item_class->render = nautilus_icon_canvas_item_render; item_class->point = nautilus_icon_canvas_item_point; item_class->bounds = nautilus_icon_canvas_item_bounds; item_class->event = nautilus_icon_canvas_item_event; @@ -921,10 +926,9 @@ draw_pixbuf (GdkPixbuf *pixbuf, GdkDrawable *drawable, int x, int y) gdk_pixbuf_get_height (pixbuf), GDK_PIXBUF_ALPHA_BILEVEL, 128, GDK_RGB_DITHER_MAX, 0, 0); - } -/* Draw the icon item. */ +/* Draw the icon item for non-anti-aliased mode. */ static void nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) @@ -986,6 +990,51 @@ nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, draw_label_text (icon_item, drawable, icon_rect.x0, icon_rect.y1); } + +/* draw the item for anti-aliased mode */ + +static void +nautilus_icon_canvas_item_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf) +{ + + GdkPixbuf *pixbuf; + NautilusIconCanvasItem *icon_item; + double i2c[6]; + + icon_item = NAUTILUS_ICON_CANVAS_ITEM (item); + pixbuf = icon_item->details->pixbuf; + + if (!pixbuf) + return; + + gnome_canvas_item_i2c_affine (item, i2c); + gnome_canvas_buf_ensure_buf (buf); + + if (gdk_pixbuf_get_has_alpha(pixbuf)) + art_rgb_rgba_affine (buf->buf, + buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1, + buf->buf_rowstride, + gdk_pixbuf_get_pixels(pixbuf), + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + gdk_pixbuf_get_rowstride(pixbuf), + i2c, + ART_FILTER_NEAREST, + NULL); + else + art_rgb_affine (buf->buf, + buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1, + buf->buf_rowstride, + gdk_pixbuf_get_pixels(pixbuf), + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + gdk_pixbuf_get_rowstride(pixbuf), + i2c, + ART_FILTER_NEAREST, + NULL); + + buf->is_bg = FALSE; +} + + /* handle events */ static int diff --git a/libnautilus-extensions/nautilus-icon-container.c b/libnautilus-extensions/nautilus-icon-container.c index 978c41772..35460bef9 100644 --- a/libnautilus-extensions/nautilus-icon-container.c +++ b/libnautilus-extensions/nautilus-icon-container.c @@ -75,6 +75,9 @@ #define MAXIMUM_IMAGE_SIZE 1000 #define MAXIMUM_EMBLEM_SIZE 100 +/* for now, anti-aliased mode is a compile time option, defaulted off */ +#define ANTI_ALIASED 0 + static void activate_selected_items (NautilusIconContainer *container); static void nautilus_icon_container_initialize_class (NautilusIconContainerClass *class); static void nautilus_icon_container_initialize (NautilusIconContainer *container); @@ -886,20 +889,36 @@ start_rubberbanding (NautilusIconContainer *container, event->x, event->y, &band_info->start_x, &band_info->start_y); - band_info->selection_rectangle = gnome_canvas_item_new - (gnome_canvas_root - (GNOME_CANVAS (container)), - gnome_canvas_rect_get_type (), - "x1", band_info->start_x, - "y1", band_info->start_y, - "x2", band_info->start_x, - "y2", band_info->start_y, - "fill_color", "lightblue", - "fill_stipple", stipple, - "outline_color", "lightblue", - "width_pixels", 1, - NULL); - + if (GNOME_CANVAS(container)->aa) { + band_info->selection_rectangle = gnome_canvas_item_new + (gnome_canvas_root + (GNOME_CANVAS (container)), + gnome_canvas_rect_get_type (), + "x1", band_info->start_x, + "y1", band_info->start_y, + "x2", band_info->start_x, + "y2", band_info->start_y, + "fill_color_rgba", 0x77bbdd80, + "outline_color_rgba", 0x77bbddFF, + "width_pixels", 1, + NULL); + + } else { + band_info->selection_rectangle = gnome_canvas_item_new + (gnome_canvas_root + (GNOME_CANVAS (container)), + gnome_canvas_rect_get_type (), + "x1", band_info->start_x, + "y1", band_info->start_y, + "x2", band_info->start_x, + "y2", band_info->start_y, + "fill_color", "lightblue", + "fill_stipple", stipple, + "outline_color", "lightblue", + "width_pixels", 1, + NULL); + } + band_info->prev_x = event->x; band_info->prev_y = event->y; @@ -2595,16 +2614,21 @@ item_event_callback (GnomeCanvasItem *item, GtkWidget * nautilus_icon_container_new (void) { + GnomeCanvas *canvas; GtkWidget *new; gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); new = gtk_type_new (nautilus_icon_container_get_type ()); - + gtk_widget_pop_visual (); gtk_widget_pop_colormap (); + canvas = GNOME_CANVAS(new); + if (ANTI_ALIASED) + canvas->aa = TRUE; + return new; } diff --git a/libnautilus-extensions/nautilus-icon-dnd.c b/libnautilus-extensions/nautilus-icon-dnd.c index 3ff6da6db..c20ad2d4f 100644 --- a/libnautilus-extensions/nautilus-icon-dnd.c +++ b/libnautilus-extensions/nautilus-icon-dnd.c @@ -1138,7 +1138,7 @@ nautilus_icon_dnd_begin_drag (NautilusIconContainer *container, gdk_pixbuf_render_pixmap_and_mask (transparent_pixbuf, &pixmap_for_dragged_file, &mask_for_dragged_file, - 128); + 2); gdk_pixbuf_unref (transparent_pixbuf); diff --git a/libnautilus-private/nautilus-icon-canvas-item.c b/libnautilus-private/nautilus-icon-canvas-item.c index ca7a25d4a..8323741fe 100644 --- a/libnautilus-private/nautilus-icon-canvas-item.c +++ b/libnautilus-private/nautilus-icon-canvas-item.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include "nautilus-icon-private.h" #include "nautilus-string.h" #include "nautilus-glib-extensions.h" @@ -131,6 +133,8 @@ static void nautilus_icon_canvas_item_draw (GnomeCanvasItem int y, int width, int height); +static void nautilus_icon_canvas_item_render (GnomeCanvasItem *item, + GnomeCanvasBuf *buffer); static double nautilus_icon_canvas_item_point (GnomeCanvasItem *item, double x, double y, @@ -210,6 +214,7 @@ nautilus_icon_canvas_item_initialize_class (NautilusIconCanvasItemClass *class) item_class->update = nautilus_icon_canvas_item_update; item_class->draw = nautilus_icon_canvas_item_draw; + item_class->render = nautilus_icon_canvas_item_render; item_class->point = nautilus_icon_canvas_item_point; item_class->bounds = nautilus_icon_canvas_item_bounds; item_class->event = nautilus_icon_canvas_item_event; @@ -921,10 +926,9 @@ draw_pixbuf (GdkPixbuf *pixbuf, GdkDrawable *drawable, int x, int y) gdk_pixbuf_get_height (pixbuf), GDK_PIXBUF_ALPHA_BILEVEL, 128, GDK_RGB_DITHER_MAX, 0, 0); - } -/* Draw the icon item. */ +/* Draw the icon item for non-anti-aliased mode. */ static void nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) @@ -986,6 +990,51 @@ nautilus_icon_canvas_item_draw (GnomeCanvasItem *item, GdkDrawable *drawable, draw_label_text (icon_item, drawable, icon_rect.x0, icon_rect.y1); } + +/* draw the item for anti-aliased mode */ + +static void +nautilus_icon_canvas_item_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf) +{ + + GdkPixbuf *pixbuf; + NautilusIconCanvasItem *icon_item; + double i2c[6]; + + icon_item = NAUTILUS_ICON_CANVAS_ITEM (item); + pixbuf = icon_item->details->pixbuf; + + if (!pixbuf) + return; + + gnome_canvas_item_i2c_affine (item, i2c); + gnome_canvas_buf_ensure_buf (buf); + + if (gdk_pixbuf_get_has_alpha(pixbuf)) + art_rgb_rgba_affine (buf->buf, + buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1, + buf->buf_rowstride, + gdk_pixbuf_get_pixels(pixbuf), + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + gdk_pixbuf_get_rowstride(pixbuf), + i2c, + ART_FILTER_NEAREST, + NULL); + else + art_rgb_affine (buf->buf, + buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1, + buf->buf_rowstride, + gdk_pixbuf_get_pixels(pixbuf), + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + gdk_pixbuf_get_rowstride(pixbuf), + i2c, + ART_FILTER_NEAREST, + NULL); + + buf->is_bg = FALSE; +} + + /* handle events */ static int diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index 978c41772..35460bef9 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -75,6 +75,9 @@ #define MAXIMUM_IMAGE_SIZE 1000 #define MAXIMUM_EMBLEM_SIZE 100 +/* for now, anti-aliased mode is a compile time option, defaulted off */ +#define ANTI_ALIASED 0 + static void activate_selected_items (NautilusIconContainer *container); static void nautilus_icon_container_initialize_class (NautilusIconContainerClass *class); static void nautilus_icon_container_initialize (NautilusIconContainer *container); @@ -886,20 +889,36 @@ start_rubberbanding (NautilusIconContainer *container, event->x, event->y, &band_info->start_x, &band_info->start_y); - band_info->selection_rectangle = gnome_canvas_item_new - (gnome_canvas_root - (GNOME_CANVAS (container)), - gnome_canvas_rect_get_type (), - "x1", band_info->start_x, - "y1", band_info->start_y, - "x2", band_info->start_x, - "y2", band_info->start_y, - "fill_color", "lightblue", - "fill_stipple", stipple, - "outline_color", "lightblue", - "width_pixels", 1, - NULL); - + if (GNOME_CANVAS(container)->aa) { + band_info->selection_rectangle = gnome_canvas_item_new + (gnome_canvas_root + (GNOME_CANVAS (container)), + gnome_canvas_rect_get_type (), + "x1", band_info->start_x, + "y1", band_info->start_y, + "x2", band_info->start_x, + "y2", band_info->start_y, + "fill_color_rgba", 0x77bbdd80, + "outline_color_rgba", 0x77bbddFF, + "width_pixels", 1, + NULL); + + } else { + band_info->selection_rectangle = gnome_canvas_item_new + (gnome_canvas_root + (GNOME_CANVAS (container)), + gnome_canvas_rect_get_type (), + "x1", band_info->start_x, + "y1", band_info->start_y, + "x2", band_info->start_x, + "y2", band_info->start_y, + "fill_color", "lightblue", + "fill_stipple", stipple, + "outline_color", "lightblue", + "width_pixels", 1, + NULL); + } + band_info->prev_x = event->x; band_info->prev_y = event->y; @@ -2595,16 +2614,21 @@ item_event_callback (GnomeCanvasItem *item, GtkWidget * nautilus_icon_container_new (void) { + GnomeCanvas *canvas; GtkWidget *new; gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); new = gtk_type_new (nautilus_icon_container_get_type ()); - + gtk_widget_pop_visual (); gtk_widget_pop_colormap (); + canvas = GNOME_CANVAS(new); + if (ANTI_ALIASED) + canvas->aa = TRUE; + return new; } diff --git a/libnautilus-private/nautilus-icon-dnd.c b/libnautilus-private/nautilus-icon-dnd.c index 3ff6da6db..c20ad2d4f 100644 --- a/libnautilus-private/nautilus-icon-dnd.c +++ b/libnautilus-private/nautilus-icon-dnd.c @@ -1138,7 +1138,7 @@ nautilus_icon_dnd_begin_drag (NautilusIconContainer *container, gdk_pixbuf_render_pixmap_and_mask (transparent_pixbuf, &pixmap_for_dragged_file, &mask_for_dragged_file, - 128); + 2); gdk_pixbuf_unref (transparent_pixbuf);