[evolution] calendar: Draw day view with cairo
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] calendar: Draw day view with cairo
- Date: Fri, 29 Oct 2010 18:40:39 +0000 (UTC)
commit 90381cf3bcd346c3e042efa12f9cbd1b3bb2e1ff
Author: Benjamin Otte <otte redhat com>
Date: Thu Oct 21 00:45:43 2010 +0200
calendar: Draw day view with cairo
calendar/gui/e-day-view-main-item.c | 5 ---
calendar/gui/e-day-view-top-item.c | 68 +++++++++++++++++------------------
calendar/gui/e-day-view.c | 14 -------
calendar/gui/e-day-view.h | 3 --
4 files changed, 33 insertions(+), 57 deletions(-)
---
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
index a0d881d..366062f 100644
--- a/calendar/gui/e-day-view-main-item.c
+++ b/calendar/gui/e-day-view-main-item.c
@@ -192,7 +192,6 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
EDayViewEvent *event;
ECalModel *model;
gint item_x, item_y, item_w, item_h, bar_y1, bar_y2;
- GdkGC *gc;
GdkColor bg_color;
ECalComponent *comp;
gint num_icons, icon_x, icon_y, icon_x_inc = 0, icon_y_inc = 0;
@@ -247,8 +246,6 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
gdk_cairo_set_source_color (cr,
&day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
- gc = day_view->main_gc;
-
gradient = calendar_config_get_display_events_gradient ();
alpha = calendar_config_get_display_events_alpha ();
@@ -725,8 +722,6 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
#undef draw_pixbuf
#undef fit_in_event
-
- gdk_gc_set_clip_mask (gc, NULL);
}
/* free memory */
diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c
index 126f983..fffb614 100644
--- a/calendar/gui/e-day-view-top-item.c
+++ b/calendar/gui/e-day-view-top-item.c
@@ -157,7 +157,6 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
EDayView *day_view;
EDayViewEvent *event;
GtkStyle *style;
- GdkGC *gc, *fg_gc;
gint start_day, end_day;
gint item_x, item_y, item_w, item_h;
gint text_x, icon_x, icon_y, icon_x_inc;
@@ -168,7 +167,6 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
gint min_end_time_x, suffix_width, max_icon_x;
const gchar *suffix;
gboolean draw_start_triangle, draw_end_triangle;
- GdkRectangle clip_rect;
GSList *categories_list, *elem;
PangoLayout *layout;
GdkColor bg_color;
@@ -210,8 +208,6 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
return;
style = gtk_widget_get_style (GTK_WIDGET (day_view));
- gc = day_view->main_gc;
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (
comp, icalcomponent_new_clone (event->comp_data->icalcomp));
@@ -350,6 +346,8 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
time_width = e_day_view_get_time_string_width (day_view);
+ gdk_cairo_set_source_color (cr, &style->fg[GTK_STATE_NORMAL]);
+
if (event->start > day_view->day_starts[start_day]) {
offset = day_view->first_hour_shown * 60
+ day_view->first_minute_shown + event->start_minute;
@@ -368,25 +366,26 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
display_hour, minute, suffix);
}
- clip_rect.x = item_x - x;
- clip_rect.y = item_y - y;
- clip_rect.width = item_w - E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH;
- clip_rect.height = item_h;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
+ cairo_save (cr);
+
+ cairo_rectangle (cr,
+ item_x - x, item_y - y,
+ item_w - E_DAY_VIEW_LONG_EVENT_BORDER_WIDTH, item_h);
+ cairo_clip (cr);
time_x = item_x + E_DAY_VIEW_LONG_EVENT_X_PAD - x;
if (display_hour < 10)
time_x += day_view->digit_width;
layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- gdk_draw_layout (drawable, fg_gc,
- time_x,
- item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT +
- E_DAY_VIEW_LONG_EVENT_Y_PAD - y,
- layout);
+ cairo_move_to (cr,
+ time_x,
+ item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT +
+ E_DAY_VIEW_LONG_EVENT_Y_PAD - y);
+ pango_cairo_show_layout (cr, layout);
g_object_unref (layout);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
+ cairo_restore (cr);
min_end_time_x += time_width
+ E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
@@ -424,10 +423,10 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
time_x += day_view->digit_width;
layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
- gdk_draw_layout (drawable, fg_gc,
- time_x,
- item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD + 1 - y,
- layout);
+ cairo_move_to (cr,
+ time_x,
+ item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD + 1 - y);
+ pango_cairo_show_layout (cr, layout);
g_object_unref (layout);
max_icon_x -= time_width + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD;
@@ -495,13 +494,13 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
continue;
if (icon_x <= max_icon_x) {
- gdk_gc_set_clip_origin (gc, icon_x, icon_y);
- gdk_draw_pixbuf (drawable, gc,
- pixbuf,
- 0, 0, icon_x, icon_y,
+ gdk_cairo_set_source_pixbuf (cr, pixbuf,
+ icon_x, icon_y);
+ cairo_rectangle (cr,
+ icon_x, icon_y,
E_DAY_VIEW_ICON_WIDTH,
- E_DAY_VIEW_ICON_HEIGHT,
- GDK_RGB_DITHER_NORMAL, 0, 0);
+ E_DAY_VIEW_ICON_HEIGHT);
+ cairo_fill (cr);
icon_x -= icon_x_inc;
}
}
@@ -509,7 +508,6 @@ day_view_top_item_draw_long_event (EDayViewTopItem *top_item,
e_cal_component_free_categories_list (categories_list);
g_object_unref (comp);
cairo_destroy (cr);
- gdk_gc_set_clip_mask (gc, NULL);
}
static void
@@ -603,7 +601,6 @@ day_view_top_item_draw (GnomeCanvasItem *canvas_item,
EDayViewTopItem *top_item;
EDayView *day_view;
GtkStyle *style;
- GdkGC *fg_gc;
gchar buffer[128];
GtkAllocation allocation;
GdkRectangle clip_rect;
@@ -622,7 +619,6 @@ day_view_top_item_draw (GnomeCanvasItem *canvas_item,
cr = gdk_cairo_create (drawable);
style = gtk_widget_get_style (GTK_WIDGET (day_view));
- fg_gc = style->fg_gc[GTK_STATE_NORMAL];
gtk_widget_get_allocation (
GTK_WIDGET (canvas_item->canvas), &allocation);
canvas_width = allocation.width;
@@ -720,19 +716,21 @@ day_view_top_item_draw (GnomeCanvasItem *canvas_item,
clip_rect.width = day_view->day_widths[day];
clip_rect.height = item_height - 2;
- gdk_gc_set_clip_rectangle (fg_gc, &clip_rect);
+ cairo_save (cr);
+
+ gdk_cairo_rectangle (cr, &clip_rect);
+ cairo_clip (cr);
layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer);
pango_layout_get_pixel_size (layout, &date_width, NULL);
date_x = day_view->day_offsets[day] + (clip_rect.width - date_width) / 2;
- gdk_draw_layout (drawable, fg_gc,
- date_x - x,
- 3 - y,
- layout);
- g_object_unref (layout);
+ gdk_cairo_set_source_color (cr, &style->fg[GTK_STATE_NORMAL]);
+ cairo_move_to (cr, date_x - x, 3 - y);
+ pango_cairo_show_layout (cr, layout);
- gdk_gc_set_clip_rectangle (fg_gc, NULL);
+ g_object_unref (layout);
+ cairo_restore (cr);
/* Draw the lines down the left and right of the date cols. */
if (day != 0) {
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 8f04f51..1482398 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -1036,7 +1036,6 @@ e_day_view_init (EDayView *day_view)
day_view->last_hour_shown = 24;
day_view->last_minute_shown = 0;
- day_view->main_gc = NULL;
e_day_view_recalc_num_rows (day_view);
day_view->working_days = E_DAY_VIEW_MONDAY | E_DAY_VIEW_TUESDAY
@@ -1430,7 +1429,6 @@ static void
e_day_view_realize (GtkWidget *widget)
{
EDayView *day_view;
- GdkColormap *colormap;
GdkWindow *window;
if (GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)
@@ -1438,16 +1436,11 @@ e_day_view_realize (GtkWidget *widget)
day_view = E_DAY_VIEW (widget);
window = gtk_widget_get_window (widget);
- day_view->main_gc = gdk_gc_new (window);
-
- colormap = gtk_widget_get_colormap (widget);
/* Allocate the colors. */
e_day_view_set_colors (day_view, widget);
- gdk_gc_set_colormap (day_view->main_gc, colormap);
-
/* Create the pixmaps. */
day_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", GTK_ICON_SIZE_MENU);
day_view->recurrence_icon = e_icon_factory_get_icon ("view-refresh", GTK_ICON_SIZE_MENU);
@@ -1500,16 +1493,9 @@ static void
e_day_view_unrealize (GtkWidget *widget)
{
EDayView *day_view;
- GdkColormap *colormap;
day_view = E_DAY_VIEW (widget);
- g_object_unref (day_view->main_gc);
- day_view->main_gc = NULL;
-
- colormap = gtk_widget_get_colormap (widget);
- gdk_colormap_free_colors (colormap, day_view->colors, E_DAY_VIEW_COLOR_LAST);
-
g_object_unref (day_view->reminder_icon);
day_view->reminder_icon = NULL;
g_object_unref (day_view->recurrence_icon);
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
index 45397d9..04f4186 100644
--- a/calendar/gui/e-day-view.h
+++ b/calendar/gui/e-day-view.h
@@ -353,9 +353,6 @@ struct _EDayView {
PangoFontDescription *large_font_desc;
PangoFontDescription *small_font_desc;
- /* The GC used for painting in different colors. */
- GdkGC *main_gc;
-
/* The icons. */
GdkPixbuf *reminder_icon;
GdkPixbuf *recurrence_icon;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]