From 83ab573efbc434128cf05b4a4c53090461e66927 Mon Sep 17 00:00:00 2001 From: Anton Lydike Date: Mon, 9 Mar 2020 22:03:18 +0100 Subject: [PATCH] performance improvements --- images/images.c | 54 ++++++++++++++++++++++++++++++++++++------------- images/images.h | 16 ++++++++++++++- main.c | 25 ++++++++++++++--------- 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/images/images.c b/images/images.c index 3b814f0..7bccef1 100644 --- a/images/images.c +++ b/images/images.c @@ -35,10 +35,7 @@ int image_new(int width, int height, Image* img) { // initialize bitmap... img->bitmap = malloc(height * sizeof(int*)); for (int i = 0; i < height; i++) { - img->bitmap[i] = malloc(width * sizeof(int*)); - for (int j = 0; j < width; j++) { - img->bitmap[i][j] = malloc(3 * sizeof(int)); - } + img->bitmap[i] = malloc(3 * width * sizeof(int)); } //*image = *img; @@ -93,10 +90,10 @@ int image_save(Image* image, char* path) { int line; for (line = 0; line < image->height; line++) { byte_pos = 0; - for (int px = 0; px < image->width; px++) { - bytes[byte_offset + byte_pos++] = image->bitmap[line][px][2]; - bytes[byte_offset + byte_pos++] = image->bitmap[line][px][1]; - bytes[byte_offset + byte_pos++] = image->bitmap[line][px][0]; + for (int px = 0; px < image->width * 3; px += 3) { + bytes[byte_offset + byte_pos++] = image->bitmap[line][px + 2]; + bytes[byte_offset + byte_pos++] = image->bitmap[line][px + 1]; + bytes[byte_offset + byte_pos++] = image->bitmap[line][px + 0]; } byte_offset += align_to_four_bytes(byte_pos); } @@ -114,9 +111,18 @@ int image_save(Image* image, char* path) { int image_set_px(Image* image, int x, int y, int r, int g, int b) { if (!image_check_coords(image, x, y)) return 0; - image->bitmap[y][x][0] = (char) r; - image->bitmap[y][x][1] = (char) g; - image->bitmap[y][x][2] = (char) b; + image->bitmap[y][(3 * x) + 0] = (char) r; + image->bitmap[y][(3 * x) + 1] = (char) g; + image->bitmap[y][(3 * x) + 2] = (char) b; + + return 1; +} +int image_set_px_c(Image* image, int x, int y, Color* color) { + if (!image_check_coords(image, x, y)) return 0; + + image->bitmap[y][(3 * x) + 0] = (char) color->r; + image->bitmap[y][(3 * x) + 1] = (char) color->g; + image->bitmap[y][(3 * x) + 2] = (char) color->b; return 1; } @@ -128,9 +134,6 @@ int image_check_coords(Image* image, int x, int y) { int image_destroy(Image* image) { for (int i = 0; i < image->height; i++) { - for (int j = 0; j < image->width; j++) { - free(image->bitmap[i][j]); - } free(image->bitmap[i]); } free(image->bitmap); @@ -138,3 +141,26 @@ int image_destroy(Image* image) { return 1; } + +///////// Colors + +Color* color_new(int r, int g, int b) { + Color* c = malloc(sizeof(Color)); + c->r = r; + c->g = g; + c->b = b; + return c; +} + +int image_draw_rect(Image* image, int x1, int y1, int x2, int y2, Color* color) { + int retval = 1; + int y; + for (; x1 < x2; x1++) { + for (y = y1; y < y2; y++) { + if (!image_set_px_c(image, x1, y, color)) retval = 0; + } + } + + return retval; +} + diff --git a/images/images.h b/images/images.h index 0d82a28..5d5beff 100644 --- a/images/images.h +++ b/images/images.h @@ -1,8 +1,14 @@ #ifndef IMAGES_H #define IMAGES_H +typedef struct _color { + char r; + char g; + char b; +} Color; + typedef struct _image { - char*** bitmap; + char** bitmap; int width; int height; } Image; @@ -12,6 +18,7 @@ int image_new(int width, int height, Image* image); int image_save(Image* image, char* path); int image_set_px(Image* image, int x, int y, int r, int g, int b); +int image_set_px_c(Image* image, int x, int y, Color* color); int image_check_coords(Image* image, int x, int y); @@ -19,6 +26,13 @@ int image_destroy(Image* image); int image_byte_size(Image *image); + +int image_draw_rect(Image* image, int x1, int y1, int x2, int y2, Color* color); + + + +Color* color_new(int r, int g, int b); + #include "images.c" #endif \ No newline at end of file diff --git a/main.c b/main.c index 8dc051a..d0121cc 100644 --- a/main.c +++ b/main.c @@ -5,20 +5,22 @@ int main(int argc, char* argv[]) { Image img; - image_new(255,255, &img); + image_new(512,512, &img); - int r,g,b; + Color* green = color_new(0,255,0); + Color* purple = color_new(125,17,249); + + image_draw_rect(&img, 255, 0, 512, 255, green); + image_draw_rect(&img, 0, 255, 255, 512, purple); for (int i = 0; i < 255; i++) { for (int j = 0; j < 255; j++) { - double factor = (i*i + j*j) / (100*100); - r = i; - g = 255 -j; - b = i -255; - - - image_set_px(&img, i, j, factor * r, factor * g, factor * b); - + image_set_px(&img, i, j, i, 0, 0); + } + } + for (int i = 0; i <= 256; i++) { + for (int j = 0; j <= 256; j++) { + image_set_px(&img, i + 255, j + 255, j, j, 255); } } @@ -30,4 +32,7 @@ int main(int argc, char* argv[]) { printf("Wrote file successfully\n"); } image_destroy(&img); + + free(green); + free(purple); } \ No newline at end of file