60 #include <config_auto.h> 64 #include "allheaders.h" 67 static const l_int32 MaxAllowedWidth = 1000000;
68 static const l_int32 MaxAllowedHeight = 1000000;
69 static const l_int64 MaxAllowedArea = 400000000LL;
72 #define DEBUG_SERIALIZE 0 98 PROCNAME(
"pixReadStreamSpix");
101 return (
PIX *)ERROR_PTR(
"stream not defined", procName, NULL);
104 return (
PIX *)ERROR_PTR(
"data not read", procName, NULL);
108 return (
PIX *)ERROR_PTR(
"pix not made", procName, NULL);
140 PROCNAME(
"readHeaderSpix");
143 return ERROR_INT(
"filename not defined", procName, 1);
144 if (!pwidth || !pheight || !pbps || !pspp)
145 return ERROR_INT(
"input ptr(s) not defined", procName, 1);
147 return ERROR_INT(
"image file not found", procName, 1);
181 PROCNAME(
"freadHeaderSpix");
184 return ERROR_INT(
"stream not defined", procName, 1);
185 if (!pwidth || !pheight || !pbps || !pspp)
186 return ERROR_INT(
"input ptr(s) not defined", procName, 1);
190 return ERROR_INT(
"file too small to be spix", procName, 1);
191 if (fread(data, 4, 6, fp) != 6)
192 return ERROR_INT(
"error reading data", procName, 1);
193 ret =
sreadHeaderSpix(data, nbytes, pwidth, pheight, pbps, pspp, piscmap);
227 PROCNAME(
"sreadHeaderSpix");
230 return ERROR_INT(
"data not defined", procName, 1);
231 if (!pwidth || !pheight || !pbps || !pspp)
232 return ERROR_INT(
"input ptr(s) not defined", procName, 1);
233 *pwidth = *pheight = *pbps = *pspp = 0;
237 return ERROR_INT(
"size too small", procName, 1);
241 if (
id[0] !=
's' ||
id[1] !=
'p' ||
id[2] !=
'i' ||
id[3] !=
'x')
242 return ERROR_INT(
"not a valid spix file", procName, 1);
256 *piscmap = (ncolors == 0) ? 0 : 1;
279 PROCNAME(
"pixWriteStreamSpix");
282 return ERROR_INT(
"stream not defined", procName, 1);
284 return ERROR_INT(
"pix not defined", procName, 1);
287 return ERROR_INT(
"failure to write pix to memory", procName, 1);
288 fwrite(data, 1, size, fp);
359 l_int32 w, h, d, wpl, rdatasize, ncolors, nbytes, index, valid;
365 PROCNAME(
"pixSerializeToMemory");
367 if (!pdata || !pnbytes)
368 return ERROR_INT(
"&data and &nbytes not both defined", procName, 1);
372 return ERROR_INT(
"pixs not defined", procName, 1);
375 wpl = pixGetWpl(pixs);
377 rdatasize = 4 * wpl * h;
380 if ((cmap = pixGetColormap(pixs)) != NULL) {
383 return ERROR_INT(
"colormap not valid", procName, 1);
387 nbytes = 24 + 4 * ncolors + 4 + rdatasize;
388 if ((data = (l_uint32 *)LEPT_CALLOC(nbytes / 4,
sizeof(l_uint32)))
391 return ERROR_INT(
"data not made", procName, 1);
406 memcpy(data + 6, cdata, 4 * ncolors);
408 data[index] = rdatasize;
409 memcpy(data + index + 1, rdata, rdatasize);
413 "raster size = %d, ncolors in cmap = %d, total bytes = %d\n",
414 rdatasize, ncolors, nbytes);
440 l_int32 w, h, d, pixdata_size, memdata_size, imdata_size, ncolors, valid;
445 PROCNAME(
"pixDeserializeFromMemory");
448 return (
PIX *)ERROR_PTR(
"data not defined", procName, NULL);
449 if (nbytes < 28 || nbytes > ((1LL << 31) - 1)) {
450 L_ERROR(
"invalid nbytes = %zu\n", procName, nbytes);
455 if (
id[0] !=
's' ||
id[1] !=
'p' ||
id[2] !=
'i' ||
id[3] !=
'x')
456 return (
PIX *)ERROR_PTR(
"invalid id string", procName, NULL);
463 if (w < 1 || w > MaxAllowedWidth)
464 return (
PIX *)ERROR_PTR(
"invalid width", procName, NULL);
465 if (h < 1 || h > MaxAllowedHeight)
466 return (
PIX *)ERROR_PTR(
"invalid height", procName, NULL);
467 if (1LL * w * h > MaxAllowedArea)
468 return (
PIX *)ERROR_PTR(
"area too large", procName, NULL);
469 if (ncolors < 0 || ncolors > 256 || ncolors + 7 >= nbytes/
sizeof(l_int32))
470 return (
PIX *)ERROR_PTR(
"invalid ncolors", procName, NULL);
472 return (
PIX *)ERROR_PTR(
"failed to make header", procName, NULL);
473 pixdata_size = 4 * h * pixGetWpl(pix1);
474 memdata_size = nbytes - 24 - 4 * ncolors - 4;
475 imdata_size = data[6 + ncolors];
477 if (pixdata_size != memdata_size || pixdata_size != imdata_size) {
478 L_ERROR(
"pixdata_size = %d, memdata_size = %d, imdata_size = %d " 479 "not all equal!\n", procName, pixdata_size, memdata_size,
485 return (
PIX *)ERROR_PTR(
"pix not made", procName, NULL);
490 return (
PIX *)ERROR_PTR(
"cmap not made", procName, NULL);
494 return (
PIX *)ERROR_PTR(
"cmap is not valid", procName, NULL);
500 memcpy(imdata, data + 7 + ncolors, imdata_size);
507 return (
PIX *)ERROR_PTR(
"cmap is invalid with pix", procName, NULL);
513 "raster size = %d, ncolors in cmap = %d, total bytes = %zu\n",
514 imdata_size, ncolors, nbytes);
PIX * pixReadMemSpix(const l_uint8 *data, size_t size)
pixReadMemSpix()
void lept_stderr(const char *fmt,...)
lept_stderr()
l_ok pixcmapSerializeToMemory(PIXCMAP *cmap, l_int32 cpc, l_int32 *pncolors, l_uint8 **pdata)
pixcmapSerializeToMemory()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
PIX * pixDeserializeFromMemory(const l_uint32 *data, size_t nbytes)
pixDeserializeFromMemory()
l_ok freadHeaderSpix(FILE *fp, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderSpix()
l_ok pixWriteStreamSpix(FILE *fp, PIX *pix)
pixWriteStreamSpix()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
l_ok pixSerializeToMemory(PIX *pixs, l_uint32 **pdata, size_t *pnbytes)
pixSerializeToMemory()
PIX * pixCreateHeader(l_int32 width, l_int32 height, l_int32 depth)
pixCreateHeader()
size_t fnbytesInFile(FILE *fp)
fnbytesInFile()
PIX * pixReadStreamSpix(FILE *fp)
pixReadStreamSpix()
PIXCMAP * pixcmapDeserializeFromMemory(l_uint8 *data, l_int32 cpc, l_int32 ncolors)
pixcmapDeserializeFromMemory()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixcmapIsValid(const PIXCMAP *cmap, PIX *pix, l_int32 *pvalid)
pixcmapIsValid()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
l_ok pixWriteMemSpix(l_uint8 **pdata, size_t *psize, PIX *pix)
pixWriteMemSpix()
l_ok sreadHeaderSpix(const l_uint32 *data, size_t size, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
sreadHeaderSpix()
l_ok readHeaderSpix(const char *filename, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderSpix()