From 9888653550fe9635d8fa71eef06f40ce0e2fc05c Mon Sep 17 00:00:00 2001 From: CodingPumpkin Date: Fri, 8 Mar 2024 14:22:10 +0300 Subject: [PATCH] Initial commit --- Makefile | 8 +++ README.md | 12 ++++ src/main.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 src/main.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b71d072 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +build: + gcc -Wall -lSDL2 -std=c99 ./src/*.c -o ./app + +run: + ./app + +clean: + rm ./app diff --git a/README.md b/README.md new file mode 100644 index 0000000..784f7cc --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# SingleDigitDrawer +## Motivation +I'm working on project that will eventually become a digital clock widget-like app for personal use. While doing that I ran across a problem: turned out I had no nice-looking digits for the clock's face. That's why I made this utility that can draw a single digit imitating a seven segment display. + +## Installation +The app uses SDL2 library so SDL2 is required to build and run it. Use my Makefile or write the gcc command manually. + +## Usage +This utility is meant mostly for my personal use so it is pretty junky and I don't plan on adding a -\-help flag or anything. Either way if you want to play around with it this is what you should know: +1) You can set height and width of the window with -h and -w flags respectively (naturally you'll need to enter an integer after each flag) +2) After that the program will expect you to enter a digit that you want it to display. If you enter a number larger than 9 it will take its last digit and draw that. +3) To quit enter any negative number (no, it does not accept ctrl+C signal and it doesn't read any input from your mouse. It's SDL, baby, those buttons aren't functional till I say so! B-) ) diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..0048540 --- /dev/null +++ b/src/main.c @@ -0,0 +1,177 @@ +#include +#include +#include + +SDL_Window *window = NULL; +SDL_Renderer *renderer = NULL; +int init_window(int, int, int, int); +int destroy_window(void); +int running = 1; + + +SDL_Rect segments[7]; +struct scaler +{ + int smaller_side_size; + int larger_side_size; + int margin; +} sc; + +const uint8_t states[10] = +{ + 0x77,//0 + 0x24,//1 + 0x5d,//2 + 0x6d,//3 + 0x2e,//4 + 0x6b,//5 + 0x7b,//6 + 0x25,//7 + 0x7f,//8 + 0x6f//9 +}; + +void draw_digit(int); +void init_segments(void); +void calculate_scale(int, int); + +int main(int argc, char* argv[]) +{ + int width = 400, height = 780; + int pos_x = SDL_WINDOWPOS_CENTERED, pos_y =SDL_WINDOWPOS_CENTERED; + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "--width") == 0) + { + if(sscanf(argv[++i], "%d", &width)); + else width = 400; + } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--height") == 0) + { + if(sscanf(argv[++i], "%d", &height)); + else height = 800; + } + } + init_window(width, height, pos_x, pos_y); + calculate_scale(width, height); + init_segments(); + int n = 0; + while (running) + { + draw_digit(n); + if (scanf("%d", &n)) + { + if (n<0) running = 0; + } + else + { + printf("Invalid input!!!\n"); + } + n = n%10; + } + destroy_window(); + return 0; +} + +void calculate_scale(int w, int h) +{ + if (h > 2*w) + { + sc.smaller_side_size = w/10; + sc.margin = sc.smaller_side_size/5; + sc.larger_side_size = w - 2*sc.smaller_side_size - 2*sc.margin; + } else + { + sc.smaller_side_size = h/20; + sc.margin = sc.smaller_side_size/5; + sc.larger_side_size = (h - 3*sc.smaller_side_size - 4*sc.margin)/2; + } +} + +void draw_digit(int n) +{ + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + for (int i = 0; i<7; i++) + { + if((states[n]>>i) & 1) + SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); + else + SDL_SetRenderDrawColor(renderer, 64, 64, 64, 128); + SDL_RenderFillRect(renderer, &segments[i]); + } + SDL_RenderPresent(renderer); +} + +void init_segments(void) +{ + for (int i = 0; i<7; i++) + { + if(i%3 == 0) + { + segments[i].w = sc.larger_side_size; + segments[i].h = sc.smaller_side_size; + } + else + { + segments[i].h = sc.larger_side_size; + segments[i].w = sc.smaller_side_size; + } + } + segments[0].x = sc.smaller_side_size + sc.margin; + segments[0].y = 0; + + segments[1].x = 0; + segments[1].y = sc.smaller_side_size + sc.margin; + + segments[2].x = sc.larger_side_size + sc.smaller_side_size + 2*sc.margin; + segments[2].y = sc.smaller_side_size + sc.margin; + + segments[3].x = sc.smaller_side_size + sc.margin; + segments[3].y = sc.larger_side_size + sc.smaller_side_size + 2*sc.margin; + + segments[4].x = 0; + segments[4].y = sc.larger_side_size + 2*(sc.smaller_side_size + sc.margin); + + segments[5].x = sc.larger_side_size + sc.smaller_side_size + 2*sc.margin;; + segments[5].y = sc.larger_side_size + 2*(sc.smaller_side_size + sc.margin); + + segments[6].x = sc.smaller_side_size + sc.margin; + segments[6].y = 2*sc.larger_side_size + 2*sc.smaller_side_size + 4*sc.margin; +} + +int init_window(int w, int h, int pos_x, int pos_y) +{ + if(SDL_Init(SDL_INIT_EVERYTHING) != 0) + { + fprintf(stderr, "Error initializing SDL.\n"); + return 1; + } + window = SDL_CreateWindow( + "SevenSegment", + pos_x, + pos_y, + w, + h, + SDL_WINDOW_SHOWN //| SDL_WINDOW_BORDERLESS + ); + if (!window) + { + fprintf(stderr, "Error initializing window.\n"); + return 1; + } + renderer = SDL_CreateRenderer(window, -1, 0); + if (!renderer) + { + fprintf(stderr, "Error initializing renderer.\n"); + return 1; + } + return 0; +} + +int destroy_window(void) +{ + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +}