cleaned up existing code

master
Anton Lydike 5 years ago
parent fc345d381e
commit f09c8153d6

@ -3,25 +3,21 @@
#include "images.h" #include "images.h"
// write an int to a byte array // write an int to a byte array
void bmp__write_int(char* bytes, int num) { void bmp__write_int(unsigned char* bytes, int num) {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
bytes[i] = num >> (i * 8); bytes[i] = num >> (i * 8);
} }
} }
void bmp__write_byte(char* bytes, int num) { void bmp__write_16bit(unsigned char* bytes, int num) {
bytes[0] = (char) num;
}
void bmp__write_16bit(char* bytes, int num) {
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
bytes[i] = num >> (i * 8); bytes[i] = num >> (i * 8);
} }
} }
int bmp__align_to_four_bytes(int size) { int bmp__align_to_four_bytes(int row_length) {
int os = size % 4; int os =row_length % 4;
return os == 0 ? size : size + (4 - os); return os == 0 ?row_length : row_length + (4 - os);
} }
int bmp__image_byte_size(Image image) { int bmp__image_byte_size(Image image) {
@ -30,9 +26,9 @@ int bmp__image_byte_size(Image image) {
// BITMAPCOREHEADER = 12 bytes // BITMAPCOREHEADER = 12 bytes
int size = 14 + 12; int size = 14 + 12;
// width must be padded to align to 4 bytes // width must be padded to align to 4 bytes
int width_bytes = bmp__align_to_four_bytes(image.width * 3); // 3 bytes per pixel int row_bytes = bmp__align_to_four_bytes(image.width * 3); // 3 bytes per pixel
// add width_bytes * height to total size // add row_bytes * height to total size
size += width_bytes * image.height; size += row_bytes * image.height;
return size; return size;
} }
@ -50,18 +46,26 @@ int bmp__image_byte_size(Image image) {
// 0x01 0x00 number of color planes (must be 1) // 0x01 0x00 number of color planes (must be 1)
// 0x18 0x00 number of bits per pixel (3 * 8 = 24) // 0x18 0x00 number of bits per pixel (3 * 8 = 24)
int image_save_bmp(Image image, char* path) {
// char* bytes;
// bytes + 2 => zeigt auf offset 2 (ist char*)
// bytes[2] => wert an offset 2 (ist char)
int image_save_bmp(Image image, const char* path) {
int size = bmp__image_byte_size(image); int size = bmp__image_byte_size(image);
char* bytes = calloc(sizeof(char), size); unsigned char* bytes = calloc(sizeof(char), size);
// magic bytes, signature "BM" // magic bytes, signature "BM"
bytes[0] = 0x42; // bmp header:
bytes[1] = 0x4d; bytes[0] = 'B';
bytes[1] = 'M';
// write size to header // write size to header
bmp__write_int(bytes + 2, size); bmp__write_int(bytes + 2, size);
// the next 4 byte are zeros // the next 4 byte are zeros
// piyel array offset // pixel array offset
bmp__write_int(bytes + 10, 14 + 12); bmp__write_int(bytes + 10, 14 + 12);
bmp__write_int(bytes + 14, 12); // DIB header:
bmp__write_int(bytes + 14, 12); // header size
bmp__write_16bit(bytes + 18, image.width); // width bmp__write_16bit(bytes + 18, image.width); // width
bmp__write_16bit(bytes + 20, image.height); // height bmp__write_16bit(bytes + 20, image.height); // height
bmp__write_16bit(bytes + 22, 1); // color planes bmp__write_16bit(bytes + 22, 1); // color planes

@ -12,9 +12,9 @@ int image_new(int width, int height, Image* img) {
img->width = width; img->width = width;
// initialize bitmap... // initialize bitmap...
img->bitmap = malloc(height * sizeof(int*)); img->bitmap = malloc(height * sizeof(char*));
for (int i = 0; i < height; i++) { for (int i = 0; i < height; i++) {
img->bitmap[i] = malloc(3 * width * sizeof(int)); img->bitmap[i] = malloc(3 * width * sizeof(char));
} }
//*image = *img; //*image = *img;
@ -24,9 +24,9 @@ int image_new(int width, int height, Image* img) {
int image_set_px(Image image, int x, int y, int r, int g, int b) { 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; if (!image_check_coords(image, x, y)) return 0;
image.bitmap[y][(3 * x) + 0] = (char) r; image.bitmap[y][(3 * x) + 0] = r;
image.bitmap[y][(3 * x) + 1] = (char) g; image.bitmap[y][(3 * x) + 1] = g;
image.bitmap[y][(3 * x) + 2] = (char) b; image.bitmap[y][(3 * x) + 2] = b;
return 1; return 1;
} }
@ -40,12 +40,9 @@ int image_set_px_c(Image image, int x, int y, Color color) {
image.bitmap[y][(3 * x) + 1] = color.g; image.bitmap[y][(3 * x) + 1] = color.g;
image.bitmap[y][(3 * x) + 2] = color.b; image.bitmap[y][(3 * x) + 2] = color.b;
} else { } else {
image.bitmap[y][(3 * x) + 0] = (color.alpha * (color.r)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0]));
//printf("adding %d to %f\n", (color.alpha * color.r), ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0]/* & 0x000000ff */))); image.bitmap[y][(3 * x) + 1] = (color.alpha * (color.g)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 1]));
image.bitmap[y][(3 * x) + 2] = (color.alpha * (color.b)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 2]));
image.bitmap[y][(3 * x) + 0] = (color.alpha * (color.r/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 0]/* & 0x000000ff */));
image.bitmap[y][(3 * x) + 1] = (color.alpha * (color.g/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 1]/* & 0x000000ff */));
image.bitmap[y][(3 * x) + 2] = (color.alpha * (color.b/* & 0x000000ff */)) + ((1.0f - color.alpha) * (image.bitmap[y][(3 * x) + 2]/* & 0x000000ff */));
} }
return 1; return 1;

@ -43,7 +43,7 @@ int image_draw_square(Image image, int x, int y, int s, Color color);
// bmp format specifics: // bmp format specifics:
int image_save_bmp(Image image, char* path); int image_save_bmp(Image image, const char* path);
#include "images.c" #include "images.c"
#include "bmp-format.c" #include "bmp-format.c"

Loading…
Cancel
Save