135#include <config_auto.h>
139#include "allheaders.h"
143static const size_t MaxInitPtrArraySize = 100000;
144static const size_t MaxPixaPtrArraySize = 5000000;
145static const size_t MaxPixaaPtrArraySize = 1000000;
171 if (n <= 0 || n > MaxInitPtrArraySize)
174 pixa = (
PIXA *)LEPT_CALLOC(1,
sizeof(
PIXA));
178 pixa->
pix = (
PIX **)LEPT_CALLOC(n,
sizeof(
PIX *));
179 pixa->
boxa = boxaCreate(n);
180 if (!pixa->
pix || !pixa->
boxa) {
182 return (
PIXA *)ERROR_PTR(
"pix or boxa not made", __func__, NULL);
209l_int32 w, h, d, nw, nh, i, j, index;
214 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
216 return (
PIXA *)ERROR_PTR(
"n must be > 0", __func__, NULL);
219 return (
PIXA *)ERROR_PTR(
"pixa not made", __func__, NULL);
220 pixGetDimensions(pixs, &w, &h, &d);
221 if ((pix1 = pixCreate(cellw, cellh, d)) == NULL) {
223 return (
PIXA *)ERROR_PTR(
"pix1 not made", __func__, NULL);
226 nw = (w + cellw - 1) / cellw;
227 nh = (h + cellh - 1) / cellh;
228 for (i = 0, index = 0; i < nh; i++) {
229 for (j = 0; j < nw && index < n; j++, index++) {
230 pixRasterop(pix1, 0, 0, cellw, cellh,
PIX_SRC, pixs,
231 j * cellw, i * cellh);
232 if (d == 1 && !pixClipToForeground(pix1, &pix2, NULL))
274l_int32 i, n, end, w, h, wbox, hbox, cropwarn;
280 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
282 return (
PIXA *)ERROR_PTR(
"boxa not defined", __func__, NULL);
284 return (
PIXA *)ERROR_PTR(
"num must be >= 0", __func__, NULL);
286 n = boxaGetCount(boxa);
287 end = (num == 0) ? n - 1 : L_MIN(start + num - 1, n - 1);
288 if ((pixad =
pixaCreate(end - start + 1)) == NULL)
289 return (
PIXA *)ERROR_PTR(
"pixad not made", __func__, NULL);
291 boxaGetExtent(boxa, &wbox, &hbox, NULL);
292 pixGetDimensions(pixs, &w, &h, NULL);
294 if (wbox > w || hbox > h)
297 *pcropwarn = cropwarn;
299 for (i = start; i <= end; i++) {
300 box = boxaGetBox(boxa, i,
L_COPY);
302 pixd = pixClipRectangle(pixs, box, &boxc);
309 pixd = pixClipRectangle(pixs, box, NULL);
348 l_uint32 bordercolor)
350l_int32 w, h, d, cellw, cellh, i, j;
355 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
356 if (nx <= 0 || ny <= 0)
357 return (
PIXA *)ERROR_PTR(
"nx and ny must be > 0", __func__, NULL);
358 borderwidth = L_MAX(0, borderwidth);
361 return (
PIXA *)ERROR_PTR(
"pixa not made", __func__, NULL);
362 pixGetDimensions(pixs, &w, &h, &d);
363 cellw = (w + nx - 1) / nx;
364 cellh = (h + ny - 1) / ny;
366 for (i = 0; i < ny; i++) {
367 for (j = 0; j < nx; j++) {
368 if ((pix1 = pixCreate(cellw + 2 * borderwidth,
369 cellh + 2 * borderwidth, d)) == NULL) {
371 return (
PIXA *)ERROR_PTR(
"pix1 not made", __func__, NULL);
373 pixCopyColormap(pix1, pixs);
374 if (borderwidth == 0) {
380 pixSetAllArbitrary(pix1, bordercolor);
382 pixRasterop(pix1, borderwidth, borderwidth, cellw, cellh,
383 PIX_SRC, pixs, j * cellw, i * cellh);
410 L_WARNING(
"ptr address is NULL!\n", __func__);
414 if ((pixa = *ppixa) == NULL)
419 for (i = 0; i < pixa->
n; i++)
420 pixDestroy(&pixa->
pix[i]);
421 LEPT_FREE(pixa->
pix);
422 boxaDestroy(&pixa->
boxa);
451 return (
PIXA *)ERROR_PTR(
"pixa not defined", __func__, NULL);
459 return (
PIXA *)ERROR_PTR(
"invalid copyflag", __func__, NULL);
462 return (
PIXA *)ERROR_PTR(
"pixac not made", __func__, NULL);
464 for (i = 0; i < pixa->
n; i++) {
501 return ERROR_INT(
"pixa not defined", __func__, 1);
503 return ERROR_INT(
"pix not defined", __func__, 1);
507 else if (copyflag ==
L_COPY)
508 pixc = pixCopy(NULL, pix);
510 pixc = pixClone(pix);
512 return ERROR_INT(
"invalid copyflag", __func__, 1);
514 return ERROR_INT(
"pixc not made", __func__, 1);
521 return ERROR_INT(
"extension failed", __func__, 1);
545 return ERROR_INT(
"pixa not defined", __func__, 1);
547 return ERROR_INT(
"box not defined", __func__, 1);
549 return ERROR_INT(
"invalid copyflag", __func__, 1);
551 boxaAddBox(pixa->
boxa, box, copyflag);
572 return ERROR_INT(
"pixa not defined", __func__, 1);
596size_t oldsize, newsize;
599 return ERROR_INT(
"pixa not defined", __func__, 1);
600 if (pixa->
nalloc > MaxPixaPtrArraySize)
601 return ERROR_INT(
"pixa has too many ptrs", __func__, 1);
602 if (size > MaxPixaPtrArraySize)
603 return ERROR_INT(
"size > 5M ptrs; too large", __func__, 1);
604 if (size <= pixa->nalloc) {
605 L_INFO(
"size too small; no extension\n", __func__);
610 newsize = size *
sizeof(
PIX *);
611 if ((pixa->
pix = (
PIX **)reallocNew((
void **)&pixa->
pix,
612 oldsize, newsize)) == NULL)
613 return ERROR_INT(
"new ptr array not returned", __func__, 1);
615 return boxaExtendArrayToSize(pixa->
boxa, size);
632 return ERROR_INT(
"pixa not defined", __func__, 0);
654 return (
PIX *)ERROR_PTR(
"pixa not defined", __func__, NULL);
655 if (index < 0 || index >= pixa->
n)
656 return (
PIX *)ERROR_PTR(
"index not valid", __func__, NULL);
657 if ((pix = pixa->
pix[index]) == NULL) {
658 L_ERROR(
"no pix at pixa[%d]\n", __func__, index);
659 return (
PIX *)ERROR_PTR(
"pix not found!", __func__, NULL);
663 return pixCopy(NULL, pix);
664 else if (accesstype ==
L_CLONE)
665 return pixClone(pix);
667 return (
PIX *)ERROR_PTR(
"invalid accesstype", __func__, NULL);
692 return ERROR_INT(
"pixa not defined", __func__, 1);
693 if (index < 0 || index >= pixa->
n)
694 return ERROR_INT(
"index not valid", __func__, 1);
697 return ERROR_INT(
"pix not found!", __func__, 1);
698 pixGetDimensions(pix, pw, ph, pd);
716 return (
BOXA *)ERROR_PTR(
"pixa not defined", __func__, NULL);
718 return (
BOXA *)ERROR_PTR(
"boxa not defined", __func__, NULL);
721 return (
BOXA *)ERROR_PTR(
"invalid accesstype", __func__, NULL);
723 return boxaCopy(pixa->
boxa, accesstype);
737 return ERROR_INT(
"pixa not defined", __func__, 0);
739 return boxaGetCount(pixa->
boxa);
771 return (
BOX *)ERROR_PTR(
"pixa not defined", __func__, NULL);
773 return (
BOX *)ERROR_PTR(
"boxa not defined", __func__, NULL);
774 if (index < 0 || index >= pixa->
boxa->
n)
775 return (
BOX *)ERROR_PTR(
"index not valid", __func__, NULL);
777 return (
BOX *)ERROR_PTR(
"invalid accesstype", __func__, NULL);
784 return boxClone(box);
814 return ERROR_INT(
"pixa not defined", __func__, 1);
815 if (index < 0 || index >= pixa->
n)
816 return ERROR_INT(
"index not valid", __func__, 1);
819 return ERROR_INT(
"box not found!", __func__, 1);
820 boxGetGeometry(box, px, py, pw, ph);
845 return ERROR_INT(
"pixa not defined", __func__, 1);
847 return ERROR_INT(
"boxa not defined", __func__, 1);
850 return ERROR_INT(
"invalid access type", __func__, 1);
852 boxaDestroy(&pixa->
boxa);
856 pixa->
boxa = boxaCopy(boxa, accesstype);
880 return (
PIX **)ERROR_PTR(
"pixa not defined", __func__, NULL);
904l_int32 i, n, d, maxd, same;
906 if (pmaxd) *pmaxd = 0;
908 return ERROR_INT(
"psame not defined", __func__, 1);
910 return ERROR_INT(
"pixa not defined", __func__, 1);
912 return ERROR_INT(
"no pix in pixa", __func__, 1);
916 for (i = 1; i < n; i++) {
918 return ERROR_INT(
"pix depth not found", __func__, 1);
919 maxd = L_MAX(maxd, d);
924 if (pmaxd) *pmaxd = maxd;
949l_int32 i, n, w, h, maxw, maxh, same;
951 if (pmaxw) *pmaxw = 0;
952 if (pmaxh) *pmaxh = 0;
954 return ERROR_INT(
"psame not defined", __func__, 1);
957 return ERROR_INT(
"pixa not defined", __func__, 1);
959 return ERROR_INT(
"no pix in pixa", __func__, 1);
963 for (i = 1; i < n; i++) {
965 return ERROR_INT(
"pix dimensions not found", __func__, 1);
966 maxw = L_MAX(maxw, w);
967 maxh = L_MAX(maxh, h);
968 if (w != maxw || h != maxh)
972 if (pmaxw) *pmaxw = maxw;
973 if (pmaxh) *pmaxh = maxh;
1001 if (pfullpa) *pfullpa = 0;
1002 if (pfullba) *pfullba = 0;
1004 return ERROR_INT(
"pixa not defined", __func__, 1);
1009 for (i = 0; i < n; i++) {
1020 boxaIsFull(boxa, pfullba);
1049 return ERROR_INT(
"&ntext not defined", __func__, 1);
1052 return ERROR_INT(
"pixa not defined", __func__, 1);
1055 for (i = 0; i < n; i++) {
1058 text = pixGetText(pix);
1059 if (text && strlen(text) > 0)
1096 return ERROR_INT(
"pixa not defined", __func__, 1);
1099 if (sa && (sarrayGetCount(sa) != n))
1100 return ERROR_INT(
"pixa and sa sizes differ", __func__, 1);
1103 for (i = 0; i < n; i++) {
1106 pixSetText(pix, text);
1112 for (i = 0; i < n; i++) {
1115 str = sarrayGetString(sa, i,
L_NOCOPY);
1116 pixSetText(pix, str);
1152 if (psize) *psize = 0;
1154 return (
void ***)ERROR_PTR(
"pixa not defined", __func__, NULL);
1157 return (
void ***)ERROR_PTR(
"pixa not all same depth", __func__, NULL);
1159 if (psize) *psize = n;
1160 if ((lineset = (
void ***)LEPT_CALLOC(n,
sizeof(
void **))) == NULL)
1161 return (
void ***)ERROR_PTR(
"lineset not made", __func__, NULL);
1162 for (i = 0; i < n; i++) {
1164 lineptrs = pixGetLinePtrs(pix, NULL);
1165 lineset[i] = lineptrs;
1194l_int32 i, n, w, h, d, spp, count, hastext;
1199 return ERROR_INT(
"stream not defined", __func__, 1);
1201 return ERROR_INT(
"pixa not defined", __func__, 1);
1204 for (i = 0; i < n; i++) {
1206 fprintf(fp,
"%d: no pix at this index\n", i);
1209 pixGetDimensions(pix, &w, &h, &d);
1210 spp = pixGetSpp(pix);
1211 text = pixGetText(pix);
1212 hastext = (text && strlen(text) > 0);
1213 if ((cmap = pixGetColormap(pix)) != NULL)
1214 count = pixcmapGetCount(cmap);
1215 fprintf(fp,
"Pix %d: w = %d, h = %d, d = %d, spp = %d",
1217 if (cmap) fprintf(fp,
", cmap(%d colors)", count);
1218 if (hastext) fprintf(fp,
", text = %s", text);
1254 return ERROR_INT(
"pixa not defined", __func__, 1);
1255 if (index < 0 || index >= pixa->
n)
1256 return ERROR_INT(
"index not valid", __func__, 1);
1258 return ERROR_INT(
"pix not defined", __func__, 1);
1260 pixDestroy(&(pixa->
pix[index]));
1261 pixa->
pix[index] = pix;
1265 if (index > boxa->
n)
1266 return ERROR_INT(
"boxa index not valid", __func__, 1);
1267 boxaReplaceBox(boxa, index, box);
1302 return ERROR_INT(
"pixa not defined", __func__, 1);
1304 if (index < 0 || index > n) {
1305 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n);
1309 return ERROR_INT(
"pixs not defined", __func__, 1);
1313 return ERROR_INT(
"extension failed", __func__, 1);
1314 if (boxaExtendArray(pixa->
boxa))
1315 return ERROR_INT(
"extension failed", __func__, 1);
1318 for (i = n; i > index; i--)
1319 pixa->
pix[i] = pixa->
pix[i - 1];
1320 pixa->
pix[index] = pixs;
1324 boxaInsertBox(pixa->
boxa, index, box);
1353 return ERROR_INT(
"pixa not defined", __func__, 1);
1355 if (index < 0 || index >= n) {
1356 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
1362 pixDestroy(&array[index]);
1363 for (i = index + 1; i < n; i++)
1364 array[i - 1] = array[i];
1365 array[n - 1] = NULL;
1370 nbox = boxaGetCount(boxa);
1372 boxaRemoveBox(boxa, index);
1406 if (ppix) *ppix = NULL;
1407 if (pbox) *pbox = NULL;
1409 return ERROR_INT(
"pixa not defined", __func__, 1);
1411 if (index < 0 || index >= n) {
1412 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
1420 pixDestroy(&array[index]);
1421 for (i = index + 1; i < n; i++)
1422 array[i - 1] = array[i];
1423 array[n - 1] = NULL;
1428 nbox = boxaGetCount(boxa);
1430 boxaRemoveBoxAndSave(boxa, index, pbox);
1456 return ERROR_INT(
"pixa not defined", __func__, 1);
1458 return ERROR_INT(
"naindex not defined", __func__, 1);
1459 if ((n = numaGetCount(naindex)) == 0)
1460 return ERROR_INT(
"naindex is empty", __func__, 1);
1464 for (i = 0; i < n; i++) {
1465 numaGetIValue(na1, i, &index);
1517 return ERROR_INT(
"pixa not defined", __func__, 1);
1521 for (i = 0; i < n; i++) {
1523 pix1 = pixCopy(NULL, pix);
1525 pix1 = pixCreate(1, 1, 1);
1529 boxaInitFull(pixa->
boxa, box);
1554 return ERROR_INT(
"pixa not defined", __func__, 1);
1557 for (i = 0; i < n; i++)
1558 pixDestroy(&pixa->
pix[i]);
1560 return boxaClear(pixa->
boxa);
1595 return ERROR_INT(
"pixad not defined", __func__, 1);
1601 if (iend < 0 || iend >= n)
1604 return ERROR_INT(
"istart > iend; nothing to add", __func__, 1);
1606 for (i = istart; i <= iend; i++) {
1614 iend = L_MIN(iend, nb - 1);
1615 boxaJoin(boxad, boxas, istart, iend);
1616 boxaDestroy(&boxas);
1617 boxaDestroy(&boxad);
1643l_int32 i, n1, n2, n, nb1, nb2;
1649 return (
PIXA *)ERROR_PTR(
"pixa1 not defined", __func__, NULL);
1651 return (
PIXA *)ERROR_PTR(
"pixa2 not defined", __func__, NULL);
1653 return (
PIXA *)ERROR_PTR(
"invalid copyflag", __func__, NULL);
1658 return (
PIXA *)ERROR_PTR(
"at least one input pixa is empty",
1661 L_WARNING(
"counts differ: %d != %d\n", __func__, n1, n2);
1666 for (i = 0; i < n; i++) {
1711 return ERROR_INT(
"pixaad not defined", __func__, 1);
1718 if (iend < 0 || iend >= n)
1721 return ERROR_INT(
"istart > iend; nothing to add", __func__, 1);
1723 for (i = istart; i <= iend; i++) {
1762 if (n <= 0 || n > MaxInitPtrArraySize)
1765 paa = (
PIXAA *)LEPT_CALLOC(1,
sizeof(
PIXAA));
1768 if ((paa->
pixa = (
PIXA **)LEPT_CALLOC(n,
sizeof(
PIXA *))) == NULL) {
1770 return (
PIXAA *)ERROR_PTR(
"pixa ptrs not made", __func__, NULL);
1772 paa->
boxa = boxaCreate(n);
1804l_int32 count, i, j, npixa;
1810 return (
PIXAA *)ERROR_PTR(
"pixa not defined", __func__, NULL);
1813 return (
PIXAA *)ERROR_PTR(
"no pix in pixa", __func__, NULL);
1815 return (
PIXAA *)ERROR_PTR(
"n must be > 0", __func__, NULL);
1817 return (
PIXAA *)ERROR_PTR(
"invalid type", __func__, NULL);
1819 return (
PIXAA *)ERROR_PTR(
"invalid copyflag", __func__, NULL);
1822 npixa = (count + n - 1) / n;
1824 npixa = L_MIN(n, count);
1827 for (i = 0; i < count; i++) {
1838 for (i = 0; i < npixa; i++) {
1840 for (j = i; j < count; j += n) {
1865 L_WARNING(
"ptr address is NULL!\n", __func__);
1869 if ((paa = *ppaa) == NULL)
1872 for (i = 0; i < paa->
n; i++)
1874 LEPT_FREE(paa->
pixa);
1875 boxaDestroy(&paa->
boxa);
1906 return ERROR_INT(
"paa not defined", __func__, 1);
1908 return ERROR_INT(
"pixa not defined", __func__, 1);
1911 return ERROR_INT(
"invalid copyflag", __func__, 1);
1916 if ((pixac =
pixaCopy(pixa, copyflag)) == NULL)
1917 return ERROR_INT(
"pixac not made", __func__, 1);
1925 return ERROR_INT(
"extension failed", __func__, 1);
1928 paa->
pixa[n] = pixac;
1948size_t oldsize, newsize;
1951 return ERROR_INT(
"paa not defined", __func__, 1);
1952 if (paa->
nalloc > MaxPixaaPtrArraySize)
1953 return ERROR_INT(
"paa has too many ptrs", __func__, 1);
1955 newsize = 2 * oldsize;
1956 if (newsize > 8 * MaxPixaaPtrArraySize)
1957 return ERROR_INT(
"newsize > 8 MB; too large", __func__, 1);
1959 if ((paa->
pixa = (
PIXA **)reallocNew((
void **)&paa->
pixa,
1960 oldsize, newsize)) == NULL)
1961 return ERROR_INT(
"new ptr array not returned", __func__, 1);
1988 return ERROR_INT(
"paa not defined", __func__, 1);
1990 return ERROR_INT(
"pix not defined", __func__, 1);
1993 return ERROR_INT(
"pixa not found", __func__, 1);
2021 return ERROR_INT(
"paa not defined", __func__, 1);
2023 return ERROR_INT(
"box not defined", __func__, 1);
2025 return ERROR_INT(
"invalid copyflag", __func__, 1);
2027 boxaAddBox(paa->
boxa, box, copyflag);
2056 if (pna) *pna = NULL;
2058 return ERROR_INT(
"paa not defined", __func__, 0);
2062 if ((na = numaCreate(n)) == NULL)
2063 return ERROR_INT(
"na not made", __func__, 0);
2065 for (i = 0; i < n; i++) {
2103 return (
PIXA *)ERROR_PTR(
"paa not defined", __func__, NULL);
2104 if (index < 0 || index >= paa->
n)
2105 return (
PIXA *)ERROR_PTR(
"index not valid", __func__, NULL);
2108 return (
PIXA *)ERROR_PTR(
"invalid accesstype", __func__, NULL);
2110 if ((pixa = paa->
pixa[index]) == NULL) {
2111 L_ERROR(
"missing pixa[%d]\n", __func__, index);
2112 return (
PIXA *)ERROR_PTR(
"pixa not found at index", __func__, NULL);
2136 return (
BOXA *)ERROR_PTR(
"paa not defined", __func__, NULL);
2138 return (
BOXA *)ERROR_PTR(
"invalid access type", __func__, NULL);
2140 return boxaCopy(paa->
boxa, accesstype);
2163 return (
PIX *)ERROR_PTR(
"pixa not retrieved", __func__, NULL);
2164 if ((pix =
pixaGetPix(pixa, ipix, accessflag)) == NULL)
2165 L_ERROR(
"pix not retrieved\n", __func__);
2189l_int32 i, n, d, maxd, same, samed;
2192 if (pmaxd) *pmaxd = 0;
2194 return ERROR_INT(
"psame not defined", __func__, 1);
2197 return ERROR_INT(
"paa not defined", __func__, 1);
2199 return ERROR_INT(
"no pixa in paa", __func__, 1);
2204 for (i = 1; i < n; i++) {
2208 maxd = L_MAX(maxd, d);
2209 if (!samed || maxd != d)
2213 if (pmaxd) *pmaxd = maxd;
2238l_int32 i, n, w, h, maxw, maxh, same, same2;
2241 if (pmaxw) *pmaxw = 0;
2242 if (pmaxh) *pmaxh = 0;
2244 return ERROR_INT(
"psame not defined", __func__, 1);
2247 return ERROR_INT(
"paa not defined", __func__, 1);
2249 return ERROR_INT(
"no pixa in paa", __func__, 1);
2256 for (i = 1; i < n; i++) {
2260 maxw = L_MAX(maxw, w);
2261 maxh = L_MAX(maxh, h);
2262 if (!same2 || maxw != w || maxh != h)
2266 if (pmaxw) *pmaxw = maxw;
2267 if (pmaxh) *pmaxh = maxh;
2292 return ERROR_INT(
"&full not defined", __func__, 0);
2295 return ERROR_INT(
"paa not defined", __func__, 0);
2299 for (i = 0; i < n; i++) {
2342 return ERROR_INT(
"paa not defined", __func__, 1);
2344 return ERROR_INT(
"pixa not defined", __func__, 1);
2348 for (i = 0; i < n; i++) {
2381 return ERROR_INT(
"paa not defined", __func__, 1);
2382 if (index < 0 || index >= paa->
n)
2383 return ERROR_INT(
"index not valid", __func__, 1);
2385 return ERROR_INT(
"pixa not defined", __func__, 1);
2388 paa->
pixa[index] = pixa;
2411 return ERROR_INT(
"paa not defined", __func__, 1);
2414 for (i = 0; i < n; i++)
2441 return ERROR_INT(
"paa not defined", __func__, 1);
2444 for (i = n - 1; i >= 0; i--) {
2486 return (
PIXA *)ERROR_PTR(
"no libpng: can't read data", __func__, NULL);
2490 return (
PIXA *)ERROR_PTR(
"filename not defined", __func__, NULL);
2492 if ((fp = fopenReadStream(filename)) == NULL)
2493 return (
PIXA *)ERROR_PTR_1(
"stream not opened",
2494 filename, __func__, NULL);
2498 return (
PIXA *)ERROR_PTR_1(
"pixa not read",
2499 filename, __func__, NULL);
2520l_int32 n, i, xres, yres, version;
2527 return (
PIXA *)ERROR_PTR(
"no libpng: can't read data", __func__, NULL);
2531 return (
PIXA *)ERROR_PTR(
"stream not defined", __func__, NULL);
2533 if (fscanf(fp,
"\nPixa Version %d\n", &version) != 1)
2534 return (
PIXA *)ERROR_PTR(
"not a pixa file", __func__, NULL);
2536 return (
PIXA *)ERROR_PTR(
"invalid pixa version", __func__, NULL);
2537 if (fscanf(fp,
"Number of pix = %d\n", &n) != 1)
2538 return (
PIXA *)ERROR_PTR(
"not a pixa file", __func__, NULL);
2540 return (
PIXA *)ERROR_PTR(
"num pix ptrs < 0", __func__, NULL);
2541 if (n > MaxPixaPtrArraySize)
2542 return (
PIXA *)ERROR_PTR(
"too many pix ptrs", __func__, NULL);
2543 if (n == 0) L_INFO(
"the pixa is empty\n", __func__);
2545 if ((boxa = boxaReadStream(fp)) == NULL)
2546 return (
PIXA *)ERROR_PTR(
"boxa not made", __func__, NULL);
2549 return (
PIXA *)ERROR_PTR(
"pixa not made", __func__, NULL);
2551 boxaDestroy(&pixa->
boxa);
2554 for (i = 0; i < n; i++) {
2555 if ((fscanf(fp,
" pix[%d]: xres = %d, yres = %d\n",
2556 &ignore, &xres, &yres)) != 3) {
2558 return (
PIXA *)ERROR_PTR(
"res reading error", __func__, NULL);
2560 if ((pix = pixReadStreamPng(fp)) == NULL) {
2562 return (
PIXA *)ERROR_PTR(
"pix not read", __func__, NULL);
2564 pixSetXRes(pix, xres);
2565 pixSetYRes(pix, yres);
2587 return (
PIXA *)ERROR_PTR(
"data not defined", __func__, NULL);
2588 if ((fp = fopenReadFromMemory(data, size)) == NULL)
2589 return (
PIXA *)ERROR_PTR(
"stream not opened", __func__, NULL);
2593 if (!pixa) L_ERROR(
"pixa not read\n", __func__);
2621 L_INFO(
"write to named temp file %s is disabled\n", __func__, fname);
2648 return ERROR_INT(
"no libpng: can't write data", __func__, 1);
2652 return ERROR_INT(
"filename not defined", __func__, 1);
2654 return ERROR_INT(
"pixa not defined", __func__, 1);
2656 if ((fp = fopenWriteStream(filename,
"wb")) == NULL)
2657 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
2661 return ERROR_INT_1(
"pixa not written to stream", filename, __func__, 1);
2687 return ERROR_INT(
"no libpng: can't write data", __func__, 1);
2691 return ERROR_INT(
"stream not defined", __func__, 1);
2693 return ERROR_INT(
"pixa not defined", __func__, 1);
2697 fprintf(fp,
"Number of pix = %d\n", n);
2698 boxaWriteStream(fp, pixa->
boxa);
2699 for (i = 0; i < n; i++) {
2701 return ERROR_INT(
"pix not found", __func__, 1);
2702 fprintf(fp,
" pix[%d]: xres = %d, yres = %d\n",
2704 pixWriteStreamPng(fp, pix, 0.0);
2732 if (pdata) *pdata = NULL;
2733 if (psize) *psize = 0;
2735 return ERROR_INT(
"&data not defined", __func__, 1);
2737 return ERROR_INT(
"&size not defined", __func__, 1);
2739 return ERROR_INT(
"pixa not defined", __func__, 1);
2742 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
2743 return ERROR_INT(
"stream not opened", __func__, 1);
2747 if (*psize > 0) *psize = *psize - 1;
2749 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
2751 if ((fp = fopenWriteWinTempfile()) == NULL)
2752 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
2754 if ((fp = tmpfile()) == NULL)
2755 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
2759 *pdata = l_binaryReadStream(fp, psize);
2787 return (
PIXA *)ERROR_PTR(
"filename not defined", __func__, NULL);
2789 l_getStructStrFromFile(filename,
L_STR_NAME, &sname);
2791 return (
PIXA *)ERROR_PTR(
"struct name not found", __func__, NULL);
2792 snprintf(buf,
sizeof(buf),
"%s", sname);
2795 if (strcmp(buf,
"Pixacomp") == 0) {
2796 if ((pac = pixacompRead(filename)) == NULL)
2797 return (
PIXA *)ERROR_PTR(
"pac not made", __func__, NULL);
2798 pixa = pixaCreateFromPixacomp(pac,
L_COPY);
2799 pixacompDestroy(&pac);
2800 }
else if (strcmp(buf,
"Pixa") == 0) {
2801 if ((pixa =
pixaRead(filename)) == NULL)
2802 return (
PIXA *)ERROR_PTR(
"pixa not made", __func__, NULL);
2804 return (
PIXA *)ERROR_PTR(
"invalid file type", __func__, NULL);
2846 return (
PIXAA *)ERROR_PTR(
"dirname not defined", __func__, NULL);
2848 sa = getSortedPathnamesInDirectory(dirname, substr, first, nfiles);
2849 if (!sa || ((n = sarrayGetCount(sa)) == 0)) {
2851 return (
PIXAA *)ERROR_PTR(
"no pixa files found", __func__, NULL);
2855 for (i = 0; i < n; i++) {
2856 fname = sarrayGetString(sa, i,
L_NOCOPY);
2857 if ((pixa =
pixaRead(fname)) == NULL) {
2858 L_ERROR(
"pixa not read for %d-th file", __func__, i);
2888 return (
PIXAA *)ERROR_PTR(
"no libpng: can't read data", __func__, NULL);
2892 return (
PIXAA *)ERROR_PTR(
"filename not defined", __func__, NULL);
2894 if ((fp = fopenReadStream(filename)) == NULL)
2895 return (
PIXAA *)ERROR_PTR_1(
"stream not opened",
2896 filename, __func__, NULL);
2900 return (
PIXAA *)ERROR_PTR_1(
"paa not read", filename, __func__, NULL);
2921l_int32 n, i, version;
2928 return (
PIXAA *)ERROR_PTR(
"no libpng: can't read data", __func__, NULL);
2932 return (
PIXAA *)ERROR_PTR(
"stream not defined", __func__, NULL);
2934 if (fscanf(fp,
"\nPixaa Version %d\n", &version) != 1)
2935 return (
PIXAA *)ERROR_PTR(
"not a pixaa file", __func__, NULL);
2937 return (
PIXAA *)ERROR_PTR(
"invalid pixaa version", __func__, NULL);
2938 if (fscanf(fp,
"Number of pixa = %d\n", &n) != 1)
2939 return (
PIXAA *)ERROR_PTR(
"not a pixaa file", __func__, NULL);
2941 return (
PIXAA *)ERROR_PTR(
"num pixa ptrs < 0", __func__, NULL);
2942 if (n > MaxPixaaPtrArraySize)
2943 return (
PIXAA *)ERROR_PTR(
"too many pixa ptrs", __func__, NULL);
2944 if (n == 0) L_INFO(
"the pixaa is empty\n", __func__);
2947 return (
PIXAA *)ERROR_PTR(
"paa not made", __func__, NULL);
2948 if ((boxa = boxaReadStream(fp)) == NULL) {
2950 return (
PIXAA *)ERROR_PTR(
"boxa not made", __func__, NULL);
2952 boxaDestroy(&paa->
boxa);
2955 for (i = 0; i < n; i++) {
2956 if ((fscanf(fp,
"\n\n --------------- pixa[%d] ---------------\n",
2959 return (
PIXAA *)ERROR_PTR(
"text reading", __func__, NULL);
2963 return (
PIXAA *)ERROR_PTR(
"pixa not read", __func__, NULL);
2987 return (
PIXAA *)ERROR_PTR(
"data not defined", __func__, NULL);
2988 if ((fp = fopenReadFromMemory(data, size)) == NULL)
2989 return (
PIXAA *)ERROR_PTR(
"stream not opened", __func__, NULL);
2993 if (!paa) L_ERROR(
"paa not read\n", __func__);
3019 return ERROR_INT(
"no libpng: can't read data", __func__, 1);
3023 return ERROR_INT(
"filename not defined", __func__, 1);
3025 return ERROR_INT(
"paa not defined", __func__, 1);
3027 if ((fp = fopenWriteStream(filename,
"wb")) == NULL)
3028 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
3032 return ERROR_INT_1(
"paa not written to stream", filename, __func__, 1);
3058 return ERROR_INT(
"no libpng: can't read data", __func__, 1);
3062 return ERROR_INT(
"stream not defined", __func__, 1);
3064 return ERROR_INT(
"paa not defined", __func__, 1);
3068 fprintf(fp,
"Number of pixa = %d\n", n);
3069 boxaWriteStream(fp, paa->
boxa);
3070 for (i = 0; i < n; i++) {
3072 return ERROR_INT(
"pixa not found", __func__, 1);
3073 fprintf(fp,
"\n\n --------------- pixa[%d] ---------------\n", i);
3102 if (pdata) *pdata = NULL;
3103 if (psize) *psize = 0;
3105 return ERROR_INT(
"&data not defined", __func__, 1);
3107 return ERROR_INT(
"&size not defined", __func__, 1);
3109 return ERROR_INT(
"paa not defined", __func__, 1);
3112 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
3113 return ERROR_INT(
"stream not opened", __func__, 1);
3117 if (*psize > 0) *psize = *psize - 1;
3119 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
3121 if ((fp = fopenWriteWinTempfile()) == NULL)
3122 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
3124 if ((fp = tmpfile()) == NULL)
3125 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
3129 *pdata = l_binaryReadStream(fp, psize);
#define PIXA_VERSION_NUMBER
#define PIXAA_VERSION_NUMBER
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
BOXA * pixaaGetBoxa(PIXAA *paa, l_int32 accesstype)
pixaaGetBoxa()
PIXA * pixaCreateFromBoxa(PIX *pixs, BOXA *boxa, l_int32 start, l_int32 num, l_int32 *pcropwarn)
pixaCreateFromBoxa()
l_ok pixaaReplacePixa(PIXAA *paa, l_int32 index, PIXA *pixa)
pixaaReplacePixa()
PIXA * pixaCreateFromPix(PIX *pixs, l_int32 n, l_int32 cellw, l_int32 cellh)
pixaCreateFromPix()
PIXA * pixaReadMem(const l_uint8 *data, size_t size)
pixaReadMem()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
PIXAA * pixaaReadMem(const l_uint8 *data, size_t size)
pixaaReadMem()
static l_int32 pixaExtendArray(PIXA *pixa)
pixaExtendArray()
l_ok pixaaWriteMem(l_uint8 **pdata, size_t *psize, PIXAA *paa)
pixaaWriteMem()
l_ok pixaVerifyDepth(PIXA *pixa, l_int32 *psame, l_int32 *pmaxd)
pixaVerifyDepth()
l_ok pixaaInitFull(PIXAA *paa, PIXA *pixa)
pixaaInitFull()
l_ok pixaCountText(PIXA *pixa, l_int32 *pntext)
pixaCountText()
l_int32 pixaaIsFull(PIXAA *paa, l_int32 *pfull)
pixaaIsFull()
l_ok pixaExtendArrayToSize(PIXA *pixa, size_t size)
pixaExtendArrayToSize()
l_ok pixaRemovePix(PIXA *pixa, l_int32 index)
pixaRemovePix()
l_ok pixaaAddBox(PIXAA *paa, BOX *box, l_int32 copyflag)
pixaaAddBox()
l_ok pixaWriteStream(FILE *fp, PIXA *pixa)
pixaWriteStream()
l_ok pixaaTruncate(PIXAA *paa)
pixaaTruncate()
l_ok pixaaAddPix(PIXAA *paa, l_int32 index, PIX *pix, BOX *box, l_int32 copyflag)
pixaaAddPix()
static l_int32 pixaaExtendArray(PIXAA *paa)
pixaaExtendArray()
l_int32 pixaGetBoxaCount(PIXA *pixa)
pixaGetBoxaCount()
BOX * pixaGetBox(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetBox()
l_ok pixaSetText(PIXA *pixa, const char *text, SARRAY *sa)
pixaSetText()
PIXA * pixaReadStream(FILE *fp)
pixaReadStream()
l_ok pixaaAddPixa(PIXAA *paa, PIXA *pixa, l_int32 copyflag)
pixaaAddPixa()
l_ok pixaRemovePixAndSave(PIXA *pixa, l_int32 index, PIX **ppix, BOX **pbox)
pixaRemovePixAndSave()
PIXA * pixaRead(const char *filename)
pixaRead()
l_ok pixaGetPixDimensions(PIXA *pixa, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixaGetPixDimensions()
l_ok pixaaJoin(PIXAA *paad, PIXAA *paas, l_int32 istart, l_int32 iend)
pixaaJoin()
PIXA * pixaaGetPixa(PIXAA *paa, l_int32 index, l_int32 accesstype)
pixaaGetPixa()
l_ok pixaRemoveSelected(PIXA *pixa, NUMA *naindex)
pixaRemoveSelected()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_ok pixaReplacePix(PIXA *pixa, l_int32 index, PIX *pix, BOX *box)
pixaReplacePix()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
l_ok pixaWrite(const char *filename, PIXA *pixa)
pixaWrite()
l_ok pixaaVerifyDimensions(PIXAA *paa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaaVerifyDimensions()
PIXAA * pixaaRead(const char *filename)
pixaaRead()
l_ok pixaAddBox(PIXA *pixa, BOX *box, l_int32 copyflag)
pixaAddBox()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
void *** pixaGetLinePtrs(PIXA *pixa, l_int32 *psize)
pixaGetLinePtrs()
l_ok pixaWriteMem(l_uint8 **pdata, size_t *psize, PIXA *pixa)
pixaWriteMem()
static const size_t InitialPtrArraySize
PIXAA * pixaaCreateFromPixa(PIXA *pixa, l_int32 n, l_int32 type, l_int32 copyflag)
pixaaCreateFromPixa()
PIX * pixaaGetPix(PIXAA *paa, l_int32 index, l_int32 ipix, l_int32 accessflag)
pixaaGetPix()
l_ok pixaWriteStreamInfo(FILE *fp, PIXA *pixa)
pixaWriteStreamInfo()
l_ok pixaIsFull(PIXA *pixa, l_int32 *pfullpa, l_int32 *pfullba)
pixaIsFull()
PIX ** pixaGetPixArray(PIXA *pixa)
pixaGetPixArray()
PIXA * pixaInterleave(PIXA *pixa1, PIXA *pixa2, l_int32 copyflag)
pixaInterleave()
l_ok pixaInitFull(PIXA *pixa, PIX *pix, BOX *box)
pixaInitFull()
l_ok pixaVerifyDimensions(PIXA *pixa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaVerifyDimensions()
PIXAA * pixaaReadFromFiles(const char *dirname, const char *substr, l_int32 first, l_int32 nfiles)
pixaaReadFromFiles()
l_ok pixaaWriteStream(FILE *fp, PIXAA *paa)
pixaaWriteStream()
l_ok pixaGetBoxGeometry(PIXA *pixa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
pixaGetBoxGeometry()
l_ok pixaWriteDebug(const char *fname, PIXA *pixa)
pixaWriteDebug()
void pixaaDestroy(PIXAA **ppaa)
pixaaDestroy()
l_ok pixaaClear(PIXAA *paa)
pixaaClear()
l_ok pixaaVerifyDepth(PIXAA *paa, l_int32 *psame, l_int32 *pmaxd)
pixaaVerifyDepth()
l_int32 pixaaGetCount(PIXAA *paa, NUMA **pna)
pixaaGetCount()
l_ok pixaJoin(PIXA *pixad, PIXA *pixas, l_int32 istart, l_int32 iend)
pixaJoin()
PIXAA * pixaaCreate(l_int32 n)
pixaaCreate()
BOXA * pixaGetBoxa(PIXA *pixa, l_int32 accesstype)
pixaGetBoxa()
PIXA * pixaCopy(PIXA *pixa, l_int32 copyflag)
pixaCopy()
PIXA * pixaSplitPix(PIX *pixs, l_int32 nx, l_int32 ny, l_int32 borderwidth, l_uint32 bordercolor)
pixaSplitPix()
l_ok pixaInsertPix(PIXA *pixa, l_int32 index, PIX *pixs, BOX *box)
pixaInsertPix()
PIXA * pixaReadBoth(const char *filename)
pixaReadBoth()
l_ok pixaSetBoxa(PIXA *pixa, BOXA *boxa, l_int32 accesstype)
pixaSetBoxa()
l_ok pixaClear(PIXA *pixa)
pixaClear()
l_ok pixaaWrite(const char *filename, PIXAA *paa)
pixaaWrite()
PIXAA * pixaaReadStream(FILE *fp)
pixaaReadStream()