#include
#include
#include
#include
#include
#include
#include
#include "png.h"
/*****************************************************************************
*
* Macro definition
*
*****************************************************************************/
/*****************************************************************************
*
* Structure/Class Definition
*
*****************************************************************************/
//
typedef struct Png2FbData {
int width;
int height;
uint32_t *buf;
} Png2FbData;
/*****************************************************************************
*
* Data definition
*
*****************************************************************************/
/*****************************************************************************
*
* Function Entity
*
*****************************************************************************/
int GetPngData(const char *file_name, Png2FbData *png_data) {
int i;
int j;
int w;
int h;
FILE *file
file = fopen(file_name, "rb");
if (file == NULL) {
printf(" %s open failed\r\n", file_name);
return -1;
}
printf("%s open OK\r\n", file_name);
//
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_read_struct(&png_ptr, 0, 0);
fclose(file);
return -1;
}
//
png_init_io(png_ptr, file);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
int m_width = png_get_image_width(png_ptr, info_ptr);
int m_height = png_get_image_height(png_ptr, info_ptr);
png_bytep *row_pointers = png_get_rows(png_ptr, info_ptr);
//
png_data->buf = (uint32_t *)malloc(m_height * m_width * sizeof(uint32_t));
if (NULL == png_data->buf) {
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(file);
printf("malloc err\r\n");
return -1;
}
//
for (i = 0; i < m_height; i++) {
for (j = 0, h = 0; j < (4 * m_width); j += 4) {
// row_pointers[i][j + 2]; // blue
// row_pointers[i][j + 1]; // green
// row_pointers[i][j]; // red
// row_pointers[i][j + 3]; // alpha
png_data->buf[i * m_width + h] = (row_pointers[i][j + 3] << 24) | (row_pointers[i][j] << 16) |
(row_pointers[i][j + 1] << 8) | (row_pointers[i][j + 2]);
h ++;
}
}
png_data->height = m_height;
png_data->width = m_width;
//
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(file);
printf("%s load finish, width = %d, height = %d\n", file_name, png_data->width, png_data->height);
return 0;
}