#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <png.h>
//extern "C" int MODEXCHG_mp_M;
//extern "C" png_byte MODEXCHG_mp_IN[768*484];
extern "C" {
extern void f2png8_(char *path,png_byte IN[768*484]) {
int i;
png_info *info_ptr;
png_struct *png_ptr;
png_byte *row_pointers[484];
printf("%s\n",path);
FILE *fp = fopen(path, "wb");
for (i=0;i<484;i++){
row_pointers[i]=&(IN[i*768]);
}
png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fprintf(stderr, "cannot allocate LIBPNG structure");
exit(1);
}
info_ptr = png_create_info_struct (png_ptr);
if (info_ptr == NULL) {
png_destroy_write_struct (&png_ptr, (png_infopp)NULL);
fprintf(stderr, "cannot allocate LIBPNG structures");
exit(2);
}
png_init_io (png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr, 768, 484,
8, 0, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, 0);
png_write_info(png_ptr, info_ptr);
png_set_packing (png_ptr);
printf("%s\n",path);
png_write_image(png_ptr,row_pointers);
png_write_end(png_ptr, NULL);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
}
}
//*******************************************************************************
extern "C" {
int from_png8_(char *path,png_byte IN[768*484]) {
int i; //, j;
// char sig_buf [SIG_CHECK_SIZE];
png_info *info_ptr;
png_struct *png_ptr;
// png_byte **bitmap;
// png_uint_32 *w,*h;
png_uint_32 width, height;
int bit_depth, color_type, interlace_type,rowbytes;
unsigned char **row_pointers;
printf("reading png %s\n",path);
FILE *fp;
if ((fp = fopen(path, "rb")) == NULL) {
printf("Can't open file %s\n",path);
return 0;
}
png_ptr = png_create_read_struct
(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr == NULL) {
printf("Error creating read_struct\n");
fclose(fp);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fclose(fp);
png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
return 0;
}
if (setjmp(png_ptr->jmpbuf)) {
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fp);
printf("Error reading file\n");
return 0;
}
png_init_io(png_ptr, fp);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
&interlace_type, NULL, NULL);
rowbytes=png_get_rowbytes(png_ptr, info_ptr);
row_pointers = (unsigned char**)malloc(height * sizeof(unsigned char*));
for(i=0;i<(int)height;i++) {
row_pointers[i] = &IN[rowbytes*i];
}
png_read_image(png_ptr, row_pointers);
png_read_end(png_ptr, NULL);
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
fclose(fp);
free(row_pointers);
return 0;
}
}