Skip to content

Commit

Permalink
As with the writes, make icv_read handle file setup for the various f…
Browse files Browse the repository at this point in the history
…ormats.
  • Loading branch information
starseeker committed Sep 24, 2024
1 parent bf58a27 commit b1ace6b
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 133 deletions.
26 changes: 8 additions & 18 deletions src/libicv/bw.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,27 +57,21 @@ bw_write(icv_image_t *bif, FILE *fp)
}

icv_image_t *
bw_read(const char *filename, size_t width, size_t height)
bw_read(FILE *fp, size_t width, size_t height)
{
FILE *fp;
unsigned char *data = NULL;
icv_image_t *bif;
size_t size, ret;
size_t buffsize = 1024;

if (filename==NULL) {
fp = stdin;
setmode(fileno(fp), O_BINARY);
} else if ((fp = fopen(filename, "rb")) == NULL) {
bu_log("bw_read: Cannot open %s for reading\n", filename);
if (UNLIKELY(!fp))
return NULL;
}

unsigned char *data = NULL;
size_t size;

icv_image_t *bif;
BU_ALLOC(bif, struct icv_image);
ICV_IMAGE_INIT(bif);

/* buffer pixel wise */
if (width == 0 || height == 0) {
size_t buffsize = 1024;
size = 0;
data = (unsigned char *)bu_malloc(buffsize, "bw_read : unsigned char data");

Expand All @@ -102,12 +96,11 @@ bw_read(const char *filename, size_t width, size_t height)
size = height*width;
data = (unsigned char *)bu_malloc(size, "bw_read : unsigned char data");

ret = fread(data, 1, size, fp);
size_t ret = fread(data, 1, size, fp);
if (ret!=0 && ferror(fp)) {
bu_log("bw_read: Error Occurred while Reading\n");
bu_free(data, "icv_image data");
bu_free(bif, "icv_structure");
fclose(fp);
return NULL;
}

Expand All @@ -121,7 +114,6 @@ bw_read(const char *filename, size_t width, size_t height)
/* zero sized image */
bu_free(bif, "icv container");
bu_free(data, "unsigned char data");
fclose(fp);
return NULL;
}

Expand All @@ -132,8 +124,6 @@ bw_read(const char *filename, size_t width, size_t height)
bif->color_space = ICV_COLOR_SPACE_GRAY;
bif->gamma_corr = 0.0;

fclose(fp);

return bif;
}

Expand Down
23 changes: 7 additions & 16 deletions src/libicv/dpix.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,12 @@ icv_normalize(icv_image_t *bif)


icv_image_t *
dpix_read(const char *filename, size_t width, size_t height)
dpix_read(FILE *fp, size_t width, size_t height)
{
if (UNLIKELY(!fp))
return NULL;

icv_image_t *bif;
int fd = -1;
size_t size;
ssize_t ret;

Expand All @@ -97,35 +99,24 @@ dpix_read(const char *filename, size_t width, size_t height)
width = 512;
}

if (filename == NULL) {
fd = fileno(stdin);
setmode(fd, O_BINARY);
} else if ((fd = open(filename, O_RDONLY|O_BINARY, WRMODE)) < 0) {
bu_log("dpix_read : Cannot open file %s for reading\n, ", filename);
return NULL;
}

bif = icv_create(width, height, ICV_COLOR_SPACE_RGB);

/* Size in Bytes for reading. */
size = width*height*3*sizeof(bif->data[0]);

/* read dpix data */
/* read dpix data
* TODO - why are we using the lower level read API here? */
int fd = fileno(fp);
ret = read(fd, bif->data, size);

if (ret != (ssize_t)size) {
bu_log("dpix_read : Error while reading\n");
icv_destroy(bif);
if (filename)
close(fd);
return NULL;
}

icv_normalize(bif);

if (filename)
close(fd);

return bif;
}

Expand Down
32 changes: 26 additions & 6 deletions src/libicv/fileformat.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,23 +86,43 @@ icv_read(const char *filename, bu_mime_image_t format, size_t width, size_t heig
if (format == BU_MIME_IMAGE_AUTO)
format = icv_guess_file_format(filename, NULL);

FILE *fp = (!filename) ? stdin : fopen(filename, "rb");
if (!fp) {
bu_log("ERROR: Cannot open file %s for reading\n", filename);
return NULL;
}
if (!filename)
setmode(fileno(fp), O_BINARY);

icv_image_t *oimg = NULL;
switch (format) {
case BU_MIME_IMAGE_PNG:
return png_read(filename);
oimg = png_read(fp);
break;
case BU_MIME_IMAGE_PIX:
return pix_read(filename, width, height);
oimg = pix_read(fp, width, height);
break;
case BU_MIME_IMAGE_BW :
return bw_read(filename, width, height);
oimg = bw_read(fp, width, height);
break;
case BU_MIME_IMAGE_DPIX :
return dpix_read(filename, width, height);
oimg = dpix_read(fp, width, height);
break;
case BU_MIME_IMAGE_PPM :
return ppm_read(filename);
oimg = ppm_read(fp);
break;
case BU_MIME_IMAGE_RLE :
return rle_read(filename);
oimg = rle_read(fp);
break;
default:
bu_log("icv_read not implemented for this format\n");
fclose(fp);
return NULL;
}

fflush(fp);
fclose(fp);
return oimg;
}


Expand Down
12 changes: 6 additions & 6 deletions src/libicv/icv_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,27 @@
#define ICV_PRIVATE_H

/* defined in bw.c */
extern icv_image_t *bw_read(const char *filename, size_t width, size_t height);
extern icv_image_t *bw_read(FILE *fp, size_t width, size_t height);
extern int bw_write(icv_image_t *bif, FILE *fp);

/* defined in pix.c */
extern icv_image_t *pix_read(const char* filename, size_t width, size_t height);
extern icv_image_t *pix_read(FILE *fp, size_t width, size_t height);
extern int pix_write(icv_image_t *bif, FILE *fp);

/* defined in dpix.c */
extern icv_image_t *dpix_read(const char* filename, size_t width, size_t height);
extern icv_image_t *dpix_read(FILE *fp, size_t width, size_t height);
extern int dpix_write(icv_image_t *bif, FILE *fp);

/* defined in png.c */
extern icv_image_t* png_read(const char *filename);
extern icv_image_t* png_read(FILE *fp);
extern int png_write(icv_image_t *bif, FILE *fp);

/* defined in ppm.c */
extern icv_image_t* ppm_read(const char *filename);
extern icv_image_t* ppm_read(FILE *fp);
extern int ppm_write(icv_image_t *bif, FILE *fp);

/* defined in rle.c */
extern icv_image_t* rle_read(const char *filename);
extern icv_image_t* rle_read(FILE *fp);
extern int rle_write(icv_image_t *bif, FILE *fp);

#endif /* ICV_PRIVATE_H */
Expand Down
26 changes: 9 additions & 17 deletions src/libicv/pix.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,16 @@ pix_write(icv_image_t *bif, FILE *fp)


icv_image_t *
pix_read(const char* filename, size_t width, size_t height)
pix_read(FILE *fp, size_t width, size_t height)
{
FILE* fp;
if (UNLIKELY(!fp))
return NULL;

unsigned char *data = 0;
icv_image_t *bif;
size_t size,ret;
size_t size;
size_t buffsize=1024*3;

if (filename == NULL) {
fp = stdin;
setmode(fileno(fp), O_BINARY);
} else if ((fp = fopen(filename, "rb")) == NULL) {
bu_log("pix_read: Cannot open file for reading\n");
return NULL;
}
icv_image_t *bif;
BU_ALLOC(bif, struct icv_image);
ICV_IMAGE_INIT(bif);
/* buffer pixel wise */
Expand All @@ -98,32 +93,29 @@ pix_read(const char* filename, size_t width, size_t height)
} else { /* buffer frame wise */
size = (size_t) height*width*3;
data = (unsigned char *)bu_malloc(size, "pix_read : unsigned char data");
ret = fread(data, 1, size, fp);
size_t ret = fread(data, 1, size, fp);
if (ret!=0 && ferror(fp)) {
bu_log("pix_read: Error Occurred while Reading\n");
bu_free(data, "icv_image data");
bu_free(bif, "icv_structure");
fclose(fp);
return NULL;
}
bif->height = height;
bif->width = width;
}
if (size)
if (size) {
bif->data = icv_uchar2double(data, size);
else {
} else {
/* zero sized image */
bu_free(bif, "icv container");
bu_free(data, "unsigned char data");
fclose(fp);
return NULL;
}
bif->data = icv_uchar2double(data, size);
bu_free(data, "pix_read : unsigned char data");
bif->magic = ICV_IMAGE_MAGIC;
bif->channels = 3;
bif->color_space = ICV_COLOR_SPACE_RGB;
fclose(fp);
return bif;
}

Expand Down
48 changes: 14 additions & 34 deletions src/libicv/png.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,79 +80,61 @@ png_write(icv_image_t *bif, FILE *fp)
}

icv_image_t *
png_read(const char* filename)
png_read(FILE *fp)
{
size_t i;
FILE *fp = NULL;
png_structp png_p;
png_infop info_p;
char header[8];
int bit_depth;
int color_type;
png_color_16p input_backgrd;
double gammaval;
unsigned char *image;
unsigned char **rows;
png_color_16 def_backgrd={ 0, 0, 0, 0, 0 };
icv_image_t *bif;

if (filename == NULL) {
fp = stdin;
setmode(fileno(fp), O_BINARY);
} else if ((fp = fopen(filename, "rb")) == NULL) {
bu_log("ERROR: Cannot open file for reading\n");
if (UNLIKELY(!fp))
return NULL;
}

char header[8];
if (fread(header, 8, 1, fp) != 1) {
bu_log("png-pix: ERROR: Failed while reading file header!!!\n");
fclose(fp);
return NULL;
}

if (png_sig_cmp((png_bytep)header, 0, 8)) {
bu_log("png-pix: This is not a PNG file!!!\n");
fclose(fp);
return NULL;
}

png_p = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_structp png_p = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!png_p) {
bu_log("png-pix: png_create_read_struct() failed!!\n");
fclose(fp);
return NULL;
}

info_p = png_create_info_struct(png_p);
png_infop info_p = png_create_info_struct(png_p);
if (!info_p) {
bu_log("png-pix: png_create_info_struct() failed!!\n");
fclose(fp);
return NULL;
}

icv_image_t *bif;
BU_ALLOC(bif, struct icv_image);
ICV_IMAGE_INIT(bif);

png_init_io(png_p, fp);
png_set_sig_bytes(png_p, 8);
png_read_info(png_p, info_p);
color_type = png_get_color_type(png_p, info_p);
int color_type = png_get_color_type(png_p, info_p);
if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(png_p);
}
png_set_expand(png_p);
bit_depth = png_get_bit_depth(png_p, info_p);
int bit_depth = png_get_bit_depth(png_p, info_p);
if (bit_depth == 16) png_set_strip_16(png_p);

bif->width = png_get_image_width(png_p, info_p);
bif->height = png_get_image_height(png_p, info_p);

png_color_16p input_backgrd;
if (png_get_bKGD(png_p, info_p, &input_backgrd)) {
png_set_background(png_p, input_backgrd, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
} else {
png_color_16 def_backgrd={ 0, 0, 0, 0, 0 };
png_set_background(png_p, &def_backgrd, PNG_BACKGROUND_GAMMA_FILE, 0, 1.0);
}

double gammaval;
if (png_get_gAMA(png_p, info_p, &gammaval)) {
png_set_gAMA(png_p, info_p, gammaval);
}
Expand All @@ -161,11 +143,11 @@ png_read(const char* filename)


/* allocate memory for image */
image = (unsigned char *)bu_calloc(1, bif->width*bif->height*3, "image");
unsigned char *image = (unsigned char *)bu_calloc(1, bif->width*bif->height*3, "image");

/* create rows array */
rows = (unsigned char **)bu_calloc(bif->height, sizeof(unsigned char *), "rows");
for (i = 0; i < bif->height; i++)
unsigned char **rows = (unsigned char **)bu_calloc(bif->height, sizeof(unsigned char *), "rows");
for (size_t i = 0; i < bif->height; i++)
rows[bif->height - 1 - i] = image+(i * bif->width * 3);

png_read_image(png_p, rows);
Expand All @@ -177,8 +159,6 @@ png_read(const char* filename)
bif->channels = 3;
bif->color_space = ICV_COLOR_SPACE_RGB;

fclose(fp);

return bif;
}

Expand Down
Loading

0 comments on commit b1ace6b

Please sign in to comment.