int gfwx_PngWriteFile(const char* filename, uint8_t* data, uint32_t width, uint32_t height, uint32_t bytesPerPixel) { int status = -1; int png_status; int row_stride; png_image image; memset(&image, 0, sizeof(png_image)); image.version = PNG_IMAGE_VERSION; image.format = (bytesPerPixel == 4) ? PNG_FORMAT_BGRA : PNG_FORMAT_BGR; image.width = width; image.height = height; row_stride = PNG_IMAGE_ROW_STRIDE(image); png_status = png_image_write_to_file(&image, filename, 0, (const void*) data, row_stride, NULL); if (!png_status) goto exit; status = 1; exit: png_image_free(&image); return status; }
int gfwx_PngReadFile(const char* filename, uint8_t** pData, uint32_t* pWidth, uint32_t* pHeight, uint32_t bytesPerPixel) { int status = -1; int png_status; png_image image; int row_stride; uint8_t* buffer = NULL; memset(&image, 0, sizeof(png_image)); image.version = PNG_IMAGE_VERSION; png_status = png_image_begin_read_from_file(&image, filename); if (!png_status) goto exit; image.format = (bytesPerPixel == 4) ? PNG_FORMAT_BGRA : PNG_FORMAT_BGR; row_stride = PNG_IMAGE_ROW_STRIDE(image); buffer = malloc(PNG_IMAGE_SIZE(image)); if (!buffer) goto exit; png_status = png_image_finish_read(&image, NULL, buffer, row_stride, NULL); if (!png_status) goto exit; *pWidth = image.width; *pHeight = image.height; *pData = buffer; status = 1; exit: if (status < 1) free(buffer); png_image_free(&image); return status; }
static int read_png(const char *fname, image *image, gradient *g) { int result = 0; memset(&image->image, 0, sizeof image->image); image->image.version = PNG_IMAGE_VERSION; if (png_image_begin_read_from_file(&image->image, image->file_name)) { image->image.format = PNG_FORMAT_RGBA; image->stride = PNG_IMAGE_ROW_STRIDE(image->image); image->buffer = malloc(PNG_IMAGE_SIZE(image->image)); image->pixel_bytes = PNG_IMAGE_PIXEL_SIZE(image->image.format); if (image->buffer != NULL) { if(png_image_finish_read(&image->image, NULL /*background*/, image->buffer, (png_int_32)image->stride, image->colormap)) { if(calculate_gradient(image, g)) result = 1; else printf("pngtocss: Gradient type not supported\n"); } else { fprintf(stderr, "pngtocss: read %s: %s\n", fname, image->image.message); png_image_free(&image->image); } } else fprintf(stderr, "pngtocss: out of memory: %lu bytes\n", (unsigned long)PNG_IMAGE_SIZE(image->image)); } else /* Failed to read the argument: */ fprintf(stderr, "pngtocss: %s: %s\n", fname, image->image.message); return result; }