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);
142 if ((fp = fopenReadStream(filename)) == NULL)
143 return ERROR_INT_1(
"image file not found", filename, __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);
182 nbytes = fnbytesInFile(fp);
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);
349l_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);
362 pixGetDimensions(pixs, &w, &h, &d);
363 wpl = pixGetWpl(pixs);
364 rdata = pixGetData(pixs);
365 rdatasize = 4 * wpl * h;
368 if ((cmap = pixGetColormap(pixs)) != NULL) {
369 pixcmapIsValid(cmap, pixs, &valid);
371 return ERROR_INT(
"colormap not valid", __func__, 1);
372 pixcmapSerializeToMemory(cmap, 4, &ncolors, &cdata);
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);
400 lept_stderr(
"Serialize: "
401 "raster size = %d, ncolors in cmap = %d, total bytes = %d\n",
402 rdatasize, ncolors, nbytes);
428l_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);
457 if ((pix1 = pixCreateHeader(w, h, d)) == 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,
470 if ((pixd = pixCreate(w, h, d)) == NULL)
471 return (
PIX *)ERROR_PTR(
"pix not made", __func__, NULL);
473 cmap = pixcmapDeserializeFromMemory((l_uint8 *)(&data[6]), 4, ncolors);
476 return (
PIX *)ERROR_PTR(
"cmap not made", __func__, NULL);
478 if (pixSetColormap(pixd, cmap)) {
480 return (
PIX *)ERROR_PTR(
"cmap is not valid", __func__, NULL);
485 imdata = pixGetData(pixd);
486 memcpy(imdata, data + 7 + ncolors, imdata_size);
490 pixcmapIsValid(cmap, pixd, &valid);
493 return (
PIX *)ERROR_PTR(
"cmap is invalid with pix", __func__, NULL);
498 lept_stderr(
"Deserialize: "
499 "raster size = %d, ncolors in cmap = %d, total bytes = %zu\n",
500 imdata_size, ncolors, nbytes);
l_ok freadHeaderSpix(FILE *fp, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
freadHeaderSpix()
l_ok readHeaderSpix(const char *filename, l_int32 *pwidth, l_int32 *pheight, l_int32 *pbps, l_int32 *pspp, l_int32 *piscmap)
readHeaderSpix()
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()