2018-10-07 00:34:59 -04:00
|
|
|
#include "bmp.h"
|
2018-10-09 01:42:28 -04:00
|
|
|
#include "kmalloc.h"
|
|
|
|
|
|
2018-10-07 00:34:59 -04:00
|
|
|
#include <stdio.h>
|
2018-10-07 04:21:21 -04:00
|
|
|
#include <errno.h>
|
2018-10-07 00:34:59 -04:00
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
uint8_t *bmp_read_image(const char *filename, bmp_info_header_t *bmp_info_header) {
|
|
|
|
|
FILE *bmp_file;
|
|
|
|
|
bmp_file_header_t header;
|
|
|
|
|
uint8_t *img_data;
|
2018-10-07 00:34:59 -04:00
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
bmp_file = fopen(filename, "r");
|
|
|
|
|
if (ferror(bmp_file))
|
2018-10-07 00:34:59 -04:00
|
|
|
return NULL;
|
|
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
fread(&header, sizeof(bmp_file_header_t), 1, bmp_file);
|
|
|
|
|
if (ferror(bmp_file) || header.type != 0x4D42) {
|
|
|
|
|
fclose(bmp_file);
|
2018-10-07 00:34:59 -04:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
fread(bmp_info_header, sizeof(bmp_info_header_t), 1, bmp_file);
|
|
|
|
|
fseek(bmp_file, header.img_data_offset, SEEK_SET);
|
2018-10-07 00:34:59 -04:00
|
|
|
|
2018-10-09 01:42:28 -04:00
|
|
|
img_data = kmalloc(bmp_info_header->img_data_size);
|
2018-10-07 04:21:21 -04:00
|
|
|
if (img_data == NULL) {
|
|
|
|
|
errno = ENOMEM;
|
2018-10-09 01:42:28 -04:00
|
|
|
kfree(img_data);
|
2018-10-07 04:21:21 -04:00
|
|
|
fclose(bmp_file);
|
2018-10-07 00:34:59 -04:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
fread(img_data, bmp_info_header->img_data_size, 1, bmp_file);
|
|
|
|
|
if (ferror(bmp_file)) {
|
|
|
|
|
fclose(bmp_file);
|
2018-10-07 00:34:59 -04:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-07 04:21:21 -04:00
|
|
|
fclose(bmp_file);
|
|
|
|
|
return img_data;
|
2018-10-07 00:34:59 -04:00
|
|
|
}
|