From 258532d738791a69a1db7df27849cd8d8ab0464e Mon Sep 17 00:00:00 2001 From: foswret Date: Thu, 6 Nov 2025 11:51:28 -0600 Subject: first commit --- .gitignore | 1 + 0.pdf | Bin 0 -> 7444 bytes Makefile | 2 + README | 11 +++++ include/color.h | 9 ++++ main.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 158 insertions(+) create mode 100644 .gitignore create mode 100644 0.pdf create mode 100644 Makefile create mode 100644 README create mode 100644 include/color.h create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53752db --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +output diff --git a/0.pdf b/0.pdf new file mode 100644 index 0000000..7372a1e Binary files /dev/null and b/0.pdf differ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4383372 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +main: main.c + clang main.c `pkg-config --cflags -libs cairo cairo-pdf` -o output diff --git a/README b/README new file mode 100644 index 0000000..069f555 --- /dev/null +++ b/README @@ -0,0 +1,11 @@ +calp: Generate elegant, printable calendars +=========================================== + +calp (CALendar-Print) is a command line tool that allows for the creation of calendars that can be printed. It aims to be highly customizable, with support for holidays, alternative color formatting, alternative calendar systems, month-specific images, various paper formats, and more. + +calp is written in C and utilizes the cairo library. All calculations relating to weekdays and holiday dates are done internally, meaning no programs like cal are used as a dependency. As such, if you find a bug, please create an issue on GitHub. + +Install +======= + + diff --git a/include/color.h b/include/color.h new file mode 100644 index 0000000..f7ac991 --- /dev/null +++ b/include/color.h @@ -0,0 +1,9 @@ + int set_color(cairo_t *c, char *str) { + if (strcmp("BLACK", str) == 0) { + cairo_set_source_rgb (c, 0.0, 0.0, 0.0); + } + if (strcmp("BLUE", str) == 0) { + cairo_set_source_rgb (c, 0.0, 0.0, 255.0); + } + return(0); + } diff --git a/main.c b/main.c new file mode 100644 index 0000000..daa1e40 --- /dev/null +++ b/main.c @@ -0,0 +1,135 @@ +#include +#include +#include +#include +#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); +} -- cgit v1.2.3