2022-01-31 10:30:26 +00:00
|
|
|
// quick and dirty bitmap loader...for 24 bit bitmaps with 1 plane only.
|
|
|
|
// See http://www.dcs.ed.ac.uk/~mxr/gfx/2d/BMP.txt for more info.
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "loadbmp.h"
|
|
|
|
|
|
|
|
int ImageLoad(char *filename, Image *image) {
|
|
|
|
FILE *file;
|
|
|
|
size_t size; // size of the image in bytes.
|
|
|
|
size_t i; // standard counter.
|
|
|
|
int32_t sizeX, sizeY; // width/height of the image - must be 4 bytes to match the file format
|
|
|
|
int16_t planes; // number of planes in image (must be 1)
|
|
|
|
int16_t bpp; // number of bits per pixel (must be 24)
|
|
|
|
char temp; // temporary color storage for bgr-rgb conversion.
|
|
|
|
|
|
|
|
// make sure the file is there.
|
|
|
|
if ((file = fopen(filename, "rb"))==NULL) {
|
|
|
|
printf("File Not Found : %s\n",filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// seek through the bmp header, up to the width/height:
|
2023-04-26 19:50:43 +00:00
|
|
|
fseek(file, 10, SEEK_CUR);
|
|
|
|
|
|
|
|
uint32_t offset;
|
|
|
|
fread(&offset, 4, 1, file);
|
|
|
|
fseek(file, 4, SEEK_CUR);
|
2022-01-31 10:30:26 +00:00
|
|
|
|
|
|
|
// read the width
|
|
|
|
if ((i = fread(&sizeX, 4, 1, file)) != 1) {
|
|
|
|
printf("Error reading width from %s.\n", filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
image->sizeX = sizeX;
|
|
|
|
printf("Width of %s: %d\n", filename, sizeX);
|
|
|
|
|
|
|
|
// read the height
|
|
|
|
if ((i = fread(&sizeY, 4, 1, file)) != 1) {
|
|
|
|
printf("Error reading height from %s.\n", filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
image->sizeY = sizeY;
|
|
|
|
printf("Height of %s: %d\n", filename, sizeY);
|
|
|
|
|
|
|
|
// calculate the size (assuming 24 bits or 3 bytes per pixel).
|
|
|
|
size = image->sizeX * image->sizeY * 3;
|
|
|
|
|
|
|
|
// read the planes
|
|
|
|
if ((fread(&planes, 2, 1, file)) != 1) {
|
|
|
|
printf("Error reading planes from %s.\n", filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (planes != 1) {
|
|
|
|
printf("Planes from %s is not 1: %u\n", filename, planes);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// read the bpp
|
|
|
|
if ((i = fread(&bpp, 2, 1, file)) != 1) {
|
|
|
|
printf("Error reading bpp from %s.\n", filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (bpp != 24) {
|
|
|
|
printf("Bpp from %s is not 24: %u\n", filename, bpp);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// seek past the rest of the bitmap header.
|
2023-04-26 19:50:43 +00:00
|
|
|
fseek(file, offset, SEEK_SET);
|
2022-01-31 10:30:26 +00:00
|
|
|
|
|
|
|
// read the data.
|
|
|
|
image->data = (char *) malloc(size);
|
|
|
|
if (image->data == NULL) {
|
|
|
|
printf("Error allocating memory for color-corrected image data");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((i = fread(image->data, size, 1, file)) != 1) {
|
|
|
|
printf("Error reading image data from %s.\n", filename);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i=0;i<size;i+=3) { // reverse all of the colors. (bgr -> rgb)
|
|
|
|
temp = image->data[i];
|
|
|
|
image->data[i] = image->data[i+2];
|
|
|
|
image->data[i+2] = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
// we're done.
|
|
|
|
return 1;
|
|
|
|
}
|