struct dimensions { double pw; /* paper width */ double ph; /* paper height */ double mw; /* month width */ double mh; /* month height */ double bw; /* day box width */ double bh; /* day box height */ double r; /* rows */ double c; /* columns */ double m; /* margin */ }; int draw_calendar(cairo_t *c, double x, double y, struct dimensions d) { double x1, y1, x2, y2; x1 = x; y1 = y; x2 = d.pw - x1; /* Set the line endpoint to right side of the page */ for (int i = 0; i < d.r + 1; i++) { /* Draw Horizontal Lines */ cairo_move_to (c, x, y); cairo_line_to (c, x2, y); y = y + d.bh; } x = x1; y = y1; y2 = y1 + d.mh; /* Set the line endpoint as the bottom of the month */ for (int i = 0; i < d.c + 1; i++) { /* Draw Vertical Lines */ cairo_move_to (c, x, y); cairo_line_to (c, x, y2); x = x + d.bw; } cairo_stroke(c); return(0); } int draw_numbers(cairo_t *c, double x, double y, struct dimensions d, int wd, int nd) { char str[3]; cairo_text_extents_t te; cairo_font_extents_t fe; cairo_select_font_face (c, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (c, d.bw / 2); int iterative = 0; cairo_font_extents (c, &fe); double yi = y; double xi = x; int current_weekday = wd; x = d.m + (wd * d.bw); for (int j = 0; j < d.r; j++) { y = y + d.bh - ((d.bh - fe.ascent) / 2); for (int k = current_weekday; k < d.c; k++) { if (iterative < nd) { sprintf(str, "%d", iterative + 1); cairo_text_extents (c, str, &te); double box_margins = (d.bw - te.width) / 2; cairo_move_to(c, x + box_margins - te.x_bearing, y); /* center the number within the box */ cairo_show_text(c, str); cairo_move_to(c, x, y); /* Sort of backtrack to realign with the spacing of the boxes */ x = x + d.bw; iterative++; current_weekday++; } } current_weekday = 0; y = y - (d.bh - ((d.bh - fe.ascent) / 2)); y = y + d.bh; x = xi; } return(0); } int draw_month_name(cairo_t *c, char *name, struct dimensions d) { double x, y = d.m; cairo_set_font_size(c, 1.0); cairo_text_extents_t te; cairo_font_extents_t fe; cairo_text_extents(c, name, &te); x = (d.pw / 2) - (te.width / 2); y = 1.5; cairo_move_to(c, x, y); cairo_show_text(c, &name[0]); return(0); }