Partial implementation of read_chunk function
This commit is contained in:
parent
85ee7ee10d
commit
3f73faf04b
74
img_png.c
74
img_png.c
@ -14,16 +14,51 @@ uint32_t char_to_uint32 (unsigned char* input) {
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* img_png_decode(FILE *fp) {
|
int read_chunk(FILE *fp) {
|
||||||
unsigned char buffer[BUFSIZE];
|
struct img_png_chunk cur_chunk;
|
||||||
unsigned char magic[8];
|
|
||||||
enum chunk_state {
|
// Read chunk length
|
||||||
LENGTH,
|
unsigned char len[4];
|
||||||
TYPE,
|
if(fread(len, sizeof(*len), 4, fp) < 4) {
|
||||||
DATA,
|
fprintf(stderr, "Couldn\'t read chunk length.\n");
|
||||||
CRC
|
exit(EXIT_FAILURE);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
cur_chunk.length = char_to_uint32(len);
|
||||||
|
printf("Chunk length: %lu\n", (unsigned long) cur_chunk.length);
|
||||||
|
|
||||||
|
// Read chunk type
|
||||||
|
if(fread(cur_chunk.chunk_type, sizeof(*cur_chunk.chunk_type), 4, fp) < 4) {
|
||||||
|
fprintf(stderr, "Couldn\'t read chunk type.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
printf("Chunk type: %.*s\n", 4, cur_chunk.chunk_type);
|
||||||
|
|
||||||
|
// Read chunk data
|
||||||
|
size_t chunk_size = cur_chunk.length / sizeof(unsigned char);
|
||||||
|
printf("Chunk size: %zu\n", chunk_size);
|
||||||
|
cur_chunk.chunk_data = malloc(chunk_size);
|
||||||
|
|
||||||
|
if(!cur_chunk.chunk_data) {
|
||||||
|
perror("Failed to allocate chunk data!");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fread(cur_chunk.chunk_data, 1, cur_chunk.length, fp) != cur_chunk.length) {
|
||||||
|
if(feof(fp)) {
|
||||||
|
fprintf(stderr, "File ended prematurely.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "Failed to read chunk data!\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return feof(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* img_png_decode(FILE *fp) {
|
||||||
|
unsigned char magic[8];
|
||||||
|
|
||||||
// Check PNG Magic
|
// Check PNG Magic
|
||||||
if(fread(magic, sizeof(*magic), 8, fp) < 8) {
|
if(fread(magic, sizeof(*magic), 8, fp) < 8) {
|
||||||
fprintf(stderr, "Couldn\'t read PNG magic.");
|
fprintf(stderr, "Couldn\'t read PNG magic.");
|
||||||
@ -38,24 +73,12 @@ uint8_t* img_png_decode(FILE *fp) {
|
|||||||
printf("PNG Magic: %#04x%02x%02x%02x%02x%02x%02x%02x\n", magic[0], magic[1], magic[2],
|
printf("PNG Magic: %#04x%02x%02x%02x%02x%02x%02x%02x\n", magic[0], magic[1], magic[2],
|
||||||
magic[3], magic[4], magic[5], magic[6], magic[7]);
|
magic[3], magic[4], magic[5], magic[6], magic[7]);
|
||||||
|
|
||||||
// After the magic number is read, we should hit the length of the chunk first.
|
|
||||||
enum chunk_state state = LENGTH;
|
|
||||||
struct img_png_chunk cur_chunk;
|
struct img_png_chunk cur_chunk;
|
||||||
while(fread(buffer, sizeof(*buffer), BUFSIZE, fp) > 0){
|
|
||||||
// Refine later!!!
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case LENGTH: {
|
|
||||||
unsigned char length[4];
|
|
||||||
for (size_t i = 0; i < 4; i++) {
|
|
||||||
length[i] = buffer[i];
|
|
||||||
}
|
|
||||||
cur_chunk.length = char_to_uint32(length);
|
|
||||||
printf("Chunk length: %lu\n", (unsigned long)cur_chunk.length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Read chunk
|
||||||
|
|
||||||
|
while (read_chunk(fp) == 0);
|
||||||
|
|
||||||
if(!feof(fp)) {
|
if(!feof(fp)) {
|
||||||
perror("fread() failed!");
|
perror("fread() failed!");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@ -64,4 +87,3 @@ uint8_t* img_png_decode(FILE *fp) {
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user