|
From: <si...@us...> - 2008-09-06 19:37:38
|
Revision: 556
http://osmo-pim.svn.sourceforge.net/osmo-pim/?rev=556&view=rev
Author: silloz
Date: 2008-09-06 19:37:48 +0000 (Sat, 06 Sep 2008)
Log Message:
-----------
* Moved common drawing-related functions to utils.c
Modified Paths:
--------------
trunk/src/calendar_widget.c
trunk/src/gui.h
trunk/src/utils.c
trunk/src/utils.h
Modified: trunk/src/calendar_widget.c
===================================================================
--- trunk/src/calendar_widget.c 2008-08-19 18:20:18 UTC (rev 555)
+++ trunk/src/calendar_widget.c 2008-09-06 19:37:48 UTC (rev 556)
@@ -54,6 +54,7 @@
#include "gui.h"
#include "calendar_widget.h"
#include "calendar_utils.h"
+#include "utils.h"
/***************************************************************************/
/* The following date routines are taken from the lib_date package.
@@ -1941,6 +1942,107 @@
}
static void
+cal_draw_rounded_rectangle (cairo_t *cr, GdkRectangle *rect, GdkColor *color, gint alpha, gint stroke)
+{
+ utl_cairo_set_color (cr, color, alpha);
+ utl_draw_rounded_rectangle (cr, rect->x, rect->y, rect->width, rect->height, rect->height * 0.2, 1);
+ utl_cairo_draw (cr, stroke);
+}
+
+static void
+cal_draw_left_arrow (cairo_t *cr, GdkRectangle *rect, GdkColor *color, gint alpha)
+{
+ utl_cairo_set_color (cr, color, alpha);
+ utl_draw_left_arrow (cr, rect->x + rect->width * 0.8, rect->y + rect->height * 0.5,
+ rect->width * 0.13, rect->height * 0.55, 0.65);
+ cairo_fill (cr);
+}
+
+static void
+cal_draw_ellipse (cairo_t *cr, GdkRectangle *rect, GdkColor *color)
+{
+ gdk_cairo_set_source_color (cr, color);
+ cairo_save (cr);
+ cairo_scale (cr, 2, 1);
+ cairo_arc (cr, (rect->x + (rect->width * 0.5)) * 0.5, rect->y + rect->height * 0.5,
+ rect->height * 0.5 - 3.0, 0.0, 2.0 * M_PI);
+ cairo_fill (cr);
+ cairo_restore (cr);
+}
+
+static void
+cal_draw_wave (cairo_t *cr, GdkRectangle *rect, GdkColor *color)
+{
+ gdk_cairo_set_source_color (cr, color);
+ cairo_set_line_width (cr, rect->height * 0.7);
+ cairo_move_to (cr, rect->x + rect->width * 0.2, rect->y + rect->height * 0.5);
+ cairo_curve_to (cr, rect->x + rect->width * 0.5, rect->y + rect->height * 0.3,
+ rect->x + rect->width * 0.5, rect->y + rect->height * 0.7,
+ rect->x + rect->width * 0.8, rect->y + rect->height * 0.5);
+ cairo_stroke (cr);
+}
+
+static void
+cal_draw_circle (cairo_t *cr, GdkRectangle *rect, GdkColor *color)
+{
+ gdk_cairo_set_source_color (cr, color);
+ cairo_arc (cr, rect->x + rect->width * 0.5, rect->y + rect->height * 0.5, rect->height * 0.5 - 3.0, 0.0, 2.0 * M_PI);
+ cairo_fill (cr);
+}
+
+static void
+cal_draw_freehand_circle (cairo_t *cr, GdkRectangle *rect, GdkColor *color, guint alpha)
+{
+ gdouble dtop, dbottom, dleft, dright;
+ gdouble dwidth, dheight;
+
+ dheight = rect->height;
+ dwidth = dheight * 2.0;
+ dtop = rect->y;
+ dbottom = rect->y + dheight;
+ dleft = rect->x + (rect->width - dwidth) / 2.0;
+ dright = dleft + dwidth;
+
+ utl_cairo_set_color (cr, color, alpha);
+ cairo_move_to (cr, dleft + dwidth * 0.60, dtop);
+ cairo_curve_to (cr, dleft + dwidth * 0.05, dtop, dleft, dbottom, dleft + dwidth * 0.50, dbottom);
+ cairo_curve_to (cr, dright, dbottom,
+ dright - dwidth * 0.05, dtop - dheight * 0.15,
+ dleft + dwidth * 0.40, dtop + dheight * 0.20);
+ cairo_line_to (cr, dleft + dwidth * 0.40, dtop + dheight * 0.25);
+ cairo_curve_to (cr, dright - dwidth * 0.15, dtop - dheight * 0.05,
+ dright - dwidth * 0.05, dbottom - dheight * 0.15,
+ dleft + dwidth * 0.50, dbottom - dheight * 0.15);
+ cairo_curve_to (cr, dleft + dwidth * 0.05, dbottom - dheight * 0.15,
+ dleft + dwidth * 0.20, dtop,
+ dleft + dwidth * 0.60, dtop + dheight * 0.05);
+ cairo_close_path (cr);
+ cairo_fill (cr);
+}
+
+static void
+cal_cairo_draw_cursor (cairo_t *cr, GdkRectangle *rect, gint thickness)
+{
+ gint bias_x, bias_y, bias;
+
+ bias = thickness % 2;
+ bias_x = thickness >> 1;
+ bias_y = bias_x + bias;
+
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+
+ cairo_move_to (cr, rect->x+bias, rect->y+bias_y-bias);
+ cairo_line_to (cr, rect->x+rect->width-bias_x, rect->y+bias_y-bias);
+ cairo_line_to (cr, rect->x+rect->width-bias_x, rect->y+rect->height-bias_y);
+ cairo_line_to (cr, rect->x+bias_x+bias, rect->y+rect->height-bias_y);
+ cairo_line_to (cr, rect->x+bias_x+bias, rect->y+bias_y-bias_y*bias);
+ cairo_set_line_width (cr, thickness);
+ cairo_stroke (cr);
+
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
+}
+
+static void
calendar_paint_day (GuiCalendar *calendar,
gint row,
gint col) {
@@ -1950,7 +2052,6 @@
GdkColor *text_color;
gchar buffer[32];
gint day;
- gint bias_x, bias_y, bias;
gint x_loc, y_loc;
GdkRectangle day_rect;
time_t secs;
@@ -1992,100 +2093,43 @@
x_loc -= logical_rect.width;
y_loc = day_rect.y + (day_rect.height - logical_rect.height) / 2;
- if (calendar->marked_date[day-1] && calendar->day_month[row][col] == MONTH_CURRENT) {
- gdk_cairo_set_source_color (cr, &calendar->marked_date_color[day-1]);
- gdk_cairo_rectangle (cr, &day_rect);
- cairo_fill (cr);
- }
+ if (calendar->marked_date[day-1] && calendar->day_month[row][col] == MONTH_CURRENT) {
+ cal_draw_rounded_rectangle (cr, &day_rect, &calendar->marked_date_color[day-1], OPAQUE, 0);
+ }
- if (calendar->tc_marked_date[day-1] && calendar->day_month[row][col] == MONTH_CURRENT) {
+ if (calendar->tc_marked_date[day-1] && calendar->day_month[row][col] == MONTH_CURRENT) {
- gdk_cairo_set_source_color (cr, &calendar->event_marker_color);
-
if (calendar->event_marker_type == EVENT_MARKER_ELLIPSE) {
-
- cairo_save (cr);
- cairo_scale (cr, 2, 1);
- cairo_arc (cr, (day_rect.x + (day_rect.width * 0.5)) * 0.5, day_rect.y + day_rect.height * 0.5,
- day_rect.height * 0.5 - 3.0, 0.0, 2.0 * M_PI);
- cairo_fill (cr);
- cairo_restore (cr);
-
+ cal_draw_ellipse (cr, &day_rect, &calendar->event_marker_color);
} else if (calendar->event_marker_type == EVENT_MARKER_WAVE) {
-
- cairo_set_line_width (cr, day_rect.height * 0.7);
- cairo_move_to (cr, day_rect.x + day_rect.width * 0.2, day_rect.y + day_rect.height * 0.5);
- cairo_curve_to (cr, day_rect.x + day_rect.width * 0.5, day_rect.y + day_rect.height * 0.3,
- day_rect.x + day_rect.width * 0.5, day_rect.y + day_rect.height * 0.7,
- day_rect.x + day_rect.width * 0.8, day_rect.y + day_rect.height * 0.5);
- cairo_stroke (cr);
-
+ cal_draw_wave (cr, &day_rect, &calendar->event_marker_color);
} else {
+ cal_draw_circle (cr, &day_rect, &calendar->event_marker_color);
+ }
- cairo_arc (cr, day_rect.x + day_rect.width * 0.5, day_rect.y + day_rect.height * 0.5,
- day_rect.height * 0.5 - 3.0, 0.0, 2.0 * M_PI);
- cairo_fill (cr);
+ }
- }
- }
-
/* mark current day */
secs = time (NULL);
tm = localtime (&secs);
- if (calendar->month == tm->tm_mon && calendar->year == 1900 + tm->tm_year
- && calendar->day[row][col] == tm->tm_mday && calendar->day_month[row][col] == MONTH_CURRENT) {
- cairo_set_source_rgba (cr, (double)((&calendar->today_marker_color)->red) / 65535.0,
- (double)((&calendar->today_marker_color)->green) / 65535.0,
- (double)((&calendar->today_marker_color)->blue) / 65535.0,
- (double)(calendar->today_marker_alpha) / 65535.0);
+ if (calendar->month == tm->tm_mon && calendar->year == 1900 + tm->tm_year
+ && calendar->day[row][col] == tm->tm_mday && calendar->day_month[row][col] == MONTH_CURRENT) {
if (calendar->today_marker_type == TODAY_MARKER_FREEHAND_CIRCLE) {
-
- gdouble dtop, dbottom, dleft, dright;
- gdouble dwidth, dheight;
-
- dheight = day_rect.height;
- dwidth = dheight * 2.0;
- dtop = day_rect.y;
- dbottom = day_rect.y + dheight;
- dleft = day_rect.x + (day_rect.width - dwidth) / 2.0;
- dright = dleft + dwidth;
- cairo_move_to (cr, dleft + dwidth * 0.60, dtop);
- cairo_curve_to (cr, dleft + dwidth * 0.05, dtop, dleft, dbottom, dleft + dwidth * 0.50, dbottom);
- cairo_curve_to (cr, dright, dbottom,
- dright - dwidth * 0.05, dtop - dheight * 0.15,
- dleft + dwidth * 0.40, dtop + dheight * 0.20);
- cairo_line_to (cr, dleft + dwidth * 0.40, dtop + dheight * 0.25);
- cairo_curve_to (cr, dright - dwidth * 0.15, dtop - dheight * 0.05,
- dright - dwidth * 0.05, dbottom - dheight * 0.15,
- dleft + dwidth * 0.50, dbottom - dheight * 0.15);
- cairo_curve_to (cr, dleft + dwidth * 0.05, dbottom - dheight * 0.15,
- dleft + dwidth * 0.20, dtop,
- dleft + dwidth * 0.60, dtop + dheight * 0.05);
- cairo_close_path (cr);
- cairo_fill (cr);
-
+ cal_draw_freehand_circle (cr, &day_rect, &(calendar->today_marker_color), calendar->today_marker_alpha);
} else {
+ cal_draw_left_arrow (cr, &day_rect, &(calendar->today_marker_color), calendar->today_marker_alpha);
+ }
- cairo_move_to (cr, day_rect.x + day_rect.width * 0.92, day_rect.y + day_rect.height * 0.350);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.87, day_rect.y + day_rect.height * 0.350);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.87, day_rect.y + day_rect.height * 0.225);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.79, day_rect.y + day_rect.height * 0.5);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.87, day_rect.y + day_rect.height * 0.775);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.87, day_rect.y + day_rect.height * 0.650);
- cairo_line_to (cr, day_rect.x + day_rect.width * 0.92, day_rect.y + day_rect.height * 0.650);
- cairo_close_path (cr);
- cairo_fill (cr);
+ }
- }
- }
-
if (calendar->day_month[row][col] == MONTH_PREV) {
text_color = PREV_MONTH_COLOR (widget);
} else if (calendar->day_month[row][col] == MONTH_NEXT) {
text_color = NEXT_MONTH_COLOR (widget);
} else {
+
#if 0
if (calendar->highlight_row == row && calendar->highlight_col == col) {
cairo_set_source_color (cr, HIGHLIGHT_BG_COLOR (widget));
@@ -2093,39 +2137,19 @@
cairo_fill (cr);
}
#endif
- if (calendar->selected_day == day && calendar->enable_cursor == TRUE) {
- cairo_set_source_rgba (cr, (double)((&calendar->selector_color)->red) / 65535.0,
- (double)((&calendar->selector_color)->green) / 65535.0,
- (double)((&calendar->selector_color)->blue) / 65535.0,
- (double)(calendar->selector_alpha) / 65535.0);
+ if (calendar->selected_day == day && calendar->enable_cursor == TRUE) {
+ utl_cairo_set_color (cr, &calendar->selector_color, calendar->selector_alpha);
- if (calendar->cursor_type == CURSOR_FRAME) {
+ if (calendar->cursor_type == CURSOR_FRAME) {
+ cal_cairo_draw_cursor (cr, &day_rect, calendar->frame_cursor_thickness);
+ } else {
+ gdk_cairo_rectangle (cr, &day_rect);
+ cairo_fill (cr);
+ }
- bias = calendar->frame_cursor_thickness % 2;
- bias_x = calendar->frame_cursor_thickness >> 1;
- bias_y = bias_x + bias;
+ }
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-
- cairo_move_to (cr, day_rect.x+bias, day_rect.y+bias_y-bias);
- cairo_line_to (cr, day_rect.x+day_rect.width-bias_x, day_rect.y+bias_y-bias);
- cairo_line_to (cr, day_rect.x+day_rect.width-bias_x, day_rect.y+day_rect.height-bias_y);
- cairo_line_to (cr, day_rect.x+bias_x+bias, day_rect.y+day_rect.height-bias_y);
- cairo_line_to (cr, day_rect.x+bias_x+bias, day_rect.y+bias_y-bias_y*bias);
- cairo_set_line_width (cr, calendar->frame_cursor_thickness);
- cairo_stroke (cr);
-
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
-
- } else {
-
- gdk_cairo_rectangle (cr, &day_rect);
- cairo_fill (cr);
-
- }
- }
-
text_color = NORMAL_DAY_COLOR (widget);
/* mark saturday and sunday */
@@ -2135,8 +2159,8 @@
}
}
- if (calendar->enable_cursor == TRUE && calendar->cursor_type == CURSOR_BLOCK
- && calendar->selected_day == day && calendar->selector_alpha == 65535) {
+ if (calendar->enable_cursor == TRUE && calendar->cursor_type == CURSOR_BLOCK
+ && calendar->selected_day == day && calendar->selector_alpha == OPAQUE) {
text_color = SELECTED_FG_COLOR (widget);
}
}
Modified: trunk/src/gui.h
===================================================================
--- trunk/src/gui.h 2008-08-19 18:20:18 UTC (rev 555)
+++ trunk/src/gui.h 2008-09-06 19:37:48 UTC (rev 556)
@@ -55,6 +55,7 @@
#define MAX_WEEKS 6
#define DAYS_PER_WEEK 7
#define FULL_YEAR_COLS 37
+#define OPAQUE 65535
#define BUFFER_SIZE 2048
enum notebook_page {
Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c 2008-08-19 18:20:18 UTC (rev 555)
+++ trunk/src/utils.c 2008-09-06 19:37:48 UTC (rev 556)
@@ -555,3 +555,58 @@
/*------------------------------------------------------------------------------*/
+void
+utl_cairo_set_color (cairo_t *cr, GdkColor *color, gint alpha)
+{
+ cairo_set_source_rgba (cr, (double) color->red / 65535.0,
+ (double) color->green / 65535.0,
+ (double) color->blue / 65535.0,
+ (double) alpha / 65535.0);
+}
+
+/*------------------------------------------------------------------------------*/
+
+void
+utl_cairo_draw (cairo_t *cr, gint stroke)
+{
+ if (stroke) {
+ cairo_set_line_width (cr, stroke);
+ cairo_stroke (cr);
+ } else {
+ cairo_fill (cr);
+ }
+}
+
+/*------------------------------------------------------------------------------*/
+
+void
+utl_draw_rounded_rectangle (cairo_t *cr, gint x, gint y, gint w, gint h, gint a, gint s)
+{
+ cairo_move_to (cr, x + a + s, y + s);
+ cairo_line_to (cr, x + w - a - s, y + s);
+ cairo_arc (cr, x + w - a - s, y + a + s, a, 1.5 * M_PI, 2.0 * M_PI);
+ cairo_line_to (cr, x + w - s, y + h - a - s);
+ cairo_arc (cr, x + w - a - s, y + h - a - s, a, 0.0 * M_PI, 0.5 * M_PI);
+ cairo_line_to (cr, x + a + s, y + h - s);
+ cairo_arc (cr, x + a + s, y + h - a - s, a, 0.5 * M_PI, 1.0 * M_PI);
+ cairo_line_to (cr, x + s, y + a + s);
+ cairo_arc (cr, x + a + s, y + a + s, a, 1.0 * M_PI, 1.5 * M_PI);
+}
+
+/*------------------------------------------------------------------------------*/
+
+void
+utl_draw_left_arrow (cairo_t *cr, gdouble x, gdouble y, gdouble w, gdouble h, gdouble a)
+{
+ cairo_move_to (cr, x, y);
+ cairo_line_to (cr, x + w * a, y + h * 0.50);
+ cairo_line_to (cr, x + w * a, y + h * 0.25);
+ cairo_line_to (cr, x + w * 1, y + h * 0.25);
+ cairo_line_to (cr, x + w * 1, y - h * 0.25);
+ cairo_line_to (cr, x + w * a, y - h * 0.25);
+ cairo_line_to (cr, x + w * a, y - h * 0.50);
+ cairo_close_path (cr);
+}
+
+/*------------------------------------------------------------------------------*/
+
Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h 2008-08-19 18:20:18 UTC (rev 555)
+++ trunk/src/utils.h 2008-09-06 19:37:48 UTC (rev 556)
@@ -64,5 +64,10 @@
gboolean utl_is_valid_command (gchar *command);
gint utl_get_link_type (gchar *link);
+void utl_cairo_set_color (cairo_t *cr, GdkColor *color, gint alpha);
+void utl_cairo_draw (cairo_t *cr, gint stroke);
+void utl_draw_rounded_rectangle (cairo_t *cr, gint x, gint y, gint w, gint h, gint a, gint s);
+void utl_draw_left_arrow (cairo_t *cr, gdouble x, gdouble y, gdouble w, gdouble h, gdouble a);
+
#endif /* _UTILS_H */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|