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
99 return (
PIX *)ERROR_PTR(
"stream not defined", __func__, NULL);
102 return (
PIX *)ERROR_PTR(
"data not read", __func__, NULL);
106 return (
PIX *)ERROR_PTR(
"pix not made", __func__, NULL);
139 return ERROR_INT(
"filename not defined", __func__, 1);
140 if (!pwidth || !pheight || !pbps || !pspp)
141 return ERROR_INT(
"input ptr(s) not defined", __func__, 1);
143 return ERROR_INT(
"image file not found", __func__, 1);
178 return ERROR_INT(
"stream not defined", __func__, 1);
179 if (!pwidth || !pheight || !pbps || !pspp)
180 return ERROR_INT(
"input ptr(s) not defined", __func__, 1);
184 return ERROR_INT(
"file too small to be spix", __func__, 1);
185 if (fread(data, 4, 6, fp) != 6)
186 return ERROR_INT(
"error reading data", __func__, 1);
187 ret =
sreadHeaderSpix(data, nbytes, pwidth, pheight, pbps, pspp, piscmap);
222 return ERROR_INT(
"data not defined", __func__, 1);
223 if (!pwidth || !pheight || !pbps || !pspp)
224 return ERROR_INT(
"input ptr(s) not defined", __func__, 1);
225 *pwidth = *pheight = *pbps = *pspp = 0;
229 return ERROR_INT(
"size too small", __func__, 1);
233 if (
id[0] !=
's' ||
id[1] !=
'p' ||
id[2] !=
'i' ||
id[3] !=
'x')
234 return ERROR_INT(
"not a valid spix file", __func__, 1);
248 *piscmap = (ncolors == 0) ? 0 : 1;
272 return ERROR_INT(
"stream not defined", __func__, 1);
274 return ERROR_INT(
"pix not defined", __func__, 1);
277 return ERROR_INT(
"failure to write pix to memory", __func__, 1);
278 fwrite(data, 1, size, fp);
349 l_int32 w, h, d, wpl, rdatasize, ncolors, nbytes, index, valid;
355 if (!pdata || !pnbytes)
356 return ERROR_INT(
"&data and &nbytes not both defined", __func__, 1);
360 return ERROR_INT(
"pixs not defined", __func__, 1);
363 wpl = pixGetWpl(pixs);
365 rdatasize = 4 * wpl * h;
368 if ((cmap = pixGetColormap(pixs)) != NULL) {
371 return ERROR_INT(
"colormap not valid", __func__, 1);
375 nbytes = 24 + 4 * ncolors + 4 + rdatasize;
376 if ((data = (l_uint32 *)LEPT_CALLOC(nbytes / 4,
sizeof(l_uint32)))
379 return ERROR_INT(
"data not made", __func__, 1);
394 memcpy(data + 6, cdata, 4 * ncolors);
396 data[index] = rdatasize;
397 memcpy(data + index + 1, rdata, rdatasize);
401 "raster size = %d, ncolors in cmap = %d, total bytes = %d\n",
402 rdatasize, ncolors, nbytes);
428 l_int32 w, h, d, pixdata_size, memdata_size, imdata_size, ncolors, valid;
434 return (
PIX *)ERROR_PTR(
"data not defined", __func__, NULL);
435 if (nbytes < 28 || nbytes > ((1LL << 31) - 1)) {
436 L_ERROR(
"invalid nbytes = %zu\n", __func__, nbytes);
441 if (
id[0] !=
's' ||
id[1] !=
'p' ||
id[2] !=
'i' ||
id[3] !=
'x')
442 return (
PIX *)ERROR_PTR(
"invalid id string", __func__, NULL);
449 if (w < 1 || w > MaxAllowedWidth)
450 return (
PIX *)ERROR_PTR(
"invalid width", __func__, NULL);
451 if (h < 1 || h > MaxAllowedHeight)
452 return (
PIX *)ERROR_PTR(
"invalid height", __func__, NULL);
453 if (1LL * w * h > MaxAllowedArea)
454 return (
PIX *)ERROR_PTR(
"area too large", __func__, NULL);
455 if (ncolors < 0 || ncolors > 256 || ncolors + 7 >= nbytes/
sizeof(l_int32))
456 return (
PIX *)ERROR_PTR(
"invalid ncolors", __func__, NULL);
458 return (
PIX *)ERROR_PTR(
"failed to make header", __func__, NULL);
459 pixdata_size = 4 * h * pixGetWpl(pix1);
460 memdata_size = nbytes - 24 - 4 * ncolors - 4;
461 imdata_size = data[6 + ncolors];
463 if (pixdata_size != memdata_size || pixdata_size != imdata_size) {
464 L_ERROR(
"pixdata_size = %d, memdata_size = %d, imdata_size = %d "
465 "not all equal!\n", __func__, pixdata_size, memdata_size,
471 return (
PIX *)ERROR_PTR(
"pix not made", __func__, NULL);
476 return (
PIX *)ERROR_PTR(
"cmap not made", __func__, NULL);
480 return (
PIX *)ERROR_PTR(
"cmap is not valid", __func__, NULL);
486 memcpy(imdata, data + 7 + ncolors, imdata_size);
493 return (
PIX *)ERROR_PTR(
"cmap is invalid with pix", __func__, NULL);
499 "raster size = %d, ncolors in cmap = %d, total bytes = %zu\n",
500 imdata_size, ncolors, nbytes);
PIXCMAP * pixcmapDeserializeFromMemory(l_uint8 *data, l_int32 cpc, l_int32 ncolors)
pixcmapDeserializeFromMemory()
l_ok pixcmapIsValid(const PIXCMAP *cmap, PIX *pix, l_int32 *pvalid)
pixcmapIsValid()
l_ok pixcmapSerializeToMemory(PIXCMAP *cmap, l_int32 cpc, l_int32 *pncolors, l_uint8 **pdata)
pixcmapSerializeToMemory()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok pixSetColormap(PIX *pix, PIXCMAP *colormap)
pixSetColormap()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCreateHeader(l_int32 width, l_int32 height, l_int32 depth)
pixCreateHeader()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok freadHeaderSpix(FILE *fp, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderSpix()
PIX * pixDeserializeFromMemory(const l_uint32 *data, size_t nbytes)
pixDeserializeFromMemory()
PIX * pixReadStreamSpix(FILE *fp)
pixReadStreamSpix()
l_ok pixWriteMemSpix(l_uint8 **pdata, size_t *psize, PIX *pix)
pixWriteMemSpix()
PIX * pixReadMemSpix(const l_uint8 *data, size_t size)
pixReadMemSpix()
l_ok readHeaderSpix(const char *filename, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderSpix()
l_ok pixWriteStreamSpix(FILE *fp, PIX *pix)
pixWriteStreamSpix()
l_ok pixSerializeToMemory(PIX *pixs, l_uint32 **pdata, size_t *pnbytes)
pixSerializeToMemory()
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()
void lept_stderr(const char *fmt,...)
lept_stderr()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
size_t fnbytesInFile(FILE *fp)
fnbytesInFile()
FILE * fopenReadStream(const char *filename)
fopenReadStream()