diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | 0.pdf | bin | 0 -> 7444 bytes | |||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | README | 11 | ||||
| -rw-r--r-- | include/color.h | 9 | ||||
| -rw-r--r-- | main.c | 135 |
6 files changed, 158 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53752db --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +output Binary files differdiff --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 @@ -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); + } @@ -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); +} |
