Newest toolchain is bitchier, so I wanted to go ahead and clear up all of the warnings from building GLdc and the various examples... 1) Set CMake CXX standard to 14 instead of 11, since CXXFLAGS were enforcing that language standard anyway. 2) Fixed a bunch of strict aliasing violations in immediate.c: glVertex3f. 3) Removed or commented out lots of unused variables. 4) Fixed some "suggested inner braces on initializer" crap. 5) Fixed a bunch of signed vs unsigned pointer assignments. 6) Fixed several printf() warnings from using %d with int32_t (needs to be %ld for long int). 7) Fixed build issue with Nehe20 from not including kos.h for the KOS_ROMDISK macro. 8) Fixed some signed vs unsigned comparison mismatches in C++ template instantiations within clipping tests. 9)
95 lines
2.8 KiB
C
95 lines
2.8 KiB
C
// 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:
|
|
fseek(file, 10, SEEK_CUR);
|
|
|
|
uint32_t offset;
|
|
fread(&offset, 4, 1, file);
|
|
fseek(file, 4, SEEK_CUR);
|
|
|
|
// 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: %ld\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: %ld\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.
|
|
fseek(file, offset, SEEK_SET);
|
|
|
|
// 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;
|
|
}
|