first, incomplete attempt at using the anti-aliased mode of the canvas for

first, incomplete attempt at using the anti-aliased mode of the
	 canvas for the icon container. It's optionally enabled by a
	 compile-time flag. There's no text drawing yet.
This commit is contained in:
Andy Hertzfeld 2000-05-22 22:06:46 +00:00
parent c8c4ad60f6
commit ec38801b2f
7 changed files with 205 additions and 36 deletions

View file

@ -1,3 +1,26 @@
2000-05-22 Andy Hertzfeld <andy@eazel.com>
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 <pepper@eazel.com>
* components/services/time/service/.cvsignore: Adding .cvsignore.

View file

@ -33,6 +33,8 @@
#include <libgnome/gnome-i18n.h>
#include <libgnomeui/gnome-canvas-util.h>
#include <libgnomeui/gnome-icon-text.h>
#include <libart_lgpl/art_rgb_affine.h>
#include <libart_lgpl/art_rgb_rgba_affine.h>
#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

View file

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

View file

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

View file

@ -33,6 +33,8 @@
#include <libgnome/gnome-i18n.h>
#include <libgnomeui/gnome-canvas-util.h>
#include <libgnomeui/gnome-icon-text.h>
#include <libart_lgpl/art_rgb_affine.h>
#include <libart_lgpl/art_rgb_rgba_affine.h>
#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

View file

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

View file

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