#ifndef __SIMPLE_PNG_IMPL #define __SIMPLE_PNG_IMPL #define __SIMPLE_PNG_DIRECT_INCLUDE //this line should be uncommented if this file is included directly #ifdef __SIMPLE_PNG_DIRECT_INCLUDE #define __SIMPLE_PNG_REQUIRE_STATIC static #else #include "simplePNG.h" #define __SIMPLE_PNG_REQUIRE_STATIC #endif #include #include #include #include #define __SIMPLE_PNG_HEADER_SIZE 8 #define __SIMPLE_PNG_CHUNK_NAME_SIZE 4 #define __SIMPLE_PNG_IHDR_SIZE (sizeof(uint32_t)*2+sizeof(uint8_t)*5) #define __SIMPLE_PNG_IEND_SIZE 0 #define __SIMPLE_PNG_DEFLATE_BLOCK_SIZE 0xffff #define __SIMPLE_PNG_NUM_CHANNELS 3 /*************** Endian functions ***************/ __SIMPLE_PNG_REQUIRE_STATIC uint8_t __simplePNG_is_little_endian() { uint16_t val = 1; uint8_t * p = (uint8_t*)&val; return p[0]; } __SIMPLE_PNG_REQUIRE_STATIC void __simplePNG_swap(void *data, size_t size) { uint8_t *data_c = (uint8_t *) data; uint8_t temp; for(size_t i=0; i> 1) ^ poly; else new_crc = new_crc >> 1; } return new_crc; } __SIMPLE_PNG_REQUIRE_STATIC uint32_t __simplePNG_get_crc(uint32_t initial_crc, uint8_t const * data, size_t size) { uint32_t new_crc = initial_crc; for(size_t i=0; i 0) num_deflate_blocks++; return num_deflate_blocks; } __SIMPLE_PNG_REQUIRE_STATIC size_t __simplePNG__store_deflate_blocks(uint8_t* dst, const uint8_t* src, size_t size) { size_t dst_offset = 0; size_t img_offset = 0; size_t num_deflate_blocks = __simplePNG__deflate_block_count(size); size_t def_final_block_size = __simplePNG__final_deflate_block_size(size); uint16_t* u16_ptr; for(size_t i=0; i