diff options
| author | foswret <foswret@posteo.com> | 2025-11-06 11:51:28 -0600 |
|---|---|---|
| committer | foswret <foswret@posteo.com> | 2025-11-06 11:51:28 -0600 |
| commit | 258532d738791a69a1db7df27849cd8d8ab0464e (patch) | |
| tree | 300af1864a9bf0212f832a20323bdd37a69cfc87 /main.c | |
first commit
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 135 |
1 files changed, 135 insertions, 0 deletions
@@ -0,0 +1,135 @@ +#include <cairo/cairo.h> +#include <cairo/cairo-pdf.h> +#include <stdio.h> +#include <string.h> +#include "include/color.h" + +double us_letter_paper_width = 8.5; +double us_letter_paper_height = 11; + +double paper_width = 8.5 * 72; /* 612.0 */ +double paper_height = 11 * 72; /* 792.0 */ +int number_of_days = 30; +int rows = 6; +int columns = 7; +double margin = 0.5; + +int draw_calendar(cairo_t *c, double x, double y) { + double x1, y1, x2, y2; + double month_width = us_letter_paper_width - (x * 2); + double month_height = us_letter_paper_height - y - margin; + double day_box_width = month_width / columns; + double day_box_height = month_height / rows; + + x1 = x; + y1 = y; + x2 = us_letter_paper_width - x1; /* Set the line endpoint to right side of the page */ + + for (int i = 0; i < rows + 1; i++) { /* Draw Horizontal Lines */ + cairo_move_to (c, x, y); + cairo_line_to (c, x2, y); + y = y + day_box_height; + } + + x = x1; + y = y1; + y2 = y1 + month_height; /* Set the line endpoint as the bottom of the month */ + for (int i = 0; i < columns + 1; i++) { /* Draw Vertical Lines */ + cairo_move_to (c, x, y); + cairo_line_to (c, x, y2); + x = x + day_box_width; + } + cairo_stroke(c); + return(0); +} + +int draw_numbers(cairo_t *c, double x, double y, int wd) { + double month_width = us_letter_paper_width - (x * 2); + double month_height = us_letter_paper_height - y - margin; + double day_box_width = month_width / columns; + double day_box_height = month_height / rows; + + char str[3]; + cairo_text_extents_t te; + cairo_font_extents_t fe; + + cairo_set_source_rgba(c, 0.0, 0.0, 0.0, 0.6); + cairo_select_font_face (c, "sans-serif", + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size (c, 0.5); + + int iterative = 0; + cairo_font_extents (c, &fe); + double yi = y; + double xi = x; + int current_weekday = wd; + x = margin + (wd * day_box_width); + for (int j = 0; j < rows; j++) { + y = y + day_box_height - ((day_box_height - fe.ascent) / 2); + for (int k = current_weekday; k < columns; k++) { + if (iterative < number_of_days) { + sprintf(str, "%d", iterative + 1); + cairo_text_extents (c, str, &te); + double box_margins = (day_box_width - 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 + day_box_width; + iterative++; + current_weekday++; + } + } + current_weekday = 0; + y = y - (day_box_height - ((day_box_height - fe.ascent) / 2)); + y = y + day_box_height; + x = xi; + } + return(0); +} + +int draw_month_name(cairo_t *c, char *name) { + double x, y = margin; + double month_width = us_letter_paper_width - (x * 2); + double month_height = us_letter_paper_height - y - margin; + double day_box_width = month_width / columns; + double day_box_height = month_height / rows; + cairo_set_source_rgb(c, 0.0, 0.0, 0.0); + cairo_set_font_size(c, 1.0); + cairo_text_extents_t te; + cairo_font_extents_t fe; + cairo_text_extents(c, name, &te); + x = (us_letter_paper_width / 2) - (te.width / 2); + y = 1.5; + cairo_move_to(c, x, y); + cairo_show_text(c, &name[0]); + return(0); +} + +int main (int argc, char *argv[]) { + char date_strings[number_of_days][2]; + char months[12][10] = {"January", "February", "March", "April", "May", + "June", "July", "August", "September", "October", "November", "December"}; + + char weekdays_abbr[7][5] = {"Su", "Mo", "Tue", "Wed", + "Thurs", "Fri", "Sat"}; + + cairo_surface_t * surface = cairo_pdf_surface_create("0.pdf", paper_width, paper_height); + cairo_t *cr = cairo_create(surface); + + cairo_scale(cr, 72, 72); + cairo_set_line_width(cr, 0.03); + cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.3); + double month_origin_x = margin; + double month_origin_y = 3.0; + + draw_calendar(cr, month_origin_x, month_origin_y); + draw_numbers(cr, month_origin_x, month_origin_y, 6); + draw_month_name(cr, months[10]); + + /* Clean Up */ + cairo_destroy(cr); + cairo_surface_destroy(surface); + + return(0); +} |
