Leptonica  1.77.0
Image processing and image analysis suite
pixabasic.c
Go to the documentation of this file.
1 /*====================================================================*
2  - Copyright (C) 2001 Leptonica. All rights reserved.
3  -
4  - Redistribution and use in source and binary forms, with or without
5  - modification, are permitted provided that the following conditions
6  - are met:
7  - 1. Redistributions of source code must retain the above copyright
8  - notice, this list of conditions and the following disclaimer.
9  - 2. Redistributions in binary form must reproduce the above
10  - copyright notice, this list of conditions and the following
11  - disclaimer in the documentation and/or other materials
12  - provided with the distribution.
13  -
14  - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  - ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
18  - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23  - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *====================================================================*/
26 
135 #ifdef HAVE_CONFIG_H
136 #include "config_auto.h"
137 #endif /* HAVE_CONFIG_H */
138 
139 #include <string.h>
140 #include "allheaders.h"
141 
142 static const l_int32 INITIAL_PTR_ARRAYSIZE = 20; /* n'import quoi */
143 
144  /* Static functions */
145 static l_int32 pixaExtendArray(PIXA *pixa);
146 
147 
148 /*---------------------------------------------------------------------*
149  * Pixa creation, destruction, copy *
150  *---------------------------------------------------------------------*/
162 PIXA *
163 pixaCreate(l_int32 n)
164 {
165 PIXA *pixa;
166 
167  PROCNAME("pixaCreate");
168 
169  if (n <= 0)
170  n = INITIAL_PTR_ARRAYSIZE;
171 
172  pixa = (PIXA *)LEPT_CALLOC(1, sizeof(PIXA));
173  pixa->n = 0;
174  pixa->nalloc = n;
175  pixa->refcount = 1;
176  pixa->pix = (PIX **)LEPT_CALLOC(n, sizeof(PIX *));
177  pixa->boxa = boxaCreate(n);
178  if (!pixa->pix || !pixa->boxa) {
179  pixaDestroy(&pixa);
180  return (PIXA *)ERROR_PTR("pix or boxa not made", procName, NULL);
181  }
182  return pixa;
183 }
184 
185 
201 PIXA *
203  l_int32 n,
204  l_int32 cellw,
205  l_int32 cellh)
206 {
207 l_int32 w, h, d, nw, nh, i, j, index;
208 PIX *pix1, *pix2;
209 PIXA *pixa;
210 
211  PROCNAME("pixaCreateFromPix");
212 
213  if (!pixs)
214  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
215  if (n <= 0)
216  return (PIXA *)ERROR_PTR("n must be > 0", procName, NULL);
217 
218  if ((pixa = pixaCreate(n)) == NULL)
219  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
220  pixGetDimensions(pixs, &w, &h, &d);
221  if ((pix1 = pixCreate(cellw, cellh, d)) == NULL) {
222  pixaDestroy(&pixa);
223  return (PIXA *)ERROR_PTR("pix1 not made", procName, NULL);
224  }
225 
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))
233  pixaAddPix(pixa, pix2, L_INSERT);
234  else
235  pixaAddPix(pixa, pix1, L_COPY);
236  }
237  }
238 
239  pixDestroy(&pix1);
240  return pixa;
241 }
242 
243 
267 PIXA *
269  BOXA *boxa,
270  l_int32 start,
271  l_int32 num,
272  l_int32 *pcropwarn)
273 {
274 l_int32 i, n, end, w, h, wbox, hbox, cropwarn;
275 BOX *box, *boxc;
276 PIX *pixd;
277 PIXA *pixad;
278 
279  PROCNAME("pixaCreateFromBoxa");
280 
281  if (!pixs)
282  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
283  if (!boxa)
284  return (PIXA *)ERROR_PTR("boxa not defined", procName, NULL);
285  if (num < 0)
286  return (PIXA *)ERROR_PTR("num must be >= 0", procName, NULL);
287 
288  n = boxaGetCount(boxa);
289  end = (num == 0) ? n - 1 : L_MIN(start + num - 1, n - 1);
290  if ((pixad = pixaCreate(end - start + 1)) == NULL)
291  return (PIXA *)ERROR_PTR("pixad not made", procName, NULL);
292 
293  boxaGetExtent(boxa, &wbox, &hbox, NULL);
294  pixGetDimensions(pixs, &w, &h, NULL);
295  cropwarn = FALSE;
296  if (wbox > w || hbox > h)
297  cropwarn = TRUE;
298  if (pcropwarn)
299  *pcropwarn = cropwarn;
300 
301  for (i = start; i <= end; i++) {
302  box = boxaGetBox(boxa, i, L_COPY);
303  if (cropwarn) { /* if box is outside pixs, pixd is NULL */
304  pixd = pixClipRectangle(pixs, box, &boxc); /* may be NULL */
305  if (pixd) {
306  pixaAddPix(pixad, pixd, L_INSERT);
307  pixaAddBox(pixad, boxc, L_INSERT);
308  }
309  boxDestroy(&box);
310  } else {
311  pixd = pixClipRectangle(pixs, box, NULL);
312  pixaAddPix(pixad, pixd, L_INSERT);
313  pixaAddBox(pixad, box, L_INSERT);
314  }
315  }
316 
317  return pixad;
318 }
319 
320 
345 PIXA *
347  l_int32 nx,
348  l_int32 ny,
349  l_int32 borderwidth,
350  l_uint32 bordercolor)
351 {
352 l_int32 w, h, d, cellw, cellh, i, j;
353 PIX *pix1;
354 PIXA *pixa;
355 
356  PROCNAME("pixaSplitPix");
357 
358  if (!pixs)
359  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
360  if (nx <= 0 || ny <= 0)
361  return (PIXA *)ERROR_PTR("nx and ny must be > 0", procName, NULL);
362  borderwidth = L_MAX(0, borderwidth);
363 
364  if ((pixa = pixaCreate(nx * ny)) == NULL)
365  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
366  pixGetDimensions(pixs, &w, &h, &d);
367  cellw = (w + nx - 1) / nx; /* round up */
368  cellh = (h + ny - 1) / ny;
369 
370  for (i = 0; i < ny; i++) {
371  for (j = 0; j < nx; j++) {
372  if ((pix1 = pixCreate(cellw + 2 * borderwidth,
373  cellh + 2 * borderwidth, d)) == NULL) {
374  pixaDestroy(&pixa);
375  return (PIXA *)ERROR_PTR("pix1 not made", procName, NULL);
376  }
377  pixCopyColormap(pix1, pixs);
378  if (borderwidth == 0) { /* initialize full image to white */
379  if (d == 1)
380  pixClearAll(pix1);
381  else
382  pixSetAll(pix1);
383  } else {
384  pixSetAllArbitrary(pix1, bordercolor);
385  }
386  pixRasterop(pix1, borderwidth, borderwidth, cellw, cellh,
387  PIX_SRC, pixs, j * cellw, i * cellh);
388  pixaAddPix(pixa, pix1, L_INSERT);
389  }
390  }
391 
392  return pixa;
393 }
394 
395 
407 void
409 {
410 l_int32 i;
411 PIXA *pixa;
412 
413  PROCNAME("pixaDestroy");
414 
415  if (ppixa == NULL) {
416  L_WARNING("ptr address is NULL!\n", procName);
417  return;
418  }
419 
420  if ((pixa = *ppixa) == NULL)
421  return;
422 
423  /* Decrement the refcount. If it is 0, destroy the pixa. */
424  pixaChangeRefcount(pixa, -1);
425  if (pixa->refcount <= 0) {
426  for (i = 0; i < pixa->n; i++)
427  pixDestroy(&pixa->pix[i]);
428  LEPT_FREE(pixa->pix);
429  boxaDestroy(&pixa->boxa);
430  LEPT_FREE(pixa);
431  }
432 
433  *ppixa = NULL;
434  return;
435 }
436 
437 
449 PIXA *
451  l_int32 copyflag)
452 {
453 l_int32 i, nb;
454 BOX *boxc;
455 PIX *pixc;
456 PIXA *pixac;
457 
458  PROCNAME("pixaCopy");
459 
460  if (!pixa)
461  return (PIXA *)ERROR_PTR("pixa not defined", procName, NULL);
462 
463  if (copyflag == L_CLONE) {
464  pixaChangeRefcount(pixa, 1);
465  return pixa;
466  }
467 
468  if (copyflag != L_COPY && copyflag != L_COPY_CLONE)
469  return (PIXA *)ERROR_PTR("invalid copyflag", procName, NULL);
470 
471  if ((pixac = pixaCreate(pixa->n)) == NULL)
472  return (PIXA *)ERROR_PTR("pixac not made", procName, NULL);
473  nb = pixaGetBoxaCount(pixa);
474  for (i = 0; i < pixa->n; i++) {
475  if (copyflag == L_COPY) {
476  pixc = pixaGetPix(pixa, i, L_COPY);
477  if (i < nb) boxc = pixaGetBox(pixa, i, L_COPY);
478  } else { /* copy-clone */
479  pixc = pixaGetPix(pixa, i, L_CLONE);
480  if (i < nb) boxc = pixaGetBox(pixa, i, L_CLONE);
481  }
482  pixaAddPix(pixac, pixc, L_INSERT);
483  if (i < nb) pixaAddBox(pixac, boxc, L_INSERT);
484  }
485 
486  return pixac;
487 }
488 
489 
490 
491 /*---------------------------------------------------------------------*
492  * Pixa addition *
493  *---------------------------------------------------------------------*/
502 l_ok
504  PIX *pix,
505  l_int32 copyflag)
506 {
507 l_int32 n;
508 PIX *pixc;
509 
510  PROCNAME("pixaAddPix");
511 
512  if (!pixa)
513  return ERROR_INT("pixa not defined", procName, 1);
514  if (!pix)
515  return ERROR_INT("pix not defined", procName, 1);
516 
517  if (copyflag == L_INSERT)
518  pixc = pix;
519  else if (copyflag == L_COPY)
520  pixc = pixCopy(NULL, pix);
521  else if (copyflag == L_CLONE)
522  pixc = pixClone(pix);
523  else
524  return ERROR_INT("invalid copyflag", procName, 1);
525  if (!pixc)
526  return ERROR_INT("pixc not made", procName, 1);
527 
528  n = pixaGetCount(pixa);
529  if (n >= pixa->nalloc)
530  pixaExtendArray(pixa);
531  pixa->pix[n] = pixc;
532  pixa->n++;
533 
534  return 0;
535 }
536 
537 
546 l_ok
548  BOX *box,
549  l_int32 copyflag)
550 {
551  PROCNAME("pixaAddBox");
552 
553  if (!pixa)
554  return ERROR_INT("pixa not defined", procName, 1);
555  if (!box)
556  return ERROR_INT("box not defined", procName, 1);
557  if (copyflag != L_INSERT && copyflag != L_COPY && copyflag != L_CLONE)
558  return ERROR_INT("invalid copyflag", procName, 1);
559 
560  boxaAddBox(pixa->boxa, box, copyflag);
561  return 0;
562 }
563 
564 
576 static l_int32
578 {
579  PROCNAME("pixaExtendArray");
580 
581  if (!pixa)
582  return ERROR_INT("pixa not defined", procName, 1);
583 
584  return pixaExtendArrayToSize(pixa, 2 * pixa->nalloc);
585 }
586 
587 
601 l_ok
603  l_int32 size)
604 {
605  PROCNAME("pixaExtendArrayToSize");
606 
607  if (!pixa)
608  return ERROR_INT("pixa not defined", procName, 1);
609 
610  if (size > pixa->nalloc) {
611  if ((pixa->pix = (PIX **)reallocNew((void **)&pixa->pix,
612  sizeof(PIX *) * pixa->nalloc,
613  size * sizeof(PIX *))) == NULL)
614  return ERROR_INT("new ptr array not returned", procName, 1);
615  pixa->nalloc = size;
616  }
617  return boxaExtendArrayToSize(pixa->boxa, size);
618 }
619 
620 
621 /*---------------------------------------------------------------------*
622  * Pixa accessors *
623  *---------------------------------------------------------------------*/
630 l_int32
632 {
633  PROCNAME("pixaGetCount");
634 
635  if (!pixa)
636  return ERROR_INT("pixa not defined", procName, 0);
637 
638  return pixa->n;
639 }
640 
641 
649 l_ok
651  l_int32 delta)
652 {
653  PROCNAME("pixaChangeRefcount");
654 
655  if (!pixa)
656  return ERROR_INT("pixa not defined", procName, 1);
657 
658  pixa->refcount += delta;
659  return 0;
660 }
661 
662 
671 PIX *
673  l_int32 index,
674  l_int32 accesstype)
675 {
676 PIX *pix;
677 
678  PROCNAME("pixaGetPix");
679 
680  if (!pixa)
681  return (PIX *)ERROR_PTR("pixa not defined", procName, NULL);
682  if (index < 0 || index >= pixa->n)
683  return (PIX *)ERROR_PTR("index not valid", procName, NULL);
684  if ((pix = pixa->pix[index]) == NULL) {
685  L_ERROR("no pix at pixa[%d]\n", procName, index);
686  return (PIX *)ERROR_PTR("pix not found!", procName, NULL);
687  }
688 
689  if (accesstype == L_COPY)
690  return pixCopy(NULL, pix);
691  else if (accesstype == L_CLONE)
692  return pixClone(pix);
693  else
694  return (PIX *)ERROR_PTR("invalid accesstype", procName, NULL);
695 }
696 
697 
706 l_ok
708  l_int32 index,
709  l_int32 *pw,
710  l_int32 *ph,
711  l_int32 *pd)
712 {
713 PIX *pix;
714 
715  PROCNAME("pixaGetPixDimensions");
716 
717  if (pw) *pw = 0;
718  if (ph) *ph = 0;
719  if (pd) *pd = 0;
720  if (!pixa)
721  return ERROR_INT("pixa not defined", procName, 1);
722  if (index < 0 || index >= pixa->n)
723  return ERROR_INT("index not valid", procName, 1);
724 
725  if ((pix = pixaGetPix(pixa, index, L_CLONE)) == NULL)
726  return ERROR_INT("pix not found!", procName, 1);
727  pixGetDimensions(pix, pw, ph, pd);
728  pixDestroy(&pix);
729  return 0;
730 }
731 
732 
740 BOXA *
742  l_int32 accesstype)
743 {
744  PROCNAME("pixaGetBoxa");
745 
746  if (!pixa)
747  return (BOXA *)ERROR_PTR("pixa not defined", procName, NULL);
748  if (!pixa->boxa)
749  return (BOXA *)ERROR_PTR("boxa not defined", procName, NULL);
750  if (accesstype != L_COPY && accesstype != L_CLONE &&
751  accesstype != L_COPY_CLONE)
752  return (BOXA *)ERROR_PTR("invalid accesstype", procName, NULL);
753 
754  return boxaCopy(pixa->boxa, accesstype);
755 }
756 
757 
764 l_int32
766 {
767  PROCNAME("pixaGetBoxaCount");
768 
769  if (!pixa)
770  return ERROR_INT("pixa not defined", procName, 0);
771 
772  return boxaGetCount(pixa->boxa);
773 }
774 
775 
796 BOX *
798  l_int32 index,
799  l_int32 accesstype)
800 {
801 BOX *box;
802 
803  PROCNAME("pixaGetBox");
804 
805  if (!pixa)
806  return (BOX *)ERROR_PTR("pixa not defined", procName, NULL);
807  if (!pixa->boxa)
808  return (BOX *)ERROR_PTR("boxa not defined", procName, NULL);
809  if (index < 0 || index >= pixa->boxa->n)
810  return (BOX *)ERROR_PTR("index not valid", procName, NULL);
811  if (accesstype != L_COPY && accesstype != L_CLONE)
812  return (BOX *)ERROR_PTR("invalid accesstype", procName, NULL);
813 
814  box = pixa->boxa->box[index];
815  if (box) {
816  if (accesstype == L_COPY)
817  return boxCopy(box);
818  else /* accesstype == L_CLONE */
819  return boxClone(box);
820  } else {
821  return NULL;
822  }
823 }
824 
825 
834 l_ok
836  l_int32 index,
837  l_int32 *px,
838  l_int32 *py,
839  l_int32 *pw,
840  l_int32 *ph)
841 {
842 BOX *box;
843 
844  PROCNAME("pixaGetBoxGeometry");
845 
846  if (px) *px = 0;
847  if (py) *py = 0;
848  if (pw) *pw = 0;
849  if (ph) *ph = 0;
850  if (!pixa)
851  return ERROR_INT("pixa not defined", procName, 1);
852  if (index < 0 || index >= pixa->n)
853  return ERROR_INT("index not valid", procName, 1);
854 
855  if ((box = pixaGetBox(pixa, index, L_CLONE)) == NULL)
856  return ERROR_INT("box not found!", procName, 1);
857  boxGetGeometry(box, px, py, pw, ph);
858  boxDestroy(&box);
859  return 0;
860 }
861 
862 
876 l_ok
878  BOXA *boxa,
879  l_int32 accesstype)
880 {
881  PROCNAME("pixaSetBoxa");
882 
883  if (!pixa)
884  return ERROR_INT("pixa not defined", procName, 1);
885  if (!boxa)
886  return ERROR_INT("boxa not defined", procName, 1);
887  if (accesstype != L_INSERT && accesstype != L_COPY &&
888  accesstype != L_CLONE)
889  return ERROR_INT("invalid access type", procName, 1);
890 
891  boxaDestroy(&pixa->boxa);
892  if (accesstype == L_INSERT)
893  pixa->boxa = boxa;
894  else
895  pixa->boxa = boxaCopy(boxa, accesstype);
896 
897  return 0;
898 }
899 
900 
915 PIX **
917 {
918  PROCNAME("pixaGetPixArray");
919 
920  if (!pixa)
921  return (PIX **)ERROR_PTR("pixa not defined", procName, NULL);
922 
923  return pixa->pix;
924 }
925 
926 
940 l_ok
942  l_int32 *psame,
943  l_int32 *pmaxd)
944 {
945 l_int32 i, n, d, maxd, same;
946 
947  PROCNAME("pixaVerifyDepth");
948 
949  if (pmaxd) *pmaxd = 0;
950  if (!psame)
951  return ERROR_INT("psame not defined", procName, 1);
952  if (!pixa)
953  return ERROR_INT("pixa not defined", procName, 1);
954  if ((n = pixaGetCount(pixa)) == 0)
955  return ERROR_INT("no pix in pixa", procName, 1);
956 
957  same = 1;
958  pixaGetPixDimensions(pixa, 0, NULL, NULL, &maxd);
959  for (i = 1; i < n; i++) {
960  if (pixaGetPixDimensions(pixa, i, NULL, NULL, &d))
961  return ERROR_INT("pix depth not found", procName, 1);
962  maxd = L_MAX(maxd, d);
963  if (d != maxd)
964  same = 0;
965  }
966  *psame = same;
967  if (pmaxd) *pmaxd = maxd;
968  return 0;
969 }
970 
971 
986 l_ok
988  l_int32 *psame,
989  l_int32 *pmaxw,
990  l_int32 *pmaxh)
991 {
992 l_int32 i, n, w, h, maxw, maxh, same;
993 
994  PROCNAME("pixaVerifyDimensions");
995 
996  if (pmaxw) *pmaxw = 0;
997  if (pmaxh) *pmaxh = 0;
998  if (!psame)
999  return ERROR_INT("psame not defined", procName, 1);
1000  *psame = 0;
1001  if (!pixa)
1002  return ERROR_INT("pixa not defined", procName, 1);
1003  if ((n = pixaGetCount(pixa)) == 0)
1004  return ERROR_INT("no pix in pixa", procName, 1);
1005 
1006  same = 1;
1007  pixaGetPixDimensions(pixa, 0, &maxw, &maxh, NULL);
1008  for (i = 1; i < n; i++) {
1009  if (pixaGetPixDimensions(pixa, i, &w, &h, NULL))
1010  return ERROR_INT("pix dimensions not found", procName, 1);
1011  maxw = L_MAX(maxw, w);
1012  maxh = L_MAX(maxh, h);
1013  if (w != maxw || h != maxh)
1014  same = 0;
1015  }
1016  *psame = same;
1017  if (pmaxw) *pmaxw = maxw;
1018  if (pmaxh) *pmaxh = maxh;
1019  return 0;
1020 }
1021 
1022 
1037 l_ok
1039  l_int32 *pfullpa,
1040  l_int32 *pfullba)
1041 {
1042 l_int32 i, n, full;
1043 BOXA *boxa;
1044 PIX *pix;
1045 
1046  PROCNAME("pixaIsFull");
1047 
1048  if (pfullpa) *pfullpa = 0;
1049  if (pfullba) *pfullba = 0;
1050  if (!pixa)
1051  return ERROR_INT("pixa not defined", procName, 1);
1052 
1053  n = pixaGetCount(pixa);
1054  if (pfullpa) {
1055  full = 1;
1056  for (i = 0; i < n; i++) {
1057  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL) {
1058  full = 0;
1059  break;
1060  }
1061  pixDestroy(&pix);
1062  }
1063  *pfullpa = full;
1064  }
1065  if (pfullba) {
1066  boxa = pixaGetBoxa(pixa, L_CLONE);
1067  boxaIsFull(boxa, pfullba);
1068  boxaDestroy(&boxa);
1069  }
1070  return 0;
1071 }
1072 
1073 
1087 l_ok
1089  l_int32 *pntext)
1090 {
1091 char *text;
1092 l_int32 i, n;
1093 PIX *pix;
1094 
1095  PROCNAME("pixaCountText");
1096 
1097  if (!pntext)
1098  return ERROR_INT("&ntext not defined", procName, 1);
1099  *pntext = 0;
1100  if (!pixa)
1101  return ERROR_INT("pixa not defined", procName, 1);
1102 
1103  n = pixaGetCount(pixa);
1104  for (i = 0; i < n; i++) {
1105  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1106  continue;
1107  text = pixGetText(pix);
1108  if (text && strlen(text) > 0)
1109  (*pntext)++;
1110  pixDestroy(&pix);
1111  }
1112 
1113  return 0;
1114 }
1115 
1116 
1133 l_ok
1135  const char *text,
1136  SARRAY *sa)
1137 {
1138 char *str;
1139 l_int32 i, n;
1140 PIX *pix;
1141 
1142  PROCNAME("pixaSetText");
1143 
1144  if (!pixa)
1145  return ERROR_INT("pixa not defined", procName, 1);
1146 
1147  n = pixaGetCount(pixa);
1148  if (sa && (sarrayGetCount(sa) != n))
1149  return ERROR_INT("pixa and sa sizes differ", procName, 1);
1150 
1151  if (!sa) {
1152  for (i = 0; i < n; i++) {
1153  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1154  continue;
1155  pixSetText(pix, text);
1156  pixDestroy(&pix);
1157  }
1158  return 0;
1159  }
1160 
1161  for (i = 0; i < n; i++) {
1162  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1163  continue;
1164  str = sarrayGetString(sa, i, L_NOCOPY);
1165  pixSetText(pix, str);
1166  pixDestroy(&pix);
1167  }
1168 
1169  return 0;
1170 }
1171 
1172 
1192 void ***
1194  l_int32 *psize)
1195 {
1196 l_int32 i, n, same;
1197 void **lineptrs;
1198 void ***lineset;
1199 PIX *pix;
1200 
1201  PROCNAME("pixaGetLinePtrs");
1202 
1203  if (psize) *psize = 0;
1204  if (!pixa)
1205  return (void ***)ERROR_PTR("pixa not defined", procName, NULL);
1206  pixaVerifyDepth(pixa, &same, NULL);
1207  if (!same)
1208  return (void ***)ERROR_PTR("pixa not all same depth", procName, NULL);
1209  n = pixaGetCount(pixa);
1210  if (psize) *psize = n;
1211  if ((lineset = (void ***)LEPT_CALLOC(n, sizeof(void **))) == NULL)
1212  return (void ***)ERROR_PTR("lineset not made", procName, NULL);
1213  for (i = 0; i < n; i++) {
1214  pix = pixaGetPix(pixa, i, L_CLONE);
1215  lineptrs = pixGetLinePtrs(pix, NULL);
1216  lineset[i] = lineptrs;
1217  pixDestroy(&pix);
1218  }
1219 
1220  return lineset;
1221 }
1222 
1223 
1224 /*---------------------------------------------------------------------*
1225  * Pixa output info *
1226  *---------------------------------------------------------------------*/
1240 l_ok
1242  PIXA *pixa)
1243 {
1244 char *text;
1245 l_int32 i, n, w, h, d, spp, count, hastext;
1246 PIX *pix;
1247 PIXCMAP *cmap;
1248 
1249  PROCNAME("pixaWriteStreamInfo");
1250 
1251  if (!fp)
1252  return ERROR_INT("stream not defined", procName, 1);
1253  if (!pixa)
1254  return ERROR_INT("pixa not defined", procName, 1);
1255 
1256  n = pixaGetCount(pixa);
1257  for (i = 0; i < n; i++) {
1258  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL) {
1259  fprintf(fp, "%d: no pix at this index\n", i);
1260  continue;
1261  }
1262  pixGetDimensions(pix, &w, &h, &d);
1263  spp = pixGetSpp(pix);
1264  text = pixGetText(pix);
1265  hastext = (text && strlen(text) > 0);
1266  if ((cmap = pixGetColormap(pix)) != NULL)
1267  count = pixcmapGetCount(cmap);
1268  fprintf(fp, "Pix %d: w = %d, h = %d, d = %d, spp = %d",
1269  i, w, h, d, spp);
1270  if (cmap) fprintf(fp, ", cmap(%d colors)", count);
1271  if (hastext) fprintf(fp, ", text = %s", text);
1272  fprintf(fp, "\n");
1273  pixDestroy(&pix);
1274  }
1275 
1276  return 0;
1277 }
1278 
1279 
1280 /*---------------------------------------------------------------------*
1281  * Pixa array modifiers *
1282  *---------------------------------------------------------------------*/
1298 l_ok
1300  l_int32 index,
1301  PIX *pix,
1302  BOX *box)
1303 {
1304 BOXA *boxa;
1305 
1306  PROCNAME("pixaReplacePix");
1307 
1308  if (!pixa)
1309  return ERROR_INT("pixa not defined", procName, 1);
1310  if (index < 0 || index >= pixa->n)
1311  return ERROR_INT("index not valid", procName, 1);
1312  if (!pix)
1313  return ERROR_INT("pix not defined", procName, 1);
1314 
1315  pixDestroy(&(pixa->pix[index]));
1316  pixa->pix[index] = pix;
1317 
1318  if (box) {
1319  boxa = pixa->boxa;
1320  if (index > boxa->n)
1321  return ERROR_INT("boxa index not valid", procName, 1);
1322  boxaReplaceBox(boxa, index, box);
1323  }
1324 
1325  return 0;
1326 }
1327 
1328 
1348 l_ok
1350  l_int32 index,
1351  PIX *pixs,
1352  BOX *box)
1353 {
1354 l_int32 i, n;
1355 
1356  PROCNAME("pixaInsertPix");
1357 
1358  if (!pixa)
1359  return ERROR_INT("pixa not defined", procName, 1);
1360  n = pixaGetCount(pixa);
1361  if (index < 0 || index > n)
1362  return ERROR_INT("index not in {0...n}", procName, 1);
1363  if (!pixs)
1364  return ERROR_INT("pixs not defined", procName, 1);
1365 
1366  if (n >= pixa->nalloc) { /* extend both ptr arrays */
1367  pixaExtendArray(pixa);
1368  boxaExtendArray(pixa->boxa);
1369  }
1370  pixa->n++;
1371  for (i = n; i > index; i--)
1372  pixa->pix[i] = pixa->pix[i - 1];
1373  pixa->pix[index] = pixs;
1374 
1375  /* Optionally, insert the box */
1376  if (box)
1377  boxaInsertBox(pixa->boxa, index, box);
1378 
1379  return 0;
1380 }
1381 
1382 
1398 l_ok
1400  l_int32 index)
1401 {
1402 l_int32 i, n, nbox;
1403 BOXA *boxa;
1404 PIX **array;
1405 
1406  PROCNAME("pixaRemovePix");
1407 
1408  if (!pixa)
1409  return ERROR_INT("pixa not defined", procName, 1);
1410  n = pixaGetCount(pixa);
1411  if (index < 0 || index >= n)
1412  return ERROR_INT("index not in {0...n - 1}", procName, 1);
1413 
1414  /* Remove the pix */
1415  array = pixa->pix;
1416  pixDestroy(&array[index]);
1417  for (i = index + 1; i < n; i++)
1418  array[i - 1] = array[i];
1419  array[n - 1] = NULL;
1420  pixa->n--;
1421 
1422  /* Remove the box if it exists */
1423  boxa = pixa->boxa;
1424  nbox = boxaGetCount(boxa);
1425  if (index < nbox)
1426  boxaRemoveBox(boxa, index);
1427 
1428  return 0;
1429 }
1430 
1431 
1450 l_ok
1452  l_int32 index,
1453  PIX **ppix,
1454  BOX **pbox)
1455 {
1456 l_int32 i, n, nbox;
1457 BOXA *boxa;
1458 PIX **array;
1459 
1460  PROCNAME("pixaRemovePixAndSave");
1461 
1462  if (ppix) *ppix = NULL;
1463  if (pbox) *pbox = NULL;
1464  if (!pixa)
1465  return ERROR_INT("pixa not defined", procName, 1);
1466  n = pixaGetCount(pixa);
1467  if (index < 0 || index >= n)
1468  return ERROR_INT("index not in {0...n - 1}", procName, 1);
1469 
1470  /* Remove the pix */
1471  array = pixa->pix;
1472  if (ppix)
1473  *ppix = pixaGetPix(pixa, index, L_CLONE);
1474  pixDestroy(&array[index]);
1475  for (i = index + 1; i < n; i++)
1476  array[i - 1] = array[i];
1477  array[n - 1] = NULL;
1478  pixa->n--;
1479 
1480  /* Remove the box if it exists */
1481  boxa = pixa->boxa;
1482  nbox = boxaGetCount(boxa);
1483  if (index < nbox)
1484  boxaRemoveBoxAndSave(boxa, index, pbox);
1485 
1486  return 0;
1487 }
1488 
1489 
1502 l_ok
1504  NUMA *naindex)
1505 {
1506 l_int32 i, n, npix, index;
1507 NUMA *na1;
1508 
1509  PROCNAME("pixaRemoveSelected");
1510 
1511  if (!pixa)
1512  return ERROR_INT("pixa not defined", procName, 1);
1513  if (!naindex)
1514  return ERROR_INT("naindex not defined", procName, 1);
1515  if ((n = numaGetCount(naindex)) == 0)
1516  return ERROR_INT("naindex is empty", procName, 1);
1517  npix = pixaGetCount(pixa);
1518 
1519  /* Remove from highest indices first */
1520  na1 = numaSort(NULL, naindex, L_SORT_DECREASING);
1521  for (i = 0; i < n; i++) {
1522  numaGetIValue(na1, i, &index);
1523  pixaRemovePix(pixa, index);
1524  }
1525  numaDestroy(&na1);
1526  return 0;
1527 }
1528 
1529 
1565 l_ok
1567  PIX *pix,
1568  BOX *box)
1569 {
1570 l_int32 i, n;
1571 PIX *pix1;
1572 
1573  PROCNAME("pixaInitFull");
1574 
1575  if (!pixa)
1576  return ERROR_INT("pixa not defined", procName, 1);
1577 
1578  n = pixa->nalloc;
1579  pixa->n = n;
1580  for (i = 0; i < n; i++) {
1581  if (pix)
1582  pix1 = pixCopy(NULL, pix);
1583  else
1584  pix1 = pixCreate(1, 1, 1);
1585  pixaReplacePix(pixa, i, pix1, NULL);
1586  }
1587  if (box)
1588  boxaInitFull(pixa->boxa, box);
1589 
1590  return 0;
1591 }
1592 
1593 
1607 l_ok
1609 {
1610 l_int32 i, n;
1611 
1612  PROCNAME("pixaClear");
1613 
1614  if (!pixa)
1615  return ERROR_INT("pixa not defined", procName, 1);
1616 
1617  n = pixaGetCount(pixa);
1618  for (i = 0; i < n; i++)
1619  pixDestroy(&pixa->pix[i]);
1620  pixa->n = 0;
1621  return boxaClear(pixa->boxa);
1622 }
1623 
1624 
1625 /*---------------------------------------------------------------------*
1626  * Pixa and Pixaa combination *
1627  *---------------------------------------------------------------------*/
1645 l_ok
1647  PIXA *pixas,
1648  l_int32 istart,
1649  l_int32 iend)
1650 {
1651 l_int32 i, n, nb;
1652 BOXA *boxas, *boxad;
1653 PIX *pix;
1654 
1655  PROCNAME("pixaJoin");
1656 
1657  if (!pixad)
1658  return ERROR_INT("pixad not defined", procName, 1);
1659  if (!pixas || ((n = pixaGetCount(pixas)) == 0))
1660  return 0;
1661 
1662  if (istart < 0)
1663  istart = 0;
1664  if (iend < 0 || iend >= n)
1665  iend = n - 1;
1666  if (istart > iend)
1667  return ERROR_INT("istart > iend; nothing to add", procName, 1);
1668 
1669  for (i = istart; i <= iend; i++) {
1670  pix = pixaGetPix(pixas, i, L_CLONE);
1671  pixaAddPix(pixad, pix, L_INSERT);
1672  }
1673 
1674  boxas = pixaGetBoxa(pixas, L_CLONE);
1675  boxad = pixaGetBoxa(pixad, L_CLONE);
1676  nb = pixaGetBoxaCount(pixas);
1677  iend = L_MIN(iend, nb - 1);
1678  boxaJoin(boxad, boxas, istart, iend);
1679  boxaDestroy(&boxas); /* just the clones */
1680  boxaDestroy(&boxad);
1681  return 0;
1682 }
1683 
1684 
1701 PIXA *
1703  PIXA *pixa2,
1704  l_int32 copyflag)
1705 {
1706 l_int32 i, n1, n2, n, nb1, nb2;
1707 BOX *box;
1708 PIX *pix;
1709 PIXA *pixad;
1710 
1711  PROCNAME("pixaInterleave");
1712 
1713  if (!pixa1)
1714  return (PIXA *)ERROR_PTR("pixa1 not defined", procName, NULL);
1715  if (!pixa2)
1716  return (PIXA *)ERROR_PTR("pixa2 not defined", procName, NULL);
1717  if (copyflag != L_COPY && copyflag != L_CLONE)
1718  return (PIXA *)ERROR_PTR("invalid copyflag", procName, NULL);
1719  n1 = pixaGetCount(pixa1);
1720  n2 = pixaGetCount(pixa2);
1721  n = L_MIN(n1, n2);
1722  if (n == 0)
1723  return (PIXA *)ERROR_PTR("at least one input pixa is empty",
1724  procName, NULL);
1725  if (n1 != n2)
1726  L_WARNING("counts differ: %d != %d\n", procName, n1, n2);
1727 
1728  pixad = pixaCreate(2 * n);
1729  nb1 = pixaGetBoxaCount(pixa1);
1730  nb2 = pixaGetBoxaCount(pixa2);
1731  for (i = 0; i < n; i++) {
1732  pix = pixaGetPix(pixa1, i, copyflag);
1733  pixaAddPix(pixad, pix, L_INSERT);
1734  if (i < nb1) {
1735  box = pixaGetBox(pixa1, i, L_COPY);
1736  pixaAddBox(pixad, box, L_INSERT);
1737  }
1738  pix = pixaGetPix(pixa2, i, copyflag);
1739  pixaAddPix(pixad, pix, L_INSERT);
1740  if (i < nb2) {
1741  box = pixaGetBox(pixa2, i, L_COPY);
1742  pixaAddBox(pixad, box, L_INSERT);
1743  }
1744  }
1745 
1746  return pixad;
1747 }
1748 
1749 
1766 l_ok
1768  PIXAA *paas,
1769  l_int32 istart,
1770  l_int32 iend)
1771 {
1772 l_int32 i, n;
1773 PIXA *pixa;
1774 
1775  PROCNAME("pixaaJoin");
1776 
1777  if (!paad)
1778  return ERROR_INT("pixaad not defined", procName, 1);
1779  if (!paas)
1780  return 0;
1781 
1782  if (istart < 0)
1783  istart = 0;
1784  n = pixaaGetCount(paas, NULL);
1785  if (iend < 0 || iend >= n)
1786  iend = n - 1;
1787  if (istart > iend)
1788  return ERROR_INT("istart > iend; nothing to add", procName, 1);
1789 
1790  for (i = istart; i <= iend; i++) {
1791  pixa = pixaaGetPixa(paas, i, L_CLONE);
1792  pixaaAddPixa(paad, pixa, L_INSERT);
1793  }
1794 
1795  return 0;
1796 }
1797 
1798 
1799 /*---------------------------------------------------------------------*
1800  * Pixaa creation and destruction *
1801  *---------------------------------------------------------------------*/
1824 PIXAA *
1825 pixaaCreate(l_int32 n)
1826 {
1827 PIXAA *paa;
1828 
1829  PROCNAME("pixaaCreate");
1830 
1831  if (n <= 0)
1832  n = INITIAL_PTR_ARRAYSIZE;
1833 
1834  if ((paa = (PIXAA *)LEPT_CALLOC(1, sizeof(PIXAA))) == NULL)
1835  return (PIXAA *)ERROR_PTR("paa not made", procName, NULL);
1836  paa->n = 0;
1837  paa->nalloc = n;
1838 
1839  if ((paa->pixa = (PIXA **)LEPT_CALLOC(n, sizeof(PIXA *))) == NULL) {
1840  pixaaDestroy(&paa);
1841  return (PIXAA *)ERROR_PTR("pixa ptrs not made", procName, NULL);
1842  }
1843  paa->boxa = boxaCreate(n);
1844 
1845  return paa;
1846 }
1847 
1848 
1869 PIXAA *
1871  l_int32 n,
1872  l_int32 type,
1873  l_int32 copyflag)
1874 {
1875 l_int32 count, i, j, npixa;
1876 PIX *pix;
1877 PIXA *pixat;
1878 PIXAA *paa;
1879 
1880  PROCNAME("pixaaCreateFromPixa");
1881 
1882  if (!pixa)
1883  return (PIXAA *)ERROR_PTR("pixa not defined", procName, NULL);
1884  count = pixaGetCount(pixa);
1885  if (count == 0)
1886  return (PIXAA *)ERROR_PTR("no pix in pixa", procName, NULL);
1887  if (n <= 0)
1888  return (PIXAA *)ERROR_PTR("n must be > 0", procName, NULL);
1889  if (type != L_CHOOSE_CONSECUTIVE && type != L_CHOOSE_SKIP_BY)
1890  return (PIXAA *)ERROR_PTR("invalid type", procName, NULL);
1891  if (copyflag != L_CLONE && copyflag != L_COPY)
1892  return (PIXAA *)ERROR_PTR("invalid copyflag", procName, NULL);
1893 
1894  if (type == L_CHOOSE_CONSECUTIVE)
1895  npixa = (count + n - 1) / n;
1896  else /* L_CHOOSE_SKIP_BY */
1897  npixa = L_MIN(n, count);
1898  paa = pixaaCreate(npixa);
1899  if (type == L_CHOOSE_CONSECUTIVE) {
1900  for (i = 0; i < count; i++) {
1901  if (i % n == 0)
1902  pixat = pixaCreate(n);
1903  pix = pixaGetPix(pixa, i, copyflag);
1904  pixaAddPix(pixat, pix, L_INSERT);
1905  if (i % n == n - 1)
1906  pixaaAddPixa(paa, pixat, L_INSERT);
1907  }
1908  if (i % n != 0)
1909  pixaaAddPixa(paa, pixat, L_INSERT);
1910  } else { /* L_CHOOSE_SKIP_BY */
1911  for (i = 0; i < npixa; i++) {
1912  pixat = pixaCreate(count / npixa + 1);
1913  for (j = i; j < count; j += n) {
1914  pix = pixaGetPix(pixa, j, copyflag);
1915  pixaAddPix(pixat, pix, L_INSERT);
1916  }
1917  pixaaAddPixa(paa, pixat, L_INSERT);
1918  }
1919  }
1920 
1921  return paa;
1922 }
1923 
1924 
1931 void
1933 {
1934 l_int32 i;
1935 PIXAA *paa;
1936 
1937  PROCNAME("pixaaDestroy");
1938 
1939  if (ppaa == NULL) {
1940  L_WARNING("ptr address is NULL!\n", procName);
1941  return;
1942  }
1943 
1944  if ((paa = *ppaa) == NULL)
1945  return;
1946 
1947  for (i = 0; i < paa->n; i++)
1948  pixaDestroy(&paa->pixa[i]);
1949  LEPT_FREE(paa->pixa);
1950  boxaDestroy(&paa->boxa);
1951 
1952  LEPT_FREE(paa);
1953  *ppaa = NULL;
1954 
1955  return;
1956 }
1957 
1958 
1959 /*---------------------------------------------------------------------*
1960  * Pixaa addition *
1961  *---------------------------------------------------------------------*/
1975 l_ok
1977  PIXA *pixa,
1978  l_int32 copyflag)
1979 {
1980 l_int32 n;
1981 PIXA *pixac;
1982 
1983  PROCNAME("pixaaAddPixa");
1984 
1985  if (!paa)
1986  return ERROR_INT("paa not defined", procName, 1);
1987  if (!pixa)
1988  return ERROR_INT("pixa not defined", procName, 1);
1989  if (copyflag != L_INSERT && copyflag != L_COPY &&
1990  copyflag != L_CLONE && copyflag != L_COPY_CLONE)
1991  return ERROR_INT("invalid copyflag", procName, 1);
1992 
1993  if (copyflag == L_INSERT) {
1994  pixac = pixa;
1995  } else {
1996  if ((pixac = pixaCopy(pixa, copyflag)) == NULL)
1997  return ERROR_INT("pixac not made", procName, 1);
1998  }
1999 
2000  n = pixaaGetCount(paa, NULL);
2001  if (n >= paa->nalloc)
2002  pixaaExtendArray(paa);
2003  paa->pixa[n] = pixac;
2004  paa->n++;
2005 
2006  return 0;
2007 }
2008 
2009 
2016 l_ok
2018 {
2019  PROCNAME("pixaaExtendArray");
2020 
2021  if (!paa)
2022  return ERROR_INT("paa not defined", procName, 1);
2023 
2024  if ((paa->pixa = (PIXA **)reallocNew((void **)&paa->pixa,
2025  sizeof(PIXA *) * paa->nalloc,
2026  2 * sizeof(PIXA *) * paa->nalloc)) == NULL)
2027  return ERROR_INT("new ptr array not returned", procName, 1);
2028 
2029  paa->nalloc = 2 * paa->nalloc;
2030  return 0;
2031 }
2032 
2033 
2044 l_ok
2046  l_int32 index,
2047  PIX *pix,
2048  BOX *box,
2049  l_int32 copyflag)
2050 {
2051 PIXA *pixa;
2052 
2053  PROCNAME("pixaaAddPix");
2054 
2055  if (!paa)
2056  return ERROR_INT("paa not defined", procName, 1);
2057  if (!pix)
2058  return ERROR_INT("pix not defined", procName, 1);
2059 
2060  if ((pixa = pixaaGetPixa(paa, index, L_CLONE)) == NULL)
2061  return ERROR_INT("pixa not found", procName, 1);
2062  pixaAddPix(pixa, pix, copyflag);
2063  if (box) pixaAddBox(pixa, box, copyflag);
2064  pixaDestroy(&pixa);
2065  return 0;
2066 }
2067 
2068 
2083 l_ok
2085  BOX *box,
2086  l_int32 copyflag)
2087 {
2088  PROCNAME("pixaaAddBox");
2089 
2090  if (!paa)
2091  return ERROR_INT("paa not defined", procName, 1);
2092  if (!box)
2093  return ERROR_INT("box not defined", procName, 1);
2094  if (copyflag != L_INSERT && copyflag != L_COPY && copyflag != L_CLONE)
2095  return ERROR_INT("invalid copyflag", procName, 1);
2096 
2097  boxaAddBox(paa->boxa, box, copyflag);
2098  return 0;
2099 }
2100 
2101 
2102 
2103 /*---------------------------------------------------------------------*
2104  * Pixaa accessors *
2105  *---------------------------------------------------------------------*/
2118 l_int32
2120  NUMA **pna)
2121 {
2122 l_int32 i, n;
2123 NUMA *na;
2124 PIXA *pixa;
2125 
2126  PROCNAME("pixaaGetCount");
2127 
2128  if (pna) *pna = NULL;
2129  if (!paa)
2130  return ERROR_INT("paa not defined", procName, 0);
2131 
2132  n = paa->n;
2133  if (pna) {
2134  if ((na = numaCreate(n)) == NULL)
2135  return ERROR_INT("na not made", procName, 0);
2136  *pna = na;
2137  for (i = 0; i < n; i++) {
2138  pixa = pixaaGetPixa(paa, i, L_CLONE);
2139  numaAddNumber(na, pixaGetCount(pixa));
2140  pixaDestroy(&pixa);
2141  }
2142  }
2143  return n;
2144 }
2145 
2146 
2167 PIXA *
2169  l_int32 index,
2170  l_int32 accesstype)
2171 {
2172 PIXA *pixa;
2173 
2174  PROCNAME("pixaaGetPixa");
2175 
2176  if (!paa)
2177  return (PIXA *)ERROR_PTR("paa not defined", procName, NULL);
2178  if (index < 0 || index >= paa->n)
2179  return (PIXA *)ERROR_PTR("index not valid", procName, NULL);
2180  if (accesstype != L_COPY && accesstype != L_CLONE &&
2181  accesstype != L_COPY_CLONE)
2182  return (PIXA *)ERROR_PTR("invalid accesstype", procName, NULL);
2183 
2184  if ((pixa = paa->pixa[index]) == NULL) { /* shouldn't happen! */
2185  L_ERROR("missing pixa[%d]\n", procName, index);
2186  return (PIXA *)ERROR_PTR("pixa not found at index", procName, NULL);
2187  }
2188  return pixaCopy(pixa, accesstype);
2189 }
2190 
2191 
2205 BOXA *
2207  l_int32 accesstype)
2208 {
2209  PROCNAME("pixaaGetBoxa");
2210 
2211  if (!paa)
2212  return (BOXA *)ERROR_PTR("paa not defined", procName, NULL);
2213  if (accesstype != L_COPY && accesstype != L_CLONE)
2214  return (BOXA *)ERROR_PTR("invalid access type", procName, NULL);
2215 
2216  return boxaCopy(paa->boxa, accesstype);
2217 }
2218 
2219 
2229 PIX *
2231  l_int32 index,
2232  l_int32 ipix,
2233  l_int32 accessflag)
2234 {
2235 PIX *pix;
2236 PIXA *pixa;
2237 
2238  PROCNAME("pixaaGetPix");
2239 
2240  if ((pixa = pixaaGetPixa(paa, index, L_CLONE)) == NULL)
2241  return (PIX *)ERROR_PTR("pixa not retrieved", procName, NULL);
2242  if ((pix = pixaGetPix(pixa, ipix, accessflag)) == NULL)
2243  L_ERROR("pix not retrieved\n", procName);
2244  pixaDestroy(&pixa);
2245  return pix;
2246 }
2247 
2248 
2262 l_ok
2264  l_int32 *psame,
2265  l_int32 *pmaxd)
2266 {
2267 l_int32 i, n, d, maxd, same, samed;
2268 PIXA *pixa;
2269 
2270  PROCNAME("pixaaVerifyDepth");
2271 
2272  if (pmaxd) *pmaxd = 0;
2273  if (!psame)
2274  return ERROR_INT("psame not defined", procName, 1);
2275  *psame = 0;
2276  if (!paa)
2277  return ERROR_INT("paa not defined", procName, 1);
2278  if ((n = pixaaGetCount(paa, NULL)) == 0)
2279  return ERROR_INT("no pixa in paa", procName, 1);
2280 
2281  pixa = pixaaGetPixa(paa, 0, L_CLONE);
2282  pixaVerifyDepth(pixa, &same, &maxd); /* init same, maxd with first pixa */
2283  pixaDestroy(&pixa);
2284  for (i = 1; i < n; i++) {
2285  pixa = pixaaGetPixa(paa, i, L_CLONE);
2286  pixaVerifyDepth(pixa, &samed, &d);
2287  pixaDestroy(&pixa);
2288  maxd = L_MAX(maxd, d);
2289  if (!samed || maxd != d)
2290  same = 0;
2291  }
2292  *psame = same;
2293  if (pmaxd) *pmaxd = maxd;
2294  return 0;
2295 }
2296 
2297 
2312 l_ok
2314  l_int32 *psame,
2315  l_int32 *pmaxw,
2316  l_int32 *pmaxh)
2317 {
2318 l_int32 i, n, w, h, maxw, maxh, same, same2;
2319 PIXA *pixa;
2320 
2321  PROCNAME("pixaaVerifyDimensions");
2322 
2323  if (pmaxw) *pmaxw = 0;
2324  if (pmaxh) *pmaxh = 0;
2325  if (!psame)
2326  return ERROR_INT("psame not defined", procName, 1);
2327  *psame = 0;
2328  if (!paa)
2329  return ERROR_INT("paa not defined", procName, 1);
2330  if ((n = pixaaGetCount(paa, NULL)) == 0)
2331  return ERROR_INT("no pixa in paa", procName, 1);
2332 
2333  /* Init same; init maxw and maxh from first pixa */
2334  pixa = pixaaGetPixa(paa, 0, L_CLONE);
2335  pixaVerifyDimensions(pixa, &same, &maxw, &maxh);
2336  pixaDestroy(&pixa);
2337 
2338  for (i = 1; i < n; i++) {
2339  pixa = pixaaGetPixa(paa, i, L_CLONE);
2340  pixaVerifyDimensions(pixa, &same2, &w, &h);
2341  pixaDestroy(&pixa);
2342  maxw = L_MAX(maxw, w);
2343  maxh = L_MAX(maxh, h);
2344  if (!same2 || maxw != w || maxh != h)
2345  same = 0;
2346  }
2347  *psame = same;
2348  if (pmaxw) *pmaxw = maxw;
2349  if (pmaxh) *pmaxh = maxh;
2350  return 0;
2351 }
2352 
2353 
2366 l_int32
2368  l_int32 *pfull)
2369 {
2370 l_int32 i, n, full;
2371 PIXA *pixa;
2372 
2373  PROCNAME("pixaaIsFull");
2374 
2375  if (!pfull)
2376  return ERROR_INT("&full not defined", procName, 0);
2377  *pfull = 0;
2378  if (!paa)
2379  return ERROR_INT("paa not defined", procName, 0);
2380 
2381  n = pixaaGetCount(paa, NULL);
2382  full = 1;
2383  for (i = 0; i < n; i++) {
2384  pixa = pixaaGetPixa(paa, i, L_CLONE);
2385  pixaIsFull(pixa, &full, NULL);
2386  pixaDestroy(&pixa);
2387  if (!full) break;
2388  }
2389  *pfull = full;
2390  return 0;
2391 }
2392 
2393 
2394 /*---------------------------------------------------------------------*
2395  * Pixaa array modifiers *
2396  *---------------------------------------------------------------------*/
2418 l_ok
2420  PIXA *pixa)
2421 {
2422 l_int32 i, n;
2423 PIXA *pixat;
2424 
2425  PROCNAME("pixaaInitFull");
2426 
2427  if (!paa)
2428  return ERROR_INT("paa not defined", procName, 1);
2429  if (!pixa)
2430  return ERROR_INT("pixa not defined", procName, 1);
2431 
2432  n = paa->nalloc;
2433  paa->n = n;
2434  for (i = 0; i < n; i++) {
2435  pixat = pixaCopy(pixa, L_COPY);
2436  pixaaReplacePixa(paa, i, pixat);
2437  }
2438 
2439  return 0;
2440 }
2441 
2442 
2460 l_ok
2462  l_int32 index,
2463  PIXA *pixa)
2464 {
2465 
2466  PROCNAME("pixaaReplacePixa");
2467 
2468  if (!paa)
2469  return ERROR_INT("paa not defined", procName, 1);
2470  if (index < 0 || index >= paa->n)
2471  return ERROR_INT("index not valid", procName, 1);
2472  if (!pixa)
2473  return ERROR_INT("pixa not defined", procName, 1);
2474 
2475  pixaDestroy(&(paa->pixa[index]));
2476  paa->pixa[index] = pixa;
2477  return 0;
2478 }
2479 
2480 
2493 l_ok
2495 {
2496 l_int32 i, n;
2497 
2498  PROCNAME("pixaClear");
2499 
2500  if (!paa)
2501  return ERROR_INT("paa not defined", procName, 1);
2502 
2503  n = pixaaGetCount(paa, NULL);
2504  for (i = 0; i < n; i++)
2505  pixaDestroy(&paa->pixa[i]);
2506  paa->n = 0;
2507  return 0;
2508 }
2509 
2510 
2524 l_ok
2526 {
2527 l_int32 i, n, np;
2528 PIXA *pixa;
2529 
2530  PROCNAME("pixaaTruncate");
2531 
2532  if (!paa)
2533  return ERROR_INT("paa not defined", procName, 1);
2534 
2535  n = pixaaGetCount(paa, NULL);
2536  for (i = n - 1; i >= 0; i--) {
2537  pixa = pixaaGetPixa(paa, i, L_CLONE);
2538  if (!pixa) {
2539  paa->n--;
2540  continue;
2541  }
2542  np = pixaGetCount(pixa);
2543  pixaDestroy(&pixa);
2544  if (np == 0) {
2545  pixaDestroy(&paa->pixa[i]);
2546  paa->n--;
2547  } else {
2548  break;
2549  }
2550  }
2551  return 0;
2552 }
2553 
2554 
2555 
2556 /*---------------------------------------------------------------------*
2557  * Pixa serialized I/O *
2558  *---------------------------------------------------------------------*/
2571 PIXA *
2572 pixaRead(const char *filename)
2573 {
2574 FILE *fp;
2575 PIXA *pixa;
2576 
2577  PROCNAME("pixaRead");
2578 
2579 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2580  return (PIXA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2581 #endif /* !HAVE_LIBPNG */
2582 
2583  if (!filename)
2584  return (PIXA *)ERROR_PTR("filename not defined", procName, NULL);
2585 
2586  if ((fp = fopenReadStream(filename)) == NULL)
2587  return (PIXA *)ERROR_PTR("stream not opened", procName, NULL);
2588  pixa = pixaReadStream(fp);
2589  fclose(fp);
2590  if (!pixa)
2591  return (PIXA *)ERROR_PTR("pixa not read", procName, NULL);
2592  return pixa;
2593 }
2594 
2595 
2608 PIXA *
2610 {
2611 l_int32 n, i, xres, yres, version;
2612 l_int32 ignore;
2613 BOXA *boxa;
2614 PIX *pix;
2615 PIXA *pixa;
2616 
2617  PROCNAME("pixaReadStream");
2618 
2619 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2620  return (PIXA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2621 #endif /* !HAVE_LIBPNG */
2622 
2623  if (!fp)
2624  return (PIXA *)ERROR_PTR("stream not defined", procName, NULL);
2625 
2626  if (fscanf(fp, "\nPixa Version %d\n", &version) != 1)
2627  return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL);
2628  if (version != PIXA_VERSION_NUMBER)
2629  return (PIXA *)ERROR_PTR("invalid pixa version", procName, NULL);
2630  if (fscanf(fp, "Number of pix = %d\n", &n) != 1)
2631  return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL);
2632 
2633  if ((boxa = boxaReadStream(fp)) == NULL)
2634  return (PIXA *)ERROR_PTR("boxa not made", procName, NULL);
2635  if ((pixa = pixaCreate(n)) == NULL) {
2636  boxaDestroy(&boxa);
2637  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
2638  }
2639  boxaDestroy(&pixa->boxa);
2640  pixa->boxa = boxa;
2641 
2642  for (i = 0; i < n; i++) {
2643  if ((fscanf(fp, " pix[%d]: xres = %d, yres = %d\n",
2644  &ignore, &xres, &yres)) != 3) {
2645  pixaDestroy(&pixa);
2646  return (PIXA *)ERROR_PTR("res reading error", procName, NULL);
2647  }
2648  if ((pix = pixReadStreamPng(fp)) == NULL) {
2649  pixaDestroy(&pixa);
2650  return (PIXA *)ERROR_PTR("pix not read", procName, NULL);
2651  }
2652  pixSetXRes(pix, xres);
2653  pixSetYRes(pix, yres);
2654  pixaAddPix(pixa, pix, L_INSERT);
2655  }
2656  return pixa;
2657 }
2658 
2659 
2667 PIXA *
2668 pixaReadMem(const l_uint8 *data,
2669  size_t size)
2670 {
2671 FILE *fp;
2672 PIXA *pixa;
2673 
2674  PROCNAME("pixaReadMem");
2675 
2676  if (!data)
2677  return (PIXA *)ERROR_PTR("data not defined", procName, NULL);
2678  if ((fp = fopenReadFromMemory(data, size)) == NULL)
2679  return (PIXA *)ERROR_PTR("stream not opened", procName, NULL);
2680 
2681  pixa = pixaReadStream(fp);
2682  fclose(fp);
2683  if (!pixa) L_ERROR("pixa not read\n", procName);
2684  return pixa;
2685 }
2686 
2687 
2704 l_ok
2705 pixaWriteDebug(const char *fname,
2706  PIXA *pixa)
2707 {
2708  PROCNAME("pixaWriteDebug");
2709 
2710  if (LeptDebugOK) {
2711  return pixaWrite(fname, pixa);
2712  } else {
2713  L_INFO("write to named temp file %s is disabled\n", procName, fname);
2714  return 0;
2715  }
2716 }
2717 
2718 
2732 l_ok
2733 pixaWrite(const char *filename,
2734  PIXA *pixa)
2735 {
2736 l_int32 ret;
2737 FILE *fp;
2738 
2739  PROCNAME("pixaWrite");
2740 
2741 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2742  return ERROR_INT("no libpng: can't write data", procName, 1);
2743 #endif /* !HAVE_LIBPNG */
2744 
2745  if (!filename)
2746  return ERROR_INT("filename not defined", procName, 1);
2747  if (!pixa)
2748  return ERROR_INT("pixa not defined", procName, 1);
2749 
2750  if ((fp = fopenWriteStream(filename, "wb")) == NULL)
2751  return ERROR_INT("stream not opened", procName, 1);
2752  ret = pixaWriteStream(fp, pixa);
2753  fclose(fp);
2754  if (ret)
2755  return ERROR_INT("pixa not written to stream", procName, 1);
2756  return 0;
2757 }
2758 
2759 
2773 l_ok
2775  PIXA *pixa)
2776 {
2777 l_int32 n, i;
2778 PIX *pix;
2779 
2780  PROCNAME("pixaWriteStream");
2781 
2782 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2783  return ERROR_INT("no libpng: can't write data", procName, 1);
2784 #endif /* !HAVE_LIBPNG */
2785 
2786  if (!fp)
2787  return ERROR_INT("stream not defined", procName, 1);
2788  if (!pixa)
2789  return ERROR_INT("pixa not defined", procName, 1);
2790 
2791  n = pixaGetCount(pixa);
2792  fprintf(fp, "\nPixa Version %d\n", PIXA_VERSION_NUMBER);
2793  fprintf(fp, "Number of pix = %d\n", n);
2794  boxaWriteStream(fp, pixa->boxa);
2795  for (i = 0; i < n; i++) {
2796  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
2797  return ERROR_INT("pix not found", procName, 1);
2798  fprintf(fp, " pix[%d]: xres = %d, yres = %d\n",
2799  i, pix->xres, pix->yres);
2800  pixWriteStreamPng(fp, pix, 0.0);
2801  pixDestroy(&pix);
2802  }
2803  return 0;
2804 }
2805 
2806 
2820 l_ok
2821 pixaWriteMem(l_uint8 **pdata,
2822  size_t *psize,
2823  PIXA *pixa)
2824 {
2825 l_int32 ret;
2826 FILE *fp;
2827 
2828  PROCNAME("pixaWriteMem");
2829 
2830  if (pdata) *pdata = NULL;
2831  if (psize) *psize = 0;
2832  if (!pdata)
2833  return ERROR_INT("&data not defined", procName, 1);
2834  if (!psize)
2835  return ERROR_INT("&size not defined", procName, 1);
2836  if (!pixa)
2837  return ERROR_INT("pixa not defined", procName, 1);
2838 
2839 #if HAVE_FMEMOPEN
2840  if ((fp = open_memstream((char **)pdata, psize)) == NULL)
2841  return ERROR_INT("stream not opened", procName, 1);
2842  ret = pixaWriteStream(fp, pixa);
2843 #else
2844  L_INFO("work-around: writing to a temp file\n", procName);
2845  #ifdef _WIN32
2846  if ((fp = fopenWriteWinTempfile()) == NULL)
2847  return ERROR_INT("tmpfile stream not opened", procName, 1);
2848  #else
2849  if ((fp = tmpfile()) == NULL)
2850  return ERROR_INT("tmpfile stream not opened", procName, 1);
2851  #endif /* _WIN32 */
2852  ret = pixaWriteStream(fp, pixa);
2853  rewind(fp);
2854  *pdata = l_binaryReadStream(fp, psize);
2855 #endif /* HAVE_FMEMOPEN */
2856  fclose(fp);
2857  return ret;
2858 }
2859 
2860 
2873 PIXA *
2874 pixaReadBoth(const char *filename)
2875 {
2876 char buf[32];
2877 char *sname;
2878 PIXA *pixa;
2879 PIXAC *pac;
2880 
2881  PROCNAME("pixaReadBoth");
2882 
2883  if (!filename)
2884  return (PIXA *)ERROR_PTR("filename not defined", procName, NULL);
2885 
2886  l_getStructStrFromFile(filename, L_STR_NAME, &sname);
2887  if (!sname)
2888  return (PIXA *)ERROR_PTR("struct name not found", procName, NULL);
2889  snprintf(buf, sizeof(buf), "%s", sname);
2890  LEPT_FREE(sname);
2891 
2892  if (strcmp(buf, "Pixacomp") == 0) {
2893  if ((pac = pixacompRead(filename)) == NULL)
2894  return (PIXA *)ERROR_PTR("pac not made", procName, NULL);
2895  pixa = pixaCreateFromPixacomp(pac, L_COPY);
2896  pixacompDestroy(&pac);
2897  } else if (strcmp(buf, "Pixa") == 0) {
2898  if ((pixa = pixaRead(filename)) == NULL)
2899  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
2900  } else {
2901  return (PIXA *)ERROR_PTR("invalid file type", procName, NULL);
2902  }
2903  return pixa;
2904 }
2905 
2906 
2907 /*---------------------------------------------------------------------*
2908  * Pixaa serialized I/O *
2909  *---------------------------------------------------------------------*/
2930 PIXAA *
2931 pixaaReadFromFiles(const char *dirname,
2932  const char *substr,
2933  l_int32 first,
2934  l_int32 nfiles)
2935 {
2936 char *fname;
2937 l_int32 i, n;
2938 PIXA *pixa;
2939 PIXAA *paa;
2940 SARRAY *sa;
2941 
2942  PROCNAME("pixaaReadFromFiles");
2943 
2944  if (!dirname)
2945  return (PIXAA *)ERROR_PTR("dirname not defined", procName, NULL);
2946 
2947  sa = getSortedPathnamesInDirectory(dirname, substr, first, nfiles);
2948  if (!sa || ((n = sarrayGetCount(sa)) == 0)) {
2949  sarrayDestroy(&sa);
2950  return (PIXAA *)ERROR_PTR("no pixa files found", procName, NULL);
2951  }
2952 
2953  paa = pixaaCreate(n);
2954  for (i = 0; i < n; i++) {
2955  fname = sarrayGetString(sa, i, L_NOCOPY);
2956  if ((pixa = pixaRead(fname)) == NULL) {
2957  L_ERROR("pixa not read for %d-th file", procName, i);
2958  continue;
2959  }
2960  pixaaAddPixa(paa, pixa, L_INSERT);
2961  }
2962 
2963  sarrayDestroy(&sa);
2964  return paa;
2965 }
2966 
2967 
2980 PIXAA *
2981 pixaaRead(const char *filename)
2982 {
2983 FILE *fp;
2984 PIXAA *paa;
2985 
2986  PROCNAME("pixaaRead");
2987 
2988 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2989  return (PIXAA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2990 #endif /* !HAVE_LIBPNG */
2991 
2992  if (!filename)
2993  return (PIXAA *)ERROR_PTR("filename not defined", procName, NULL);
2994 
2995  if ((fp = fopenReadStream(filename)) == NULL)
2996  return (PIXAA *)ERROR_PTR("stream not opened", procName, NULL);
2997  paa = pixaaReadStream(fp);
2998  fclose(fp);
2999  if (!paa)
3000  return (PIXAA *)ERROR_PTR("paa not read", procName, NULL);
3001  return paa;
3002 }
3003 
3004 
3017 PIXAA *
3019 {
3020 l_int32 n, i, version;
3021 l_int32 ignore;
3022 BOXA *boxa;
3023 PIXA *pixa;
3024 PIXAA *paa;
3025 
3026  PROCNAME("pixaaReadStream");
3027 
3028 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
3029  return (PIXAA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
3030 #endif /* !HAVE_LIBPNG */
3031 
3032  if (!fp)
3033  return (PIXAA *)ERROR_PTR("stream not defined", procName, NULL);
3034 
3035  if (fscanf(fp, "\nPixaa Version %d\n", &version) != 1)
3036  return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL);
3037  if (version != PIXAA_VERSION_NUMBER)
3038  return (PIXAA *)ERROR_PTR("invalid pixaa version", procName, NULL);
3039  if (fscanf(fp, "Number of pixa = %d\n", &n) != 1)
3040  return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL);
3041 
3042  if ((paa = pixaaCreate(n)) == NULL)
3043  return (PIXAA *)ERROR_PTR("paa not made", procName, NULL);
3044  if ((boxa = boxaReadStream(fp)) == NULL) {
3045  pixaaDestroy(&paa);
3046  return (PIXAA *)ERROR_PTR("boxa not made", procName, NULL);
3047  }
3048  boxaDestroy(&paa->boxa);
3049  paa->boxa = boxa;
3050 
3051  for (i = 0; i < n; i++) {
3052  if ((fscanf(fp, "\n\n --------------- pixa[%d] ---------------\n",
3053  &ignore)) != 1) {
3054  pixaaDestroy(&paa);
3055  return (PIXAA *)ERROR_PTR("text reading", procName, NULL);
3056  }
3057  if ((pixa = pixaReadStream(fp)) == NULL) {
3058  pixaaDestroy(&paa);
3059  return (PIXAA *)ERROR_PTR("pixa not read", procName, NULL);
3060  }
3061  pixaaAddPixa(paa, pixa, L_INSERT);
3062  }
3063 
3064  return paa;
3065 }
3066 
3067 
3075 PIXAA *
3076 pixaaReadMem(const l_uint8 *data,
3077  size_t size)
3078 {
3079 FILE *fp;
3080 PIXAA *paa;
3081 
3082  PROCNAME("paaReadMem");
3083 
3084  if (!data)
3085  return (PIXAA *)ERROR_PTR("data not defined", procName, NULL);
3086  if ((fp = fopenReadFromMemory(data, size)) == NULL)
3087  return (PIXAA *)ERROR_PTR("stream not opened", procName, NULL);
3088 
3089  paa = pixaaReadStream(fp);
3090  fclose(fp);
3091  if (!paa) L_ERROR("paa not read\n", procName);
3092  return paa;
3093 }
3094 
3095 
3109 l_ok
3110 pixaaWrite(const char *filename,
3111  PIXAA *paa)
3112 {
3113 l_int32 ret;
3114 FILE *fp;
3115 
3116  PROCNAME("pixaaWrite");
3117 
3118 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
3119  return ERROR_INT("no libpng: can't read data", procName, 1);
3120 #endif /* !HAVE_LIBPNG */
3121 
3122  if (!filename)
3123  return ERROR_INT("filename not defined", procName, 1);
3124  if (!paa)
3125  return ERROR_INT("paa not defined", procName, 1);
3126 
3127  if ((fp = fopenWriteStream(filename, "wb")) == NULL)
3128  return ERROR_INT("stream not opened", procName, 1);
3129  ret = pixaaWriteStream(fp, paa);
3130  fclose(fp);
3131  if (ret)
3132  return ERROR_INT("paa not written to stream", procName, 1);
3133  return 0;
3134 }
3135 
3136 
3150 l_ok
3152  PIXAA *paa)
3153 {
3154 l_int32 n, i;
3155 PIXA *pixa;
3156 
3157  PROCNAME("pixaaWriteStream");
3158 
3159 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
3160  return ERROR_INT("no libpng: can't read data", procName, 1);
3161 #endif /* !HAVE_LIBPNG */
3162 
3163  if (!fp)
3164  return ERROR_INT("stream not defined", procName, 1);
3165  if (!paa)
3166  return ERROR_INT("paa not defined", procName, 1);
3167 
3168  n = pixaaGetCount(paa, NULL);
3169  fprintf(fp, "\nPixaa Version %d\n", PIXAA_VERSION_NUMBER);
3170  fprintf(fp, "Number of pixa = %d\n", n);
3171  boxaWriteStream(fp, paa->boxa);
3172  for (i = 0; i < n; i++) {
3173  if ((pixa = pixaaGetPixa(paa, i, L_CLONE)) == NULL)
3174  return ERROR_INT("pixa not found", procName, 1);
3175  fprintf(fp, "\n\n --------------- pixa[%d] ---------------\n", i);
3176  pixaWriteStream(fp, pixa);
3177  pixaDestroy(&pixa);
3178  }
3179  return 0;
3180 }
3181 
3182 
3196 l_ok
3197 pixaaWriteMem(l_uint8 **pdata,
3198  size_t *psize,
3199  PIXAA *paa)
3200 {
3201 l_int32 ret;
3202 FILE *fp;
3203 
3204  PROCNAME("pixaaWriteMem");
3205 
3206  if (pdata) *pdata = NULL;
3207  if (psize) *psize = 0;
3208  if (!pdata)
3209  return ERROR_INT("&data not defined", procName, 1);
3210  if (!psize)
3211  return ERROR_INT("&size not defined", procName, 1);
3212  if (!paa)
3213  return ERROR_INT("paa not defined", procName, 1);
3214 
3215 #if HAVE_FMEMOPEN
3216  if ((fp = open_memstream((char **)pdata, psize)) == NULL)
3217  return ERROR_INT("stream not opened", procName, 1);
3218  ret = pixaaWriteStream(fp, paa);
3219 #else
3220  L_INFO("work-around: writing to a temp file\n", procName);
3221  #ifdef _WIN32
3222  if ((fp = fopenWriteWinTempfile()) == NULL)
3223  return ERROR_INT("tmpfile stream not opened", procName, 1);
3224  #else
3225  if ((fp = tmpfile()) == NULL)
3226  return ERROR_INT("tmpfile stream not opened", procName, 1);
3227  #endif /* _WIN32 */
3228  ret = pixaaWriteStream(fp, paa);
3229  rewind(fp);
3230  *pdata = l_binaryReadStream(fp, psize);
3231 #endif /* HAVE_FMEMOPEN */
3232  fclose(fp);
3233  return ret;
3234 }
3235 
BOXA * boxaReadStream(FILE *fp)
boxaReadStream()
Definition: boxbasic.c:2108
PIXA * pixaInterleave(PIXA *pixa1, PIXA *pixa2, l_int32 copyflag)
pixaInterleave()
Definition: pixabasic.c:1702
void pixaaDestroy(PIXAA **ppaa)
pixaaDestroy()
Definition: pixabasic.c:1932
PIXAA * pixaaCreate(l_int32 n)
pixaaCreate()
Definition: pixabasic.c:1825
l_int32 xres
Definition: pix.h:142
l_ok pixaInitFull(PIXA *pixa, PIX *pix, BOX *box)
pixaInitFull()
Definition: pixabasic.c:1566
l_int32 n
Definition: pix.h:494
l_ok boxaJoin(BOXA *boxad, BOXA *boxas, l_int32 istart, l_int32 iend)
boxaJoin()
Definition: boxfunc1.c:2351
l_int32 pixaaIsFull(PIXAA *paa, l_int32 *pfull)
pixaaIsFull()
Definition: pixabasic.c:2367
Definition: pix.h:717
l_ok boxaExtendArrayToSize(BOXA *boxa, l_int32 size)
boxaExtendArrayToSize()
Definition: boxbasic.c:689
PIX * pixReadStreamPng(FILE *fp)
pixReadStreamPng()
Definition: pngio.c:185
l_ok pixaSetText(PIXA *pixa, const char *text, SARRAY *sa)
pixaSetText()
Definition: pixabasic.c:1134
PIXAA * pixaaReadMem(const l_uint8 *data, size_t size)
pixaaReadMem()
Definition: pixabasic.c:3076
struct Boxa * boxa
Definition: pix.h:460
l_ok pixaWriteDebug(const char *fname, PIXA *pixa)
pixaWriteDebug()
Definition: pixabasic.c:2705
l_ok pixaVerifyDepth(PIXA *pixa, l_int32 *psame, l_int32 *pmaxd)
pixaVerifyDepth()
Definition: pixabasic.c:941
l_ok pixaaAddBox(PIXAA *paa, BOX *box, l_int32 copyflag)
pixaaAddBox()
Definition: pixabasic.c:2084
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
Definition: numabasic.c:473
PIXA * pixaReadMem(const l_uint8 *data, size_t size)
pixaReadMem()
Definition: pixabasic.c:2668
PIXA * pixaCreate(l_int32 n)
pixaCreate()
Definition: pixabasic.c:163
l_ok pixaWriteStreamInfo(FILE *fp, PIXA *pixa)
pixaWriteStreamInfo()
Definition: pixabasic.c:1241
l_ok pixaRemovePixAndSave(PIXA *pixa, l_int32 index, PIX **ppix, BOX **pbox)
pixaRemovePixAndSave()
Definition: pixabasic.c:1451
PIXAC * pixacompRead(const char *filename)
pixacompRead()
Definition: pixcomp.c:1642
l_ok pixaExtendArrayToSize(PIXA *pixa, l_int32 size)
pixaExtendArrayToSize()
Definition: pixabasic.c:602
l_ok boxaExtendArray(BOXA *boxa)
boxaExtendArray()
Definition: boxbasic.c:665
Definition: pix.h:716
l_ok pixaCountText(PIXA *pixa, l_int32 *pntext)
pixaCountText()
Definition: pixabasic.c:1088
l_ok pixaSetBoxa(PIXA *pixa, BOXA *boxa, l_int32 accesstype)
pixaSetBoxa()
Definition: pixabasic.c:877
l_ok pixaWrite(const char *filename, PIXA *pixa)
pixaWrite()
Definition: pixabasic.c:2733
l_ok pixaJoin(PIXA *pixad, PIXA *pixas, l_int32 istart, l_int32 iend)
pixaJoin()
Definition: pixabasic.c:1646
l_int32 yres
Definition: pix.h:144
PIXAA * pixaaReadStream(FILE *fp)
pixaaReadStream()
Definition: pixabasic.c:3018
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
Definition: rop.c:193
l_ok pixaaExtendArray(PIXAA *paa)
pixaaExtendArray()
Definition: pixabasic.c:2017
PIXA * pixaaGetPixa(PIXAA *paa, l_int32 index, l_int32 accesstype)
pixaaGetPixa()
Definition: pixabasic.c:2168
PIXA * pixaCreateFromPixacomp(PIXAC *pixac, l_int32 accesstype)
pixaCreateFromPixacomp()
Definition: pixcomp.c:1469
l_ok boxaWriteStream(FILE *fp, BOXA *boxa)
boxaWriteStream()
Definition: boxbasic.c:2242
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
Definition: pix1.c:1810
PIXA * pixaRead(const char *filename)
pixaRead()
Definition: pixabasic.c:2572
l_int32 pixaaGetCount(PIXAA *paa, NUMA **pna)
pixaaGetCount()
Definition: pixabasic.c:2119
NUMA * numaSort(NUMA *naout, NUMA *nain, l_int32 sortorder)
numaSort()
Definition: numafunc1.c:2547
PIXAA * pixaaReadFromFiles(const char *dirname, const char *substr, l_int32 first, l_int32 nfiles)
pixaaReadFromFiles()
Definition: pixabasic.c:2931
l_ok boxaReplaceBox(BOXA *boxa, l_int32 index, BOX *box)
boxaReplaceBox()
Definition: boxbasic.c:946
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
Definition: pix1.c:302
PIXA * pixaSplitPix(PIX *pixs, l_int32 nx, l_int32 ny, l_int32 borderwidth, l_uint32 bordercolor)
pixaSplitPix()
Definition: pixabasic.c:346
l_ok pixSetAll(PIX *pix)
pixSetAll()
Definition: pix2.c:741
FILE * fopenReadFromMemory(const l_uint8 *data, size_t size)
fopenReadFromMemory()
Definition: utils2.c:1734
PIXA * pixaReadBoth(const char *filename)
pixaReadBoth()
Definition: pixabasic.c:2874
BOXA * boxaCopy(BOXA *boxa, l_int32 copyflag)
boxaCopy()
Definition: boxbasic.c:534
NUMA * numaCreate(l_int32 n)
numaCreate()
Definition: numabasic.c:187
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
Definition: boxbasic.c:580
BOX * pixaGetBox(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetBox()
Definition: pixabasic.c:797
PIXA * pixaCreateFromBoxa(PIX *pixs, BOXA *boxa, l_int32 start, l_int32 num, l_int32 *pcropwarn)
pixaCreateFromBoxa()
Definition: pixabasic.c:268
l_ok pixWriteStreamPng(FILE *fp, PIX *pix, l_float32 gamma)
pixWriteStreamPng()
Definition: pngio.c:1007
l_ok pixaInsertPix(PIXA *pixa, l_int32 index, PIX *pixs, BOX *box)
pixaInsertPix()
Definition: pixabasic.c:1349
l_uint32 refcount
Definition: pix.h:458
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
Definition: pix5.c:1020
l_int32 n
Definition: pix.h:456
Definition: pix.h:492
void * reallocNew(void **pindata, l_int32 oldsize, l_int32 newsize)
reallocNew()
Definition: utils2.c:1161
l_int32 pixaGetBoxaCount(PIXA *pixa)
pixaGetBoxaCount()
Definition: pixabasic.c:765
PIX ** pixaGetPixArray(PIXA *pixa)
pixaGetPixArray()
Definition: pixabasic.c:916
l_ok pixaaJoin(PIXAA *paad, PIXAA *paas, l_int32 istart, l_int32 iend)
pixaaJoin()
Definition: pixabasic.c:1767
l_ok pixaaWrite(const char *filename, PIXAA *paa)
pixaaWrite()
Definition: pixabasic.c:3110
l_ok pixaChangeRefcount(PIXA *pixa, l_int32 delta)
pixaChangeRefcount()
Definition: pixabasic.c:650
PIX * pixaaGetPix(PIXAA *paa, l_int32 index, l_int32 ipix, l_int32 accessflag)
pixaaGetPix()
Definition: pixabasic.c:2230
Definition: array.h:116
l_ok pixSetText(PIX *pix, const char *textstring)
pixSetText()
Definition: pix1.c:1483
BOX * boxClone(BOX *box)
boxClone()
Definition: boxbasic.c:252
l_ok pixSetAllArbitrary(PIX *pix, l_uint32 val)
pixSetAllArbitrary()
Definition: pix2.c:876
l_int32 l_getStructStrFromFile(const char *filename, l_int32 field, char **pstr)
l_getStructStrFromFile()
Definition: stringcode.c:525
l_ok pixClipToForeground(PIX *pixs, PIX **ppixd, BOX **pbox)
pixClipToForeground()
Definition: pix5.c:1660
PIXA * pixaCopy(PIXA *pixa, l_int32 copyflag)
pixaCopy()
Definition: pixabasic.c:450
l_ok pixaWriteMem(l_uint8 **pdata, size_t *psize, PIXA *pixa)
pixaWriteMem()
Definition: pixabasic.c:2821
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
Definition: numabasic.c:727
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
Definition: pixabasic.c:503
Definition: array.h:59
l_ok pixaaVerifyDimensions(PIXAA *paa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaaVerifyDimensions()
Definition: pixabasic.c:2313
l_ok pixaClear(PIXA *pixa)
pixaClear()
Definition: pixabasic.c:1608
l_ok boxaRemoveBoxAndSave(BOXA *boxa, l_int32 index, BOX **pbox)
boxaRemoveBoxAndSave()
Definition: boxbasic.c:1053
l_int32 numaGetCount(NUMA *na)
numaGetCount()
Definition: numabasic.c:631
l_ok pixaaReplacePixa(PIXAA *paa, l_int32 index, PIXA *pixa)
pixaaReplacePixa()
Definition: pixabasic.c:2461
l_ok pixClearAll(PIX *pix)
pixClearAll()
Definition: pix2.c:712
PIXA * pixaCreateFromPix(PIX *pixs, l_int32 n, l_int32 cellw, l_int32 cellh)
pixaCreateFromPix()
Definition: pixabasic.c:202
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
Definition: boxbasic.c:618
l_ok pixaaClear(PIXAA *paa)
pixaaClear()
Definition: pixabasic.c:2494
#define PIXAA_VERSION_NUMBER
Definition: pix.h:448
struct Pix ** pix
Definition: pix.h:459
l_ok pixaaTruncate(PIXAA *paa)
pixaaTruncate()
Definition: pixabasic.c:2525
FILE * fopenWriteWinTempfile()
fopenWriteWinTempfile()
Definition: utils2.c:1780
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
Definition: sarray1.c:681
l_ok pixaGetBoxGeometry(PIXA *pixa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
pixaGetBoxGeometry()
Definition: pixabasic.c:835
PIXA * pixaReadStream(FILE *fp)
pixaReadStream()
Definition: pixabasic.c:2609
PIX * pixClone(PIX *pixs)
pixClone()
Definition: pix1.c:515
Definition: pix.h:658
l_int32 nalloc
Definition: pix.h:457
void pixacompDestroy(PIXAC **ppixac)
pixacompDestroy()
Definition: pixcomp.c:861
PIXAA * pixaaRead(const char *filename)
pixaaRead()
Definition: pixabasic.c:2981
void pixDestroy(PIX **ppix)
pixDestroy()
Definition: pix1.c:543
l_ok pixCopyColormap(PIX *pixd, PIX *pixs)
pixCopyColormap()
Definition: pix1.c:745
l_ok pixaRemoveSelected(PIXA *pixa, NUMA *naindex)
pixaRemoveSelected()
Definition: pixabasic.c:1503
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
Definition: boxbasic.c:763
l_int32 n
Definition: pix.h:467
struct Pixa ** pixa
Definition: pix.h:469
static l_int32 pixaExtendArray(PIXA *pixa)
pixaExtendArray()
Definition: pixabasic.c:577
void *** pixaGetLinePtrs(PIXA *pixa, l_int32 *psize)
pixaGetLinePtrs()
Definition: pixabasic.c:1193
SARRAY * getSortedPathnamesInDirectory(const char *dirname, const char *substr, l_int32 first, l_int32 nfiles)
getSortedPathnamesInDirectory()
Definition: sarray1.c:1717
Definition: pix.h:454
l_ok boxaGetExtent(BOXA *boxa, l_int32 *pw, l_int32 *ph, BOX **pbox)
boxaGetExtent()
Definition: boxfunc4.c:943
void numaDestroy(NUMA **pna)
numaDestroy()
Definition: numabasic.c:360
Definition: pix.h:465
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
Definition: pix1.c:1065
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
Definition: utils2.c:1700
#define PIXA_VERSION_NUMBER
Definition: pix.h:449
FILE * fopenReadStream(const char *filename)
fopenReadStream()
Definition: utils2.c:1657
PIXAA * pixaaCreateFromPixa(PIXA *pixa, l_int32 n, l_int32 type, l_int32 copyflag)
pixaaCreateFromPixa()
Definition: pixabasic.c:1870
l_ok boxaInitFull(BOXA *boxa, BOX *box)
boxaInitFull()
Definition: boxbasic.c:1159
l_ok pixaVerifyDimensions(PIXA *pixa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaVerifyDimensions()
Definition: pixabasic.c:987
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
Definition: utils2.c:1262
l_int32 sarrayGetCount(SARRAY *sa)
sarrayGetCount()
Definition: sarray1.c:621
l_ok boxaIsFull(BOXA *boxa, l_int32 *pfull)
boxaIsFull()
Definition: boxbasic.c:899
char * pixGetText(PIX *pix)
pixGetText()
Definition: pix1.c:1459
l_ok pixaIsFull(PIXA *pixa, l_int32 *pfullpa, l_int32 *pfullba)
pixaIsFull()
Definition: pixabasic.c:1038
l_ok pixaaWriteMem(l_uint8 **pdata, size_t *psize, PIXAA *paa)
pixaaWriteMem()
Definition: pixabasic.c:3197
l_ok boxaRemoveBox(BOXA *boxa, l_int32 index)
boxaRemoveBox()
Definition: boxbasic.c:1029
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
Definition: pixabasic.c:672
Definition: pix.h:718
l_ok pixaaInitFull(PIXAA *paa, PIXA *pixa)
pixaaInitFull()
Definition: pixabasic.c:2419
l_ok pixaaAddPixa(PIXAA *paa, PIXA *pixa, l_int32 copyflag)
pixaaAddPixa()
Definition: pixabasic.c:1976
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
Definition: colormap.c:635
l_ok pixaRemovePix(PIXA *pixa, l_int32 index)
pixaRemovePix()
Definition: pixabasic.c:1399
l_int32 nalloc
Definition: pix.h:468
BOX * boxCopy(BOX *box)
boxCopy()
Definition: boxbasic.c:230
Definition: pix.h:134
Definition: pix.h:719
l_ok pixaGetPixDimensions(PIXA *pixa, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixaGetPixDimensions()
Definition: pixabasic.c:707
BOXA * boxaCreate(l_int32 n)
boxaCreate()
Definition: boxbasic.c:499
#define PIX_SRC
Definition: pix.h:327
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
Definition: pix1.c:628
void boxDestroy(BOX **pbox)
boxDestroy()
Definition: boxbasic.c:278
l_ok pixaaVerifyDepth(PIXAA *paa, l_int32 *psame, l_int32 *pmaxd)
pixaaVerifyDepth()
Definition: pixabasic.c:2263
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
Definition: boxbasic.c:718
BOXA * pixaaGetBoxa(PIXAA *paa, l_int32 accesstype)
pixaaGetBoxa()
Definition: pixabasic.c:2206
l_ok pixaaWriteStream(FILE *fp, PIXAA *paa)
pixaaWriteStream()
Definition: pixabasic.c:3151
l_ok boxaClear(BOXA *boxa)
boxaClear()
Definition: boxbasic.c:1196
struct Box ** box
Definition: pix.h:497
l_ok pixaWriteStream(FILE *fp, PIXA *pixa)
pixaWriteStream()
Definition: pixabasic.c:2774
l_ok pixaAddBox(PIXA *pixa, BOX *box, l_int32 copyflag)
pixaAddBox()
Definition: pixabasic.c:547
struct Boxa * boxa
Definition: pix.h:470
l_ok boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
Definition: boxbasic.c:310
Definition: pix.h:480
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
Definition: pixabasic.c:408
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
Definition: pixabasic.c:631
l_ok pixaaAddPix(PIXAA *paa, l_int32 index, PIX *pix, BOX *box, l_int32 copyflag)
pixaaAddPix()
Definition: pixabasic.c:2045
l_ok pixaReplacePix(PIXA *pixa, l_int32 index, PIX *pix, BOX *box)
pixaReplacePix()
Definition: pixabasic.c:1299
l_ok boxaInsertBox(BOXA *boxa, l_int32 index, BOX *box)
boxaInsertBox()
Definition: boxbasic.c:984
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
Definition: sarray1.c:355
BOXA * pixaGetBoxa(PIXA *pixa, l_int32 accesstype)
pixaGetBoxa()
Definition: pixabasic.c:741