Leptonica  1.73
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 
133 #ifdef HAVE_CONFIG_H
134 #include "config_auto.h"
135 #endif /* HAVE_CONFIG_H */
136 
137 #include <string.h>
138 #include "allheaders.h"
139 
140 static const l_int32 INITIAL_PTR_ARRAYSIZE = 20; /* n'import quoi */
141 
142  /* Static functions */
143 static l_int32 pixaExtendArray(PIXA *pixa);
144 
145 
146 /*---------------------------------------------------------------------*
147  * Pixa creation, destruction, copy *
148  *---------------------------------------------------------------------*/
160 PIXA *
161 pixaCreate(l_int32 n)
162 {
163 PIXA *pixa;
164 
165  PROCNAME("pixaCreate");
166 
167  if (n <= 0)
168  n = INITIAL_PTR_ARRAYSIZE;
169 
170  pixa = (PIXA *)LEPT_CALLOC(1, sizeof(PIXA));
171  pixa->n = 0;
172  pixa->nalloc = n;
173  pixa->refcount = 1;
174  pixa->pix = (PIX **)LEPT_CALLOC(n, sizeof(PIX *));
175  pixa->boxa = boxaCreate(n);
176  if (!pixa->pix || !pixa->boxa) {
177  pixaDestroy(&pixa);
178  return (PIXA *)ERROR_PTR("pix or boxa not made", procName, NULL);
179  }
180  return pixa;
181 }
182 
183 
199 PIXA *
201  l_int32 n,
202  l_int32 cellw,
203  l_int32 cellh)
204 {
205 l_int32 w, h, d, nw, nh, i, j, index;
206 PIX *pix1, *pix2;
207 PIXA *pixa;
208 
209  PROCNAME("pixaCreateFromPix");
210 
211  if (!pixs)
212  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
213  if (n <= 0)
214  return (PIXA *)ERROR_PTR("n must be > 0", procName, NULL);
215 
216  if ((pixa = pixaCreate(n)) == NULL)
217  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
218  pixGetDimensions(pixs, &w, &h, &d);
219  if ((pix1 = pixCreate(cellw, cellh, d)) == NULL) {
220  pixaDestroy(&pixa);
221  return (PIXA *)ERROR_PTR("pix1 not made", procName, NULL);
222  }
223 
224  nw = (w + cellw - 1) / cellw;
225  nh = (h + cellh - 1) / cellh;
226  for (i = 0, index = 0; i < nh; i++) {
227  for (j = 0; j < nw && index < n; j++, index++) {
228  pixRasterop(pix1, 0, 0, cellw, cellh, PIX_SRC, pixs,
229  j * cellw, i * cellh);
230  if (d == 1 && !pixClipToForeground(pix1, &pix2, NULL))
231  pixaAddPix(pixa, pix2, L_INSERT);
232  else
233  pixaAddPix(pixa, pix1, L_COPY);
234  }
235  }
236 
237  pixDestroy(&pix1);
238  return pixa;
239 }
240 
241 
262 PIXA *
264  BOXA *boxa,
265  l_int32 *pcropwarn)
266 {
267 l_int32 i, n, w, h, wbox, hbox, cropwarn;
268 BOX *box, *boxc;
269 PIX *pixd;
270 PIXA *pixad;
271 
272  PROCNAME("pixaCreateFromBoxa");
273 
274  if (!pixs)
275  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
276  if (!boxa)
277  return (PIXA *)ERROR_PTR("boxa not defined", procName, NULL);
278 
279  n = boxaGetCount(boxa);
280  if ((pixad = pixaCreate(n)) == NULL)
281  return (PIXA *)ERROR_PTR("pixad not made", procName, NULL);
282 
283  boxaGetExtent(boxa, &wbox, &hbox, NULL);
284  pixGetDimensions(pixs, &w, &h, NULL);
285  cropwarn = FALSE;
286  if (wbox > w || hbox > h)
287  cropwarn = TRUE;
288  if (pcropwarn)
289  *pcropwarn = cropwarn;
290 
291  for (i = 0; i < n; i++) {
292  box = boxaGetBox(boxa, i, L_COPY);
293  if (cropwarn) { /* if box is outside pixs, pixd is NULL */
294  pixd = pixClipRectangle(pixs, box, &boxc); /* may be NULL */
295  if (pixd) {
296  pixaAddPix(pixad, pixd, L_INSERT);
297  pixaAddBox(pixad, boxc, L_INSERT);
298  }
299  boxDestroy(&box);
300  } else {
301  pixd = pixClipRectangle(pixs, box, NULL);
302  pixaAddPix(pixad, pixd, L_INSERT);
303  pixaAddBox(pixad, box, L_INSERT);
304  }
305  }
306 
307  return pixad;
308 }
309 
310 
335 PIXA *
337  l_int32 nx,
338  l_int32 ny,
339  l_int32 borderwidth,
340  l_uint32 bordercolor)
341 {
342 l_int32 w, h, d, cellw, cellh, i, j;
343 PIX *pix1;
344 PIXA *pixa;
345 
346  PROCNAME("pixaSplitPix");
347 
348  if (!pixs)
349  return (PIXA *)ERROR_PTR("pixs not defined", procName, NULL);
350  if (nx <= 0 || ny <= 0)
351  return (PIXA *)ERROR_PTR("nx and ny must be > 0", procName, NULL);
352  borderwidth = L_MAX(0, borderwidth);
353 
354  if ((pixa = pixaCreate(nx * ny)) == NULL)
355  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
356  pixGetDimensions(pixs, &w, &h, &d);
357  cellw = (w + nx - 1) / nx; /* round up */
358  cellh = (h + ny - 1) / ny;
359 
360  for (i = 0; i < ny; i++) {
361  for (j = 0; j < nx; j++) {
362  if ((pix1 = pixCreate(cellw + 2 * borderwidth,
363  cellh + 2 * borderwidth, d)) == NULL) {
364  pixaDestroy(&pixa);
365  return (PIXA *)ERROR_PTR("pix1 not made", procName, NULL);
366  }
367  pixCopyColormap(pix1, pixs);
368  if (borderwidth == 0) { /* initialize full image to white */
369  if (d == 1)
370  pixClearAll(pix1);
371  else
372  pixSetAll(pix1);
373  } else {
374  pixSetAllArbitrary(pix1, bordercolor);
375  }
376  pixRasterop(pix1, borderwidth, borderwidth, cellw, cellh,
377  PIX_SRC, pixs, j * cellw, i * cellh);
378  pixaAddPix(pixa, pix1, L_INSERT);
379  }
380  }
381 
382  return pixa;
383 }
384 
385 
397 void
399 {
400 l_int32 i;
401 PIXA *pixa;
402 
403  PROCNAME("pixaDestroy");
404 
405  if (ppixa == NULL) {
406  L_WARNING("ptr address is NULL!\n", procName);
407  return;
408  }
409 
410  if ((pixa = *ppixa) == NULL)
411  return;
412 
413  /* Decrement the refcount. If it is 0, destroy the pixa. */
414  pixaChangeRefcount(pixa, -1);
415  if (pixa->refcount <= 0) {
416  for (i = 0; i < pixa->n; i++)
417  pixDestroy(&pixa->pix[i]);
418  LEPT_FREE(pixa->pix);
419  boxaDestroy(&pixa->boxa);
420  LEPT_FREE(pixa);
421  }
422 
423  *ppixa = NULL;
424  return;
425 }
426 
427 
439 PIXA *
441  l_int32 copyflag)
442 {
443 l_int32 i, nb;
444 BOX *boxc;
445 PIX *pixc;
446 PIXA *pixac;
447 
448  PROCNAME("pixaCopy");
449 
450  if (!pixa)
451  return (PIXA *)ERROR_PTR("pixa not defined", procName, NULL);
452 
453  if (copyflag == L_CLONE) {
454  pixaChangeRefcount(pixa, 1);
455  return pixa;
456  }
457 
458  if (copyflag != L_COPY && copyflag != L_COPY_CLONE)
459  return (PIXA *)ERROR_PTR("invalid copyflag", procName, NULL);
460 
461  if ((pixac = pixaCreate(pixa->n)) == NULL)
462  return (PIXA *)ERROR_PTR("pixac not made", procName, NULL);
463  nb = pixaGetBoxaCount(pixa);
464  for (i = 0; i < pixa->n; i++) {
465  if (copyflag == L_COPY) {
466  pixc = pixaGetPix(pixa, i, L_COPY);
467  if (i < nb) boxc = pixaGetBox(pixa, i, L_COPY);
468  } else { /* copy-clone */
469  pixc = pixaGetPix(pixa, i, L_CLONE);
470  if (i < nb) boxc = pixaGetBox(pixa, i, L_CLONE);
471  }
472  pixaAddPix(pixac, pixc, L_INSERT);
473  if (i < nb) pixaAddBox(pixac, boxc, L_INSERT);
474  }
475 
476  return pixac;
477 }
478 
479 
480 
481 /*---------------------------------------------------------------------*
482  * Pixa addition *
483  *---------------------------------------------------------------------*/
492 l_int32
494  PIX *pix,
495  l_int32 copyflag)
496 {
497 l_int32 n;
498 PIX *pixc;
499 
500  PROCNAME("pixaAddPix");
501 
502  if (!pixa)
503  return ERROR_INT("pixa not defined", procName, 1);
504  if (!pix)
505  return ERROR_INT("pix not defined", procName, 1);
506 
507  if (copyflag == L_INSERT)
508  pixc = pix;
509  else if (copyflag == L_COPY)
510  pixc = pixCopy(NULL, pix);
511  else if (copyflag == L_CLONE)
512  pixc = pixClone(pix);
513  else
514  return ERROR_INT("invalid copyflag", procName, 1);
515  if (!pixc)
516  return ERROR_INT("pixc not made", procName, 1);
517 
518  n = pixaGetCount(pixa);
519  if (n >= pixa->nalloc)
520  pixaExtendArray(pixa);
521  pixa->pix[n] = pixc;
522  pixa->n++;
523 
524  return 0;
525 }
526 
527 
536 l_int32
538  BOX *box,
539  l_int32 copyflag)
540 {
541  PROCNAME("pixaAddBox");
542 
543  if (!pixa)
544  return ERROR_INT("pixa not defined", procName, 1);
545  if (!box)
546  return ERROR_INT("box not defined", procName, 1);
547  if (copyflag != L_INSERT && copyflag != L_COPY && copyflag != L_CLONE)
548  return ERROR_INT("invalid copyflag", procName, 1);
549 
550  boxaAddBox(pixa->boxa, box, copyflag);
551  return 0;
552 }
553 
554 
566 static l_int32
568 {
569  PROCNAME("pixaExtendArray");
570 
571  if (!pixa)
572  return ERROR_INT("pixa not defined", procName, 1);
573 
574  return pixaExtendArrayToSize(pixa, 2 * pixa->nalloc);
575 }
576 
577 
590 l_int32
592  l_int32 size)
593 {
594  PROCNAME("pixaExtendArrayToSize");
595 
596  if (!pixa)
597  return ERROR_INT("pixa not defined", procName, 1);
598 
599  if (size > pixa->nalloc) {
600  if ((pixa->pix = (PIX **)reallocNew((void **)&pixa->pix,
601  sizeof(PIX *) * pixa->nalloc,
602  size * sizeof(PIX *))) == NULL)
603  return ERROR_INT("new ptr array not returned", procName, 1);
604  pixa->nalloc = size;
605  }
606  return boxaExtendArrayToSize(pixa->boxa, size);
607 }
608 
609 
610 /*---------------------------------------------------------------------*
611  * Pixa accessors *
612  *---------------------------------------------------------------------*/
619 l_int32
621 {
622  PROCNAME("pixaGetCount");
623 
624  if (!pixa)
625  return ERROR_INT("pixa not defined", procName, 0);
626 
627  return pixa->n;
628 }
629 
630 
637 l_int32
639  l_int32 delta)
640 {
641  PROCNAME("pixaChangeRefcount");
642 
643  if (!pixa)
644  return ERROR_INT("pixa not defined", procName, 1);
645 
646  pixa->refcount += delta;
647  return 0;
648 }
649 
650 
659 PIX *
661  l_int32 index,
662  l_int32 accesstype)
663 {
664 PIX *pix;
665 
666  PROCNAME("pixaGetPix");
667 
668  if (!pixa)
669  return (PIX *)ERROR_PTR("pixa not defined", procName, NULL);
670  if (index < 0 || index >= pixa->n)
671  return (PIX *)ERROR_PTR("index not valid", procName, NULL);
672  if ((pix = pixa->pix[index]) == NULL) {
673  L_ERROR("no pix at pixa[%d]\n", procName, index);
674  return (PIX *)ERROR_PTR("pix not found!", procName, NULL);
675  }
676 
677  if (accesstype == L_COPY)
678  return pixCopy(NULL, pix);
679  else if (accesstype == L_CLONE)
680  return pixClone(pix);
681  else
682  return (PIX *)ERROR_PTR("invalid accesstype", procName, NULL);
683 }
684 
685 
694 l_int32
696  l_int32 index,
697  l_int32 *pw,
698  l_int32 *ph,
699  l_int32 *pd)
700 {
701 PIX *pix;
702 
703  PROCNAME("pixaGetPixDimensions");
704 
705  if (pw) *pw = 0;
706  if (ph) *ph = 0;
707  if (pd) *pd = 0;
708  if (!pixa)
709  return ERROR_INT("pixa not defined", procName, 1);
710  if (index < 0 || index >= pixa->n)
711  return ERROR_INT("index not valid", procName, 1);
712 
713  if ((pix = pixaGetPix(pixa, index, L_CLONE)) == NULL)
714  return ERROR_INT("pix not found!", procName, 1);
715  pixGetDimensions(pix, pw, ph, pd);
716  pixDestroy(&pix);
717  return 0;
718 }
719 
720 
728 BOXA *
730  l_int32 accesstype)
731 {
732  PROCNAME("pixaGetBoxa");
733 
734  if (!pixa)
735  return (BOXA *)ERROR_PTR("pixa not defined", procName, NULL);
736  if (!pixa->boxa)
737  return (BOXA *)ERROR_PTR("boxa not defined", procName, NULL);
738  if (accesstype != L_COPY && accesstype != L_CLONE &&
739  accesstype != L_COPY_CLONE)
740  return (BOXA *)ERROR_PTR("invalid accesstype", procName, NULL);
741 
742  return boxaCopy(pixa->boxa, accesstype);
743 }
744 
745 
752 l_int32
754 {
755  PROCNAME("pixaGetBoxaCount");
756 
757  if (!pixa)
758  return ERROR_INT("pixa not defined", procName, 0);
759 
760  return boxaGetCount(pixa->boxa);
761 }
762 
763 
784 BOX *
786  l_int32 index,
787  l_int32 accesstype)
788 {
789 BOX *box;
790 
791  PROCNAME("pixaGetBox");
792 
793  if (!pixa)
794  return (BOX *)ERROR_PTR("pixa not defined", procName, NULL);
795  if (!pixa->boxa)
796  return (BOX *)ERROR_PTR("boxa not defined", procName, NULL);
797  if (index < 0 || index >= pixa->boxa->n)
798  return (BOX *)ERROR_PTR("index not valid", procName, NULL);
799  if (accesstype != L_COPY && accesstype != L_CLONE)
800  return (BOX *)ERROR_PTR("invalid accesstype", procName, NULL);
801 
802  box = pixa->boxa->box[index];
803  if (box) {
804  if (accesstype == L_COPY)
805  return boxCopy(box);
806  else /* accesstype == L_CLONE */
807  return boxClone(box);
808  } else {
809  return NULL;
810  }
811 }
812 
813 
822 l_int32
824  l_int32 index,
825  l_int32 *px,
826  l_int32 *py,
827  l_int32 *pw,
828  l_int32 *ph)
829 {
830 BOX *box;
831 
832  PROCNAME("pixaGetBoxGeometry");
833 
834  if (px) *px = 0;
835  if (py) *py = 0;
836  if (pw) *pw = 0;
837  if (ph) *ph = 0;
838  if (!pixa)
839  return ERROR_INT("pixa not defined", procName, 1);
840  if (index < 0 || index >= pixa->n)
841  return ERROR_INT("index not valid", procName, 1);
842 
843  if ((box = pixaGetBox(pixa, index, L_CLONE)) == NULL)
844  return ERROR_INT("box not found!", procName, 1);
845  boxGetGeometry(box, px, py, pw, ph);
846  boxDestroy(&box);
847  return 0;
848 }
849 
850 
864 l_int32
866  BOXA *boxa,
867  l_int32 accesstype)
868 {
869  PROCNAME("pixaSetBoxa");
870 
871  if (!pixa)
872  return ERROR_INT("pixa not defined", procName, 1);
873  if (!boxa)
874  return ERROR_INT("boxa not defined", procName, 1);
875  if (accesstype != L_INSERT && accesstype != L_COPY &&
876  accesstype != L_CLONE)
877  return ERROR_INT("invalid access type", procName, 1);
878 
879  boxaDestroy(&pixa->boxa);
880  if (accesstype == L_INSERT)
881  pixa->boxa = boxa;
882  else
883  pixa->boxa = boxaCopy(boxa, accesstype);
884 
885  return 0;
886 }
887 
888 
903 PIX **
905 {
906  PROCNAME("pixaGetPixArray");
907 
908  if (!pixa)
909  return (PIX **)ERROR_PTR("pixa not defined", procName, NULL);
910 
911  return pixa->pix;
912 }
913 
914 
928 l_int32
930  l_int32 *psame,
931  l_int32 *pmaxd)
932 {
933 l_int32 i, n, d, maxd, same;
934 
935  PROCNAME("pixaVerifyDepth");
936 
937  if (pmaxd) *pmaxd = 0;
938  if (!psame)
939  return ERROR_INT("psame not defined", procName, 1);
940  if (!pixa)
941  return ERROR_INT("pixa not defined", procName, 1);
942  if ((n = pixaGetCount(pixa)) == 0)
943  return ERROR_INT("no pix in pixa", procName, 1);
944 
945  same = 1;
946  pixaGetPixDimensions(pixa, 0, NULL, NULL, &maxd);
947  for (i = 1; i < n; i++) {
948  if (pixaGetPixDimensions(pixa, i, NULL, NULL, &d))
949  return ERROR_INT("pix depth not found", procName, 1);
950  maxd = L_MAX(maxd, d);
951  if (d != maxd)
952  same = 0;
953  }
954  *psame = same;
955  if (pmaxd) *pmaxd = maxd;
956  return 0;
957 }
958 
959 
974 l_int32
976  l_int32 *psame,
977  l_int32 *pmaxw,
978  l_int32 *pmaxh)
979 {
980 l_int32 i, n, w, h, maxw, maxh, same;
981 
982  PROCNAME("pixaVerifyDimensions");
983 
984  if (pmaxw) *pmaxw = 0;
985  if (pmaxh) *pmaxh = 0;
986  if (!psame)
987  return ERROR_INT("psame not defined", procName, 1);
988  *psame = 0;
989  if (!pixa)
990  return ERROR_INT("pixa not defined", procName, 1);
991  if ((n = pixaGetCount(pixa)) == 0)
992  return ERROR_INT("no pix in pixa", procName, 1);
993 
994  same = 1;
995  pixaGetPixDimensions(pixa, 0, &maxw, &maxh, NULL);
996  for (i = 1; i < n; i++) {
997  if (pixaGetPixDimensions(pixa, i, &w, &h, NULL))
998  return ERROR_INT("pix dimensions not found", procName, 1);
999  maxw = L_MAX(maxw, w);
1000  maxh = L_MAX(maxh, h);
1001  if (w != maxw || h != maxh)
1002  same = 0;
1003  }
1004  *psame = same;
1005  if (pmaxw) *pmaxw = maxw;
1006  if (pmaxh) *pmaxh = maxh;
1007  return 0;
1008 }
1009 
1010 
1025 l_int32
1027  l_int32 *pfullpa,
1028  l_int32 *pfullba)
1029 {
1030 l_int32 i, n, full;
1031 BOXA *boxa;
1032 PIX *pix;
1033 
1034  PROCNAME("pixaIsFull");
1035 
1036  if (pfullpa) *pfullpa = 0;
1037  if (pfullba) *pfullba = 0;
1038  if (!pixa)
1039  return ERROR_INT("pixa not defined", procName, 1);
1040 
1041  n = pixaGetCount(pixa);
1042  if (pfullpa) {
1043  full = 1;
1044  for (i = 0; i < n; i++) {
1045  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL) {
1046  full = 0;
1047  break;
1048  }
1049  pixDestroy(&pix);
1050  }
1051  *pfullpa = full;
1052  }
1053  if (pfullba) {
1054  boxa = pixaGetBoxa(pixa, L_CLONE);
1055  boxaIsFull(boxa, pfullba);
1056  boxaDestroy(&boxa);
1057  }
1058  return 0;
1059 }
1060 
1061 
1075 l_int32
1077  l_int32 *pntext)
1078 {
1079 char *text;
1080 l_int32 i, n;
1081 PIX *pix;
1082 
1083  PROCNAME("pixaCountText");
1084 
1085  if (!pntext)
1086  return ERROR_INT("&ntext not defined", procName, 1);
1087  *pntext = 0;
1088  if (!pixa)
1089  return ERROR_INT("pixa not defined", procName, 1);
1090 
1091  n = pixaGetCount(pixa);
1092  for (i = 0; i < n; i++) {
1093  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1094  continue;
1095  text = pixGetText(pix);
1096  if (text && strlen(text) > 0)
1097  (*pntext)++;
1098  pixDestroy(&pix);
1099  }
1100 
1101  return 0;
1102 }
1103 
1104 
1118 l_int32
1120  SARRAY *sa)
1121 {
1122 char *str;
1123 l_int32 i, n;
1124 PIX *pix;
1125 
1126  PROCNAME("pixaSetText");
1127 
1128  if (!pixa)
1129  return ERROR_INT("pixa not defined", procName, 1);
1130 
1131  n = pixaGetCount(pixa);
1132  if (!sa) {
1133  for (i = 0; i < n; i++) {
1134  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1135  continue;
1136  pixSetText(pix, NULL);
1137  pixDestroy(&pix);
1138  }
1139  return 0;
1140  }
1141 
1142  if (sarrayGetCount(sa) != n)
1143  return ERROR_INT("pixa and sa sizes differ", procName, 1);
1144 
1145  for (i = 0; i < n; i++) {
1146  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
1147  continue;
1148  str = sarrayGetString(sa, i, L_NOCOPY);
1149  pixSetText(pix, str);
1150  pixDestroy(&pix);
1151  }
1152 
1153  return 0;
1154 }
1155 
1156 
1176 void ***
1178  l_int32 *psize)
1179 {
1180 l_int32 i, n, same;
1181 void **lineptrs;
1182 void ***lineset;
1183 PIX *pix;
1184 
1185  PROCNAME("pixaGetLinePtrs");
1186 
1187  if (psize) *psize = 0;
1188  if (!pixa)
1189  return (void ***)ERROR_PTR("pixa not defined", procName, NULL);
1190  pixaVerifyDepth(pixa, &same, NULL);
1191  if (!same)
1192  return (void ***)ERROR_PTR("pixa not all same depth", procName, NULL);
1193  n = pixaGetCount(pixa);
1194  if (psize) *psize = n;
1195  if ((lineset = (void ***)LEPT_CALLOC(n, sizeof(void **))) == NULL)
1196  return (void ***)ERROR_PTR("lineset not made", procName, NULL);
1197  for (i = 0; i < n; i++) {
1198  pix = pixaGetPix(pixa, i, L_CLONE);
1199  lineptrs = pixGetLinePtrs(pix, NULL);
1200  lineset[i] = lineptrs;
1201  pixDestroy(&pix);
1202  }
1203 
1204  return lineset;
1205 }
1206 
1207 
1208 /*---------------------------------------------------------------------*
1209  * Pixa output info *
1210  *---------------------------------------------------------------------*/
1224 l_int32
1226  PIXA *pixa)
1227 {
1228 char *text;
1229 l_int32 i, n, w, h, d, spp, count, hastext;
1230 PIX *pix;
1231 PIXCMAP *cmap;
1232 
1233  PROCNAME("pixaWriteStreamInfo");
1234 
1235  if (!fp)
1236  return ERROR_INT("stream not defined", procName, 1);
1237  if (!pixa)
1238  return ERROR_INT("pixa not defined", procName, 1);
1239 
1240  n = pixaGetCount(pixa);
1241  for (i = 0; i < n; i++) {
1242  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL) {
1243  fprintf(fp, "%d: no pix at this index\n", i);
1244  continue;
1245  }
1246  pixGetDimensions(pix, &w, &h, &d);
1247  spp = pixGetSpp(pix);
1248  text = pixGetText(pix);
1249  hastext = (text && strlen(text) > 0);
1250  if ((cmap = pixGetColormap(pix)) != NULL)
1251  count = pixcmapGetCount(cmap);
1252  fprintf(fp, "Pix %d: w = %d, h = %d, d = %d, spp = %d",
1253  i, w, h, d, spp);
1254  if (cmap) fprintf(fp, ", cmap(%d colors)", count);
1255  if (hastext) fprintf(fp, ", text = %s", text);
1256  fprintf(fp, "\n");
1257  pixDestroy(&pix);
1258  }
1259 
1260  return 0;
1261 }
1262 
1263 
1264 /*---------------------------------------------------------------------*
1265  * Pixa array modifiers *
1266  *---------------------------------------------------------------------*/
1282 l_int32
1284  l_int32 index,
1285  PIX *pix,
1286  BOX *box)
1287 {
1288 BOXA *boxa;
1289 
1290  PROCNAME("pixaReplacePix");
1291 
1292  if (!pixa)
1293  return ERROR_INT("pixa not defined", procName, 1);
1294  if (index < 0 || index >= pixa->n)
1295  return ERROR_INT("index not valid", procName, 1);
1296  if (!pix)
1297  return ERROR_INT("pix not defined", procName, 1);
1298 
1299  pixDestroy(&(pixa->pix[index]));
1300  pixa->pix[index] = pix;
1301 
1302  if (box) {
1303  boxa = pixa->boxa;
1304  if (index > boxa->n)
1305  return ERROR_INT("boxa index not valid", procName, 1);
1306  boxaReplaceBox(boxa, index, box);
1307  }
1308 
1309  return 0;
1310 }
1311 
1312 
1332 l_int32
1334  l_int32 index,
1335  PIX *pixs,
1336  BOX *box)
1337 {
1338 l_int32 i, n;
1339 
1340  PROCNAME("pixaInsertPix");
1341 
1342  if (!pixa)
1343  return ERROR_INT("pixa not defined", procName, 1);
1344  n = pixaGetCount(pixa);
1345  if (index < 0 || index > n)
1346  return ERROR_INT("index not in {0...n}", procName, 1);
1347  if (!pixs)
1348  return ERROR_INT("pixs not defined", procName, 1);
1349 
1350  if (n >= pixa->nalloc) { /* extend both ptr arrays */
1351  pixaExtendArray(pixa);
1352  boxaExtendArray(pixa->boxa);
1353  }
1354  pixa->n++;
1355  for (i = n; i > index; i--)
1356  pixa->pix[i] = pixa->pix[i - 1];
1357  pixa->pix[index] = pixs;
1358 
1359  /* Optionally, insert the box */
1360  if (box)
1361  boxaInsertBox(pixa->boxa, index, box);
1362 
1363  return 0;
1364 }
1365 
1366 
1382 l_int32
1384  l_int32 index)
1385 {
1386 l_int32 i, n, nbox;
1387 BOXA *boxa;
1388 PIX **array;
1389 
1390  PROCNAME("pixaRemovePix");
1391 
1392  if (!pixa)
1393  return ERROR_INT("pixa not defined", procName, 1);
1394  n = pixaGetCount(pixa);
1395  if (index < 0 || index >= n)
1396  return ERROR_INT("index not in {0...n - 1}", procName, 1);
1397 
1398  /* Remove the pix */
1399  array = pixa->pix;
1400  pixDestroy(&array[index]);
1401  for (i = index + 1; i < n; i++)
1402  array[i - 1] = array[i];
1403  array[n - 1] = NULL;
1404  pixa->n--;
1405 
1406  /* Remove the box if it exists */
1407  boxa = pixa->boxa;
1408  nbox = boxaGetCount(boxa);
1409  if (index < nbox)
1410  boxaRemoveBox(boxa, index);
1411 
1412  return 0;
1413 }
1414 
1415 
1434 l_int32
1436  l_int32 index,
1437  PIX **ppix,
1438  BOX **pbox)
1439 {
1440 l_int32 i, n, nbox;
1441 BOXA *boxa;
1442 PIX **array;
1443 
1444  PROCNAME("pixaRemovePixAndSave");
1445 
1446  if (ppix) *ppix = NULL;
1447  if (pbox) *pbox = NULL;
1448  if (!pixa)
1449  return ERROR_INT("pixa not defined", procName, 1);
1450  n = pixaGetCount(pixa);
1451  if (index < 0 || index >= n)
1452  return ERROR_INT("index not in {0...n - 1}", procName, 1);
1453 
1454  /* Remove the pix */
1455  array = pixa->pix;
1456  if (ppix)
1457  *ppix = pixaGetPix(pixa, index, L_CLONE);
1458  pixDestroy(&array[index]);
1459  for (i = index + 1; i < n; i++)
1460  array[i - 1] = array[i];
1461  array[n - 1] = NULL;
1462  pixa->n--;
1463 
1464  /* Remove the box if it exists */
1465  boxa = pixa->boxa;
1466  nbox = boxaGetCount(boxa);
1467  if (index < nbox)
1468  boxaRemoveBoxAndSave(boxa, index, pbox);
1469 
1470  return 0;
1471 }
1472 
1473 
1509 l_int32
1511  PIX *pix,
1512  BOX *box)
1513 {
1514 l_int32 i, n;
1515 PIX *pix1;
1516 
1517  PROCNAME("pixaInitFull");
1518 
1519  if (!pixa)
1520  return ERROR_INT("pixa not defined", procName, 1);
1521 
1522  n = pixa->nalloc;
1523  pixa->n = n;
1524  for (i = 0; i < n; i++) {
1525  if (pix)
1526  pix1 = pixCopy(NULL, pix);
1527  else
1528  pix1 = pixCreate(1, 1, 1);
1529  pixaReplacePix(pixa, i, pix1, NULL);
1530  }
1531  if (box)
1532  boxaInitFull(pixa->boxa, box);
1533 
1534  return 0;
1535 }
1536 
1537 
1551 l_int32
1553 {
1554 l_int32 i, n;
1555 
1556  PROCNAME("pixaClear");
1557 
1558  if (!pixa)
1559  return ERROR_INT("pixa not defined", procName, 1);
1560 
1561  n = pixaGetCount(pixa);
1562  for (i = 0; i < n; i++)
1563  pixDestroy(&pixa->pix[i]);
1564  pixa->n = 0;
1565  return boxaClear(pixa->boxa);
1566 }
1567 
1568 
1569 /*---------------------------------------------------------------------*
1570  * Pixa and Pixaa combination *
1571  *---------------------------------------------------------------------*/
1589 l_int32
1591  PIXA *pixas,
1592  l_int32 istart,
1593  l_int32 iend)
1594 {
1595 l_int32 i, n, nb;
1596 BOXA *boxas, *boxad;
1597 PIX *pix;
1598 
1599  PROCNAME("pixaJoin");
1600 
1601  if (!pixad)
1602  return ERROR_INT("pixad not defined", procName, 1);
1603  if (!pixas || ((n = pixaGetCount(pixas)) == 0))
1604  return 0;
1605 
1606  if (istart < 0)
1607  istart = 0;
1608  if (iend < 0 || iend >= n)
1609  iend = n - 1;
1610  if (istart > iend)
1611  return ERROR_INT("istart > iend; nothing to add", procName, 1);
1612 
1613  for (i = istart; i <= iend; i++) {
1614  pix = pixaGetPix(pixas, i, L_CLONE);
1615  pixaAddPix(pixad, pix, L_INSERT);
1616  }
1617 
1618  boxas = pixaGetBoxa(pixas, L_CLONE);
1619  boxad = pixaGetBoxa(pixad, L_CLONE);
1620  nb = pixaGetBoxaCount(pixas);
1621  iend = L_MIN(iend, nb - 1);
1622  boxaJoin(boxad, boxas, istart, iend);
1623  boxaDestroy(&boxas); /* just the clones */
1624  boxaDestroy(&boxad);
1625  return 0;
1626 }
1627 
1628 
1645 PIXA *
1647  PIXA *pixa2,
1648  l_int32 copyflag)
1649 {
1650 l_int32 i, n1, n2, n, nb1, nb2;
1651 BOX *box;
1652 PIX *pix;
1653 PIXA *pixad;
1654 
1655  PROCNAME("pixaInterleave");
1656 
1657  if (!pixa1)
1658  return (PIXA *)ERROR_PTR("pixa1 not defined", procName, NULL);
1659  if (!pixa2)
1660  return (PIXA *)ERROR_PTR("pixa2 not defined", procName, NULL);
1661  if (copyflag != L_COPY && copyflag != L_CLONE)
1662  return (PIXA *)ERROR_PTR("invalid copyflag", procName, NULL);
1663  n1 = pixaGetCount(pixa1);
1664  n2 = pixaGetCount(pixa2);
1665  n = L_MIN(n1, n2);
1666  if (n == 0)
1667  return (PIXA *)ERROR_PTR("at least one input pixa is empty",
1668  procName, NULL);
1669  if (n1 != n2)
1670  L_WARNING("counts differ: %d != %d\n", procName, n1, n2);
1671 
1672  pixad = pixaCreate(2 * n);
1673  nb1 = pixaGetBoxaCount(pixa1);
1674  nb2 = pixaGetBoxaCount(pixa2);
1675  for (i = 0; i < n; i++) {
1676  pix = pixaGetPix(pixa1, i, copyflag);
1677  pixaAddPix(pixad, pix, L_INSERT);
1678  if (i < nb1) {
1679  box = pixaGetBox(pixa1, i, L_COPY);
1680  pixaAddBox(pixad, box, L_INSERT);
1681  }
1682  pix = pixaGetPix(pixa2, i, copyflag);
1683  pixaAddPix(pixad, pix, L_INSERT);
1684  if (i < nb2) {
1685  box = pixaGetBox(pixa2, i, L_COPY);
1686  pixaAddBox(pixad, box, L_INSERT);
1687  }
1688  }
1689 
1690  return pixad;
1691 }
1692 
1693 
1710 l_int32
1712  PIXAA *paas,
1713  l_int32 istart,
1714  l_int32 iend)
1715 {
1716 l_int32 i, n;
1717 PIXA *pixa;
1718 
1719  PROCNAME("pixaaJoin");
1720 
1721  if (!paad)
1722  return ERROR_INT("pixaad not defined", procName, 1);
1723  if (!paas)
1724  return 0;
1725 
1726  if (istart < 0)
1727  istart = 0;
1728  n = pixaaGetCount(paas, NULL);
1729  if (iend < 0 || iend >= n)
1730  iend = n - 1;
1731  if (istart > iend)
1732  return ERROR_INT("istart > iend; nothing to add", procName, 1);
1733 
1734  for (i = istart; i <= iend; i++) {
1735  pixa = pixaaGetPixa(paas, i, L_CLONE);
1736  pixaaAddPixa(paad, pixa, L_INSERT);
1737  }
1738 
1739  return 0;
1740 }
1741 
1742 
1743 /*---------------------------------------------------------------------*
1744  * Pixaa creation and destruction *
1745  *---------------------------------------------------------------------*/
1768 PIXAA *
1769 pixaaCreate(l_int32 n)
1770 {
1771 PIXAA *paa;
1772 
1773  PROCNAME("pixaaCreate");
1774 
1775  if (n <= 0)
1776  n = INITIAL_PTR_ARRAYSIZE;
1777 
1778  if ((paa = (PIXAA *)LEPT_CALLOC(1, sizeof(PIXAA))) == NULL)
1779  return (PIXAA *)ERROR_PTR("paa not made", procName, NULL);
1780  paa->n = 0;
1781  paa->nalloc = n;
1782 
1783  if ((paa->pixa = (PIXA **)LEPT_CALLOC(n, sizeof(PIXA *))) == NULL) {
1784  pixaaDestroy(&paa);
1785  return (PIXAA *)ERROR_PTR("pixa ptrs not made", procName, NULL);
1786  }
1787  paa->boxa = boxaCreate(n);
1788 
1789  return paa;
1790 }
1791 
1792 
1813 PIXAA *
1815  l_int32 n,
1816  l_int32 type,
1817  l_int32 copyflag)
1818 {
1819 l_int32 count, i, j, npixa;
1820 PIX *pix;
1821 PIXA *pixat;
1822 PIXAA *paa;
1823 
1824  PROCNAME("pixaaCreateFromPixa");
1825 
1826  if (!pixa)
1827  return (PIXAA *)ERROR_PTR("pixa not defined", procName, NULL);
1828  count = pixaGetCount(pixa);
1829  if (count == 0)
1830  return (PIXAA *)ERROR_PTR("no pix in pixa", procName, NULL);
1831  if (n <= 0)
1832  return (PIXAA *)ERROR_PTR("n must be > 0", procName, NULL);
1833  if (type != L_CHOOSE_CONSECUTIVE && type != L_CHOOSE_SKIP_BY)
1834  return (PIXAA *)ERROR_PTR("invalid type", procName, NULL);
1835  if (copyflag != L_CLONE && copyflag != L_COPY)
1836  return (PIXAA *)ERROR_PTR("invalid copyflag", procName, NULL);
1837 
1838  if (type == L_CHOOSE_CONSECUTIVE)
1839  npixa = (count + n - 1) / n;
1840  else /* L_CHOOSE_SKIP_BY */
1841  npixa = L_MIN(n, count);
1842  paa = pixaaCreate(npixa);
1843  if (type == L_CHOOSE_CONSECUTIVE) {
1844  for (i = 0; i < count; i++) {
1845  if (i % n == 0)
1846  pixat = pixaCreate(n);
1847  pix = pixaGetPix(pixa, i, copyflag);
1848  pixaAddPix(pixat, pix, L_INSERT);
1849  if (i % n == n - 1)
1850  pixaaAddPixa(paa, pixat, L_INSERT);
1851  }
1852  if (i % n != 0)
1853  pixaaAddPixa(paa, pixat, L_INSERT);
1854  } else { /* L_CHOOSE_SKIP_BY */
1855  for (i = 0; i < npixa; i++) {
1856  pixat = pixaCreate(count / npixa + 1);
1857  for (j = i; j < count; j += n) {
1858  pix = pixaGetPix(pixa, j, copyflag);
1859  pixaAddPix(pixat, pix, L_INSERT);
1860  }
1861  pixaaAddPixa(paa, pixat, L_INSERT);
1862  }
1863  }
1864 
1865  return paa;
1866 }
1867 
1868 
1875 void
1877 {
1878 l_int32 i;
1879 PIXAA *paa;
1880 
1881  PROCNAME("pixaaDestroy");
1882 
1883  if (ppaa == NULL) {
1884  L_WARNING("ptr address is NULL!\n", procName);
1885  return;
1886  }
1887 
1888  if ((paa = *ppaa) == NULL)
1889  return;
1890 
1891  for (i = 0; i < paa->n; i++)
1892  pixaDestroy(&paa->pixa[i]);
1893  LEPT_FREE(paa->pixa);
1894  boxaDestroy(&paa->boxa);
1895 
1896  LEPT_FREE(paa);
1897  *ppaa = NULL;
1898 
1899  return;
1900 }
1901 
1902 
1903 /*---------------------------------------------------------------------*
1904  * Pixaa addition *
1905  *---------------------------------------------------------------------*/
1919 l_int32
1921  PIXA *pixa,
1922  l_int32 copyflag)
1923 {
1924 l_int32 n;
1925 PIXA *pixac;
1926 
1927  PROCNAME("pixaaAddPixa");
1928 
1929  if (!paa)
1930  return ERROR_INT("paa not defined", procName, 1);
1931  if (!pixa)
1932  return ERROR_INT("pixa not defined", procName, 1);
1933  if (copyflag != L_INSERT && copyflag != L_COPY &&
1934  copyflag != L_CLONE && copyflag != L_COPY_CLONE)
1935  return ERROR_INT("invalid copyflag", procName, 1);
1936 
1937  if (copyflag == L_INSERT) {
1938  pixac = pixa;
1939  } else {
1940  if ((pixac = pixaCopy(pixa, copyflag)) == NULL)
1941  return ERROR_INT("pixac not made", procName, 1);
1942  }
1943 
1944  n = pixaaGetCount(paa, NULL);
1945  if (n >= paa->nalloc)
1946  pixaaExtendArray(paa);
1947  paa->pixa[n] = pixac;
1948  paa->n++;
1949 
1950  return 0;
1951 }
1952 
1953 
1960 l_int32
1962 {
1963  PROCNAME("pixaaExtendArray");
1964 
1965  if (!paa)
1966  return ERROR_INT("paa not defined", procName, 1);
1967 
1968  if ((paa->pixa = (PIXA **)reallocNew((void **)&paa->pixa,
1969  sizeof(PIXA *) * paa->nalloc,
1970  2 * sizeof(PIXA *) * paa->nalloc)) == NULL)
1971  return ERROR_INT("new ptr array not returned", procName, 1);
1972 
1973  paa->nalloc = 2 * paa->nalloc;
1974  return 0;
1975 }
1976 
1977 
1988 l_int32
1990  l_int32 index,
1991  PIX *pix,
1992  BOX *box,
1993  l_int32 copyflag)
1994 {
1995 PIXA *pixa;
1996 
1997  PROCNAME("pixaaAddPix");
1998 
1999  if (!paa)
2000  return ERROR_INT("paa not defined", procName, 1);
2001  if (!pix)
2002  return ERROR_INT("pix not defined", procName, 1);
2003 
2004  if ((pixa = pixaaGetPixa(paa, index, L_CLONE)) == NULL)
2005  return ERROR_INT("pixa not found", procName, 1);
2006  pixaAddPix(pixa, pix, copyflag);
2007  if (box) pixaAddBox(pixa, box, copyflag);
2008  pixaDestroy(&pixa);
2009  return 0;
2010 }
2011 
2012 
2027 l_int32
2029  BOX *box,
2030  l_int32 copyflag)
2031 {
2032  PROCNAME("pixaaAddBox");
2033 
2034  if (!paa)
2035  return ERROR_INT("paa not defined", procName, 1);
2036  if (!box)
2037  return ERROR_INT("box not defined", procName, 1);
2038  if (copyflag != L_INSERT && copyflag != L_COPY && copyflag != L_CLONE)
2039  return ERROR_INT("invalid copyflag", procName, 1);
2040 
2041  boxaAddBox(paa->boxa, box, copyflag);
2042  return 0;
2043 }
2044 
2045 
2046 
2047 /*---------------------------------------------------------------------*
2048  * Pixaa accessors *
2049  *---------------------------------------------------------------------*/
2062 l_int32
2064  NUMA **pna)
2065 {
2066 l_int32 i, n;
2067 NUMA *na;
2068 PIXA *pixa;
2069 
2070  PROCNAME("pixaaGetCount");
2071 
2072  if (pna) *pna = NULL;
2073  if (!paa)
2074  return ERROR_INT("paa not defined", procName, 0);
2075 
2076  n = paa->n;
2077  if (pna) {
2078  if ((na = numaCreate(n)) == NULL)
2079  return ERROR_INT("na not made", procName, 0);
2080  *pna = na;
2081  for (i = 0; i < n; i++) {
2082  pixa = pixaaGetPixa(paa, i, L_CLONE);
2083  numaAddNumber(na, pixaGetCount(pixa));
2084  pixaDestroy(&pixa);
2085  }
2086  }
2087  return n;
2088 }
2089 
2090 
2111 PIXA *
2113  l_int32 index,
2114  l_int32 accesstype)
2115 {
2116 PIXA *pixa;
2117 
2118  PROCNAME("pixaaGetPixa");
2119 
2120  if (!paa)
2121  return (PIXA *)ERROR_PTR("paa not defined", procName, NULL);
2122  if (index < 0 || index >= paa->n)
2123  return (PIXA *)ERROR_PTR("index not valid", procName, NULL);
2124  if (accesstype != L_COPY && accesstype != L_CLONE &&
2125  accesstype != L_COPY_CLONE)
2126  return (PIXA *)ERROR_PTR("invalid accesstype", procName, NULL);
2127 
2128  if ((pixa = paa->pixa[index]) == NULL) { /* shouldn't happen! */
2129  L_ERROR("missing pixa[%d]\n", procName, index);
2130  return (PIXA *)ERROR_PTR("pixa not found at index", procName, NULL);
2131  }
2132  return pixaCopy(pixa, accesstype);
2133 }
2134 
2135 
2149 BOXA *
2151  l_int32 accesstype)
2152 {
2153  PROCNAME("pixaaGetBoxa");
2154 
2155  if (!paa)
2156  return (BOXA *)ERROR_PTR("paa not defined", procName, NULL);
2157  if (accesstype != L_COPY && accesstype != L_CLONE)
2158  return (BOXA *)ERROR_PTR("invalid access type", procName, NULL);
2159 
2160  return boxaCopy(paa->boxa, accesstype);
2161 }
2162 
2163 
2173 PIX *
2175  l_int32 index,
2176  l_int32 ipix,
2177  l_int32 accessflag)
2178 {
2179 PIX *pix;
2180 PIXA *pixa;
2181 
2182  PROCNAME("pixaaGetPix");
2183 
2184  if ((pixa = pixaaGetPixa(paa, index, L_CLONE)) == NULL)
2185  return (PIX *)ERROR_PTR("pixa not retrieved", procName, NULL);
2186  if ((pix = pixaGetPix(pixa, ipix, accessflag)) == NULL)
2187  L_ERROR("pix not retrieved\n", procName);
2188  pixaDestroy(&pixa);
2189  return pix;
2190 }
2191 
2192 
2206 l_int32
2208  l_int32 *psame,
2209  l_int32 *pmaxd)
2210 {
2211 l_int32 i, n, d, maxd, same, samed;
2212 PIXA *pixa;
2213 
2214  PROCNAME("pixaaVerifyDepth");
2215 
2216  if (pmaxd) *pmaxd = 0;
2217  if (!psame)
2218  return ERROR_INT("psame not defined", procName, 1);
2219  *psame = 0;
2220  if (!paa)
2221  return ERROR_INT("paa not defined", procName, 1);
2222  if ((n = pixaaGetCount(paa, NULL)) == 0)
2223  return ERROR_INT("no pixa in paa", procName, 1);
2224 
2225  pixa = pixaaGetPixa(paa, 0, L_CLONE);
2226  pixaVerifyDepth(pixa, &same, &maxd); /* init same, maxd with first pixa */
2227  pixaDestroy(&pixa);
2228  for (i = 1; i < n; i++) {
2229  pixa = pixaaGetPixa(paa, i, L_CLONE);
2230  pixaVerifyDepth(pixa, &samed, &d);
2231  pixaDestroy(&pixa);
2232  maxd = L_MAX(maxd, d);
2233  if (!samed || maxd != d)
2234  same = 0;
2235  }
2236  *psame = same;
2237  if (pmaxd) *pmaxd = maxd;
2238  return 0;
2239 }
2240 
2241 
2256 l_int32
2258  l_int32 *psame,
2259  l_int32 *pmaxw,
2260  l_int32 *pmaxh)
2261 {
2262 l_int32 i, n, w, h, maxw, maxh, same, same2;
2263 PIXA *pixa;
2264 
2265  PROCNAME("pixaaVerifyDimensions");
2266 
2267  if (pmaxw) *pmaxw = 0;
2268  if (pmaxh) *pmaxh = 0;
2269  if (!psame)
2270  return ERROR_INT("psame not defined", procName, 1);
2271  *psame = 0;
2272  if (!paa)
2273  return ERROR_INT("paa not defined", procName, 1);
2274  if ((n = pixaaGetCount(paa, NULL)) == 0)
2275  return ERROR_INT("no pixa in paa", procName, 1);
2276 
2277  /* Init same; init maxw and maxh from first pixa */
2278  pixa = pixaaGetPixa(paa, 0, L_CLONE);
2279  pixaVerifyDimensions(pixa, &same, &maxw, &maxh);
2280  pixaDestroy(&pixa);
2281 
2282  for (i = 1; i < n; i++) {
2283  pixa = pixaaGetPixa(paa, i, L_CLONE);
2284  pixaVerifyDimensions(pixa, &same2, &w, &h);
2285  pixaDestroy(&pixa);
2286  maxw = L_MAX(maxw, w);
2287  maxh = L_MAX(maxh, h);
2288  if (!same2 || maxw != w || maxh != h)
2289  same = 0;
2290  }
2291  *psame = same;
2292  if (pmaxw) *pmaxw = maxw;
2293  if (pmaxh) *pmaxh = maxh;
2294  return 0;
2295 }
2296 
2297 
2310 l_int32
2312  l_int32 *pfull)
2313 {
2314 l_int32 i, n, full;
2315 PIXA *pixa;
2316 
2317  PROCNAME("pixaaIsFull");
2318 
2319  if (!pfull)
2320  return ERROR_INT("&full not defined", procName, 0);
2321  *pfull = 0;
2322  if (!paa)
2323  return ERROR_INT("paa not defined", procName, 0);
2324 
2325  n = pixaaGetCount(paa, NULL);
2326  full = 1;
2327  for (i = 0; i < n; i++) {
2328  pixa = pixaaGetPixa(paa, i, L_CLONE);
2329  pixaIsFull(pixa, &full, NULL);
2330  pixaDestroy(&pixa);
2331  if (!full) break;
2332  }
2333  *pfull = full;
2334  return 0;
2335 }
2336 
2337 
2338 /*---------------------------------------------------------------------*
2339  * Pixaa array modifiers *
2340  *---------------------------------------------------------------------*/
2362 l_int32
2364  PIXA *pixa)
2365 {
2366 l_int32 i, n;
2367 PIXA *pixat;
2368 
2369  PROCNAME("pixaaInitFull");
2370 
2371  if (!paa)
2372  return ERROR_INT("paa not defined", procName, 1);
2373  if (!pixa)
2374  return ERROR_INT("pixa not defined", procName, 1);
2375 
2376  n = paa->nalloc;
2377  paa->n = n;
2378  for (i = 0; i < n; i++) {
2379  pixat = pixaCopy(pixa, L_COPY);
2380  pixaaReplacePixa(paa, i, pixat);
2381  }
2382 
2383  return 0;
2384 }
2385 
2386 
2404 l_int32
2406  l_int32 index,
2407  PIXA *pixa)
2408 {
2409 
2410  PROCNAME("pixaaReplacePixa");
2411 
2412  if (!paa)
2413  return ERROR_INT("paa not defined", procName, 1);
2414  if (index < 0 || index >= paa->n)
2415  return ERROR_INT("index not valid", procName, 1);
2416  if (!pixa)
2417  return ERROR_INT("pixa not defined", procName, 1);
2418 
2419  pixaDestroy(&(paa->pixa[index]));
2420  paa->pixa[index] = pixa;
2421  return 0;
2422 }
2423 
2424 
2437 l_int32
2439 {
2440 l_int32 i, n;
2441 
2442  PROCNAME("pixaClear");
2443 
2444  if (!paa)
2445  return ERROR_INT("paa not defined", procName, 1);
2446 
2447  n = pixaaGetCount(paa, NULL);
2448  for (i = 0; i < n; i++)
2449  pixaDestroy(&paa->pixa[i]);
2450  paa->n = 0;
2451  return 0;
2452 }
2453 
2454 
2468 l_int32
2470 {
2471 l_int32 i, n, np;
2472 PIXA *pixa;
2473 
2474  PROCNAME("pixaaTruncate");
2475 
2476  if (!paa)
2477  return ERROR_INT("paa not defined", procName, 1);
2478 
2479  n = pixaaGetCount(paa, NULL);
2480  for (i = n - 1; i >= 0; i--) {
2481  pixa = pixaaGetPixa(paa, i, L_CLONE);
2482  if (!pixa) {
2483  paa->n--;
2484  continue;
2485  }
2486  np = pixaGetCount(pixa);
2487  pixaDestroy(&pixa);
2488  if (np == 0) {
2489  pixaDestroy(&paa->pixa[i]);
2490  paa->n--;
2491  } else {
2492  break;
2493  }
2494  }
2495  return 0;
2496 }
2497 
2498 
2499 
2500 /*---------------------------------------------------------------------*
2501  * Pixa serialized I/O *
2502  *---------------------------------------------------------------------*/
2515 PIXA *
2516 pixaRead(const char *filename)
2517 {
2518 FILE *fp;
2519 PIXA *pixa;
2520 
2521  PROCNAME("pixaRead");
2522 
2523 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2524  return (PIXA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2525 #endif /* !HAVE_LIBPNG */
2526 
2527  if (!filename)
2528  return (PIXA *)ERROR_PTR("filename not defined", procName, NULL);
2529 
2530  if ((fp = fopenReadStream(filename)) == NULL)
2531  return (PIXA *)ERROR_PTR("stream not opened", procName, NULL);
2532  pixa = pixaReadStream(fp);
2533  fclose(fp);
2534  if (!pixa)
2535  return (PIXA *)ERROR_PTR("pixa not read", procName, NULL);
2536  return pixa;
2537 }
2538 
2539 
2552 PIXA *
2554 {
2555 l_int32 n, i, xres, yres, version;
2556 l_int32 ignore;
2557 BOXA *boxa;
2558 PIX *pix;
2559 PIXA *pixa;
2560 
2561  PROCNAME("pixaReadStream");
2562 
2563 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2564  return (PIXA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2565 #endif /* !HAVE_LIBPNG */
2566 
2567  if (!fp)
2568  return (PIXA *)ERROR_PTR("stream not defined", procName, NULL);
2569 
2570  if (fscanf(fp, "\nPixa Version %d\n", &version) != 1)
2571  return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL);
2572  if (version != PIXA_VERSION_NUMBER)
2573  return (PIXA *)ERROR_PTR("invalid pixa version", procName, NULL);
2574  if (fscanf(fp, "Number of pix = %d\n", &n) != 1)
2575  return (PIXA *)ERROR_PTR("not a pixa file", procName, NULL);
2576 
2577  if ((boxa = boxaReadStream(fp)) == NULL)
2578  return (PIXA *)ERROR_PTR("boxa not made", procName, NULL);
2579  if ((pixa = pixaCreate(n)) == NULL) {
2580  boxaDestroy(&boxa);
2581  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
2582  }
2583  boxaDestroy(&pixa->boxa);
2584  pixa->boxa = boxa;
2585 
2586  for (i = 0; i < n; i++) {
2587  if ((fscanf(fp, " pix[%d]: xres = %d, yres = %d\n",
2588  &ignore, &xres, &yres)) != 3) {
2589  pixaDestroy(&pixa);
2590  return (PIXA *)ERROR_PTR("res reading error", procName, NULL);
2591  }
2592  if ((pix = pixReadStreamPng(fp)) == NULL) {
2593  pixaDestroy(&pixa);
2594  return (PIXA *)ERROR_PTR("pix not read", procName, NULL);
2595  }
2596  pixSetXRes(pix, xres);
2597  pixSetYRes(pix, yres);
2598  pixaAddPix(pixa, pix, L_INSERT);
2599  }
2600  return pixa;
2601 }
2602 
2603 
2611 PIXA *
2612 pixaReadMem(const l_uint8 *data,
2613  size_t size)
2614 {
2615 FILE *fp;
2616 PIXA *pixa;
2617 
2618  PROCNAME("pixaReadMem");
2619 
2620  if (!data)
2621  return (PIXA *)ERROR_PTR("data not defined", procName, NULL);
2622  if ((fp = fopenReadFromMemory(data, size)) == NULL)
2623  return (PIXA *)ERROR_PTR("stream not opened", procName, NULL);
2624 
2625  pixa = pixaReadStream(fp);
2626  fclose(fp);
2627  if (!pixa) L_ERROR("pixa not read\n", procName);
2628  return pixa;
2629 }
2630 
2631 
2645 l_int32
2646 pixaWrite(const char *filename,
2647  PIXA *pixa)
2648 {
2649 l_int32 ret;
2650 FILE *fp;
2651 
2652  PROCNAME("pixaWrite");
2653 
2654 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2655  return ERROR_INT("no libpng: can't write data", procName, 1);
2656 #endif /* !HAVE_LIBPNG */
2657 
2658  if (!filename)
2659  return ERROR_INT("filename not defined", procName, 1);
2660  if (!pixa)
2661  return ERROR_INT("pixa not defined", procName, 1);
2662 
2663  if ((fp = fopenWriteStream(filename, "wb")) == NULL)
2664  return ERROR_INT("stream not opened", procName, 1);
2665  ret = pixaWriteStream(fp, pixa);
2666  fclose(fp);
2667  if (ret)
2668  return ERROR_INT("pixa not written to stream", procName, 1);
2669  return 0;
2670 }
2671 
2672 
2686 l_int32
2688  PIXA *pixa)
2689 {
2690 l_int32 n, i;
2691 PIX *pix;
2692 
2693  PROCNAME("pixaWriteStream");
2694 
2695 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2696  return ERROR_INT("no libpng: can't write data", procName, 1);
2697 #endif /* !HAVE_LIBPNG */
2698 
2699  if (!fp)
2700  return ERROR_INT("stream not defined", procName, 1);
2701  if (!pixa)
2702  return ERROR_INT("pixa not defined", procName, 1);
2703 
2704  n = pixaGetCount(pixa);
2705  fprintf(fp, "\nPixa Version %d\n", PIXA_VERSION_NUMBER);
2706  fprintf(fp, "Number of pix = %d\n", n);
2707  boxaWriteStream(fp, pixa->boxa);
2708  for (i = 0; i < n; i++) {
2709  if ((pix = pixaGetPix(pixa, i, L_CLONE)) == NULL)
2710  return ERROR_INT("pix not found", procName, 1);
2711  fprintf(fp, " pix[%d]: xres = %d, yres = %d\n",
2712  i, pix->xres, pix->yres);
2713  pixWriteStreamPng(fp, pix, 0.0);
2714  pixDestroy(&pix);
2715  }
2716  return 0;
2717 }
2718 
2719 
2733 l_int32
2734 pixaWriteMem(l_uint8 **pdata,
2735  size_t *psize,
2736  PIXA *pixa)
2737 {
2738 l_int32 ret;
2739 FILE *fp;
2740 
2741  PROCNAME("pixaWriteMem");
2742 
2743  if (pdata) *pdata = NULL;
2744  if (psize) *psize = 0;
2745  if (!pdata)
2746  return ERROR_INT("&data not defined", procName, 1);
2747  if (!psize)
2748  return ERROR_INT("&size not defined", procName, 1);
2749  if (!pixa)
2750  return ERROR_INT("pixa not defined", procName, 1);
2751 
2752 #if HAVE_FMEMOPEN
2753  if ((fp = open_memstream((char **)pdata, psize)) == NULL)
2754  return ERROR_INT("stream not opened", procName, 1);
2755  ret = pixaWriteStream(fp, pixa);
2756 #else
2757  L_INFO("work-around: writing to a temp file\n", procName);
2758  #ifdef _WIN32
2759  if ((fp = fopenWriteWinTempfile()) == NULL)
2760  return ERROR_INT("tmpfile stream not opened", procName, 1);
2761  #else
2762  if ((fp = tmpfile()) == NULL)
2763  return ERROR_INT("tmpfile stream not opened", procName, 1);
2764  #endif /* _WIN32 */
2765  ret = pixaWriteStream(fp, pixa);
2766  rewind(fp);
2767  *pdata = l_binaryReadStream(fp, psize);
2768 #endif /* HAVE_FMEMOPEN */
2769  fclose(fp);
2770  return ret;
2771 }
2772 
2773 
2786 PIXA *
2787 pixaReadBoth(const char *filename)
2788 {
2789 char buf[32];
2790 char *sname;
2791 PIXA *pixa;
2792 PIXAC *pac;
2793 
2794  PROCNAME("pixaReadBoth");
2795 
2796  if (!filename)
2797  return (PIXA *)ERROR_PTR("filename not defined", procName, NULL);
2798 
2799  l_getStructStrFromFile(filename, L_STR_NAME, &sname);
2800  if (!sname)
2801  return (PIXA *)ERROR_PTR("struct name not found", procName, NULL);
2802  snprintf(buf, sizeof(buf), "%s", sname);
2803  LEPT_FREE(sname);
2804 
2805  if (strcmp(buf, "Pixacomp") == 0) {
2806  if ((pac = pixacompRead(filename)) == NULL)
2807  return (PIXA *)ERROR_PTR("pac not made", procName, NULL);
2808  pixa = pixaCreateFromPixacomp(pac, L_COPY);
2809  pixacompDestroy(&pac);
2810  } else if (strcmp(buf, "Pixa") == 0) {
2811  if ((pixa = pixaRead(filename)) == NULL)
2812  return (PIXA *)ERROR_PTR("pixa not made", procName, NULL);
2813  } else {
2814  return (PIXA *)ERROR_PTR("invalid file type", procName, NULL);
2815  }
2816  return pixa;
2817 }
2818 
2819 
2820 /*---------------------------------------------------------------------*
2821  * Pixaa serialized I/O *
2822  *---------------------------------------------------------------------*/
2843 PIXAA *
2844 pixaaReadFromFiles(const char *dirname,
2845  const char *substr,
2846  l_int32 first,
2847  l_int32 nfiles)
2848 {
2849 char *fname;
2850 l_int32 i, n;
2851 PIXA *pixa;
2852 PIXAA *paa;
2853 SARRAY *sa;
2854 
2855  PROCNAME("pixaaReadFromFiles");
2856 
2857  if (!dirname)
2858  return (PIXAA *)ERROR_PTR("dirname not defined", procName, NULL);
2859 
2860  sa = getSortedPathnamesInDirectory(dirname, substr, first, nfiles);
2861  if (!sa || ((n = sarrayGetCount(sa)) == 0)) {
2862  sarrayDestroy(&sa);
2863  return (PIXAA *)ERROR_PTR("no pixa files found", procName, NULL);
2864  }
2865 
2866  paa = pixaaCreate(n);
2867  for (i = 0; i < n; i++) {
2868  fname = sarrayGetString(sa, i, L_NOCOPY);
2869  if ((pixa = pixaRead(fname)) == NULL) {
2870  L_ERROR("pixa not read for %d-th file", procName, i);
2871  continue;
2872  }
2873  pixaaAddPixa(paa, pixa, L_INSERT);
2874  }
2875 
2876  sarrayDestroy(&sa);
2877  return paa;
2878 }
2879 
2880 
2893 PIXAA *
2894 pixaaRead(const char *filename)
2895 {
2896 FILE *fp;
2897 PIXAA *paa;
2898 
2899  PROCNAME("pixaaRead");
2900 
2901 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2902  return (PIXAA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2903 #endif /* !HAVE_LIBPNG */
2904 
2905  if (!filename)
2906  return (PIXAA *)ERROR_PTR("filename not defined", procName, NULL);
2907 
2908  if ((fp = fopenReadStream(filename)) == NULL)
2909  return (PIXAA *)ERROR_PTR("stream not opened", procName, NULL);
2910  paa = pixaaReadStream(fp);
2911  fclose(fp);
2912  if (!paa)
2913  return (PIXAA *)ERROR_PTR("paa not read", procName, NULL);
2914  return paa;
2915 }
2916 
2917 
2930 PIXAA *
2932 {
2933 l_int32 n, i, version;
2934 l_int32 ignore;
2935 BOXA *boxa;
2936 PIXA *pixa;
2937 PIXAA *paa;
2938 
2939  PROCNAME("pixaaReadStream");
2940 
2941 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
2942  return (PIXAA *)ERROR_PTR("no libpng: can't read data", procName, NULL);
2943 #endif /* !HAVE_LIBPNG */
2944 
2945  if (!fp)
2946  return (PIXAA *)ERROR_PTR("stream not defined", procName, NULL);
2947 
2948  if (fscanf(fp, "\nPixaa Version %d\n", &version) != 1)
2949  return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL);
2950  if (version != PIXAA_VERSION_NUMBER)
2951  return (PIXAA *)ERROR_PTR("invalid pixaa version", procName, NULL);
2952  if (fscanf(fp, "Number of pixa = %d\n", &n) != 1)
2953  return (PIXAA *)ERROR_PTR("not a pixaa file", procName, NULL);
2954 
2955  if ((paa = pixaaCreate(n)) == NULL)
2956  return (PIXAA *)ERROR_PTR("paa not made", procName, NULL);
2957  if ((boxa = boxaReadStream(fp)) == NULL) {
2958  pixaaDestroy(&paa);
2959  return (PIXAA *)ERROR_PTR("boxa not made", procName, NULL);
2960  }
2961  boxaDestroy(&paa->boxa);
2962  paa->boxa = boxa;
2963 
2964  for (i = 0; i < n; i++) {
2965  if ((fscanf(fp, "\n\n --------------- pixa[%d] ---------------\n",
2966  &ignore)) != 1) {
2967  pixaaDestroy(&paa);
2968  return (PIXAA *)ERROR_PTR("text reading", procName, NULL);
2969  }
2970  if ((pixa = pixaReadStream(fp)) == NULL) {
2971  pixaaDestroy(&paa);
2972  return (PIXAA *)ERROR_PTR("pixa not read", procName, NULL);
2973  }
2974  pixaaAddPixa(paa, pixa, L_INSERT);
2975  }
2976 
2977  return paa;
2978 }
2979 
2980 
2988 PIXAA *
2989 pixaaReadMem(const l_uint8 *data,
2990  size_t size)
2991 {
2992 FILE *fp;
2993 PIXAA *paa;
2994 
2995  PROCNAME("paaReadMem");
2996 
2997  if (!data)
2998  return (PIXAA *)ERROR_PTR("data not defined", procName, NULL);
2999  if ((fp = fopenReadFromMemory(data, size)) == NULL)
3000  return (PIXAA *)ERROR_PTR("stream not opened", procName, NULL);
3001 
3002  paa = pixaaReadStream(fp);
3003  fclose(fp);
3004  if (!paa) L_ERROR("paa not read\n", procName);
3005  return paa;
3006 }
3007 
3008 
3022 l_int32
3023 pixaaWrite(const char *filename,
3024  PIXAA *paa)
3025 {
3026 l_int32 ret;
3027 FILE *fp;
3028 
3029  PROCNAME("pixaaWrite");
3030 
3031 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
3032  return ERROR_INT("no libpng: can't read data", procName, 1);
3033 #endif /* !HAVE_LIBPNG */
3034 
3035  if (!filename)
3036  return ERROR_INT("filename not defined", procName, 1);
3037  if (!paa)
3038  return ERROR_INT("paa not defined", procName, 1);
3039 
3040  if ((fp = fopenWriteStream(filename, "wb")) == NULL)
3041  return ERROR_INT("stream not opened", procName, 1);
3042  ret = pixaaWriteStream(fp, paa);
3043  fclose(fp);
3044  if (ret)
3045  return ERROR_INT("paa not written to stream", procName, 1);
3046  return 0;
3047 }
3048 
3049 
3063 l_int32
3065  PIXAA *paa)
3066 {
3067 l_int32 n, i;
3068 PIXA *pixa;
3069 
3070  PROCNAME("pixaaWriteStream");
3071 
3072 #if !HAVE_LIBPNG /* defined in environ.h and config_auto.h */
3073  return ERROR_INT("no libpng: can't read data", procName, 1);
3074 #endif /* !HAVE_LIBPNG */
3075 
3076  if (!fp)
3077  return ERROR_INT("stream not defined", procName, 1);
3078  if (!paa)
3079  return ERROR_INT("paa not defined", procName, 1);
3080 
3081  n = pixaaGetCount(paa, NULL);
3082  fprintf(fp, "\nPixaa Version %d\n", PIXAA_VERSION_NUMBER);
3083  fprintf(fp, "Number of pixa = %d\n", n);
3084  boxaWriteStream(fp, paa->boxa);
3085  for (i = 0; i < n; i++) {
3086  if ((pixa = pixaaGetPixa(paa, i, L_CLONE)) == NULL)
3087  return ERROR_INT("pixa not found", procName, 1);
3088  fprintf(fp, "\n\n --------------- pixa[%d] ---------------\n", i);
3089  pixaWriteStream(fp, pixa);
3090  pixaDestroy(&pixa);
3091  }
3092  return 0;
3093 }
3094 
3095 
3109 l_int32
3110 pixaaWriteMem(l_uint8 **pdata,
3111  size_t *psize,
3112  PIXAA *paa)
3113 {
3114 l_int32 ret;
3115 FILE *fp;
3116 
3117  PROCNAME("pixaaWriteMem");
3118 
3119  if (pdata) *pdata = NULL;
3120  if (psize) *psize = 0;
3121  if (!pdata)
3122  return ERROR_INT("&data not defined", procName, 1);
3123  if (!psize)
3124  return ERROR_INT("&size not defined", procName, 1);
3125  if (!paa)
3126  return ERROR_INT("paa not defined", procName, 1);
3127 
3128 #if HAVE_FMEMOPEN
3129  if ((fp = open_memstream((char **)pdata, psize)) == NULL)
3130  return ERROR_INT("stream not opened", procName, 1);
3131  ret = pixaaWriteStream(fp, paa);
3132 #else
3133  L_INFO("work-around: writing to a temp file\n", procName);
3134  #ifdef _WIN32
3135  if ((fp = fopenWriteWinTempfile()) == NULL)
3136  return ERROR_INT("tmpfile stream not opened", procName, 1);
3137  #else
3138  if ((fp = tmpfile()) == NULL)
3139  return ERROR_INT("tmpfile stream not opened", procName, 1);
3140  #endif /* _WIN32 */
3141  ret = pixaaWriteStream(fp, paa);
3142  rewind(fp);
3143  *pdata = l_binaryReadStream(fp, psize);
3144 #endif /* HAVE_FMEMOPEN */
3145  fclose(fp);
3146  return ret;
3147 }
3148 
BOXA * boxaReadStream(FILE *fp)
boxaReadStream()
Definition: boxbasic.c:2122
l_int32 pixCopyColormap(PIX *pixd, PIX *pixs)
pixCopyColormap()
Definition: pix1.c:735
PIXA * pixaInterleave(PIXA *pixa1, PIXA *pixa2, l_int32 copyflag)
pixaInterleave()
Definition: pixabasic.c:1646
l_int32 pixaaReplacePixa(PIXAA *paa, l_int32 index, PIXA *pixa)
pixaaReplacePixa()
Definition: pixabasic.c:2405
void pixaaDestroy(PIXAA **ppaa)
pixaaDestroy()
Definition: pixabasic.c:1876
l_int32 pixaExtendArrayToSize(PIXA *pixa, l_int32 size)
pixaExtendArrayToSize()
Definition: pixabasic.c:591
l_int32 pixaReplacePix(PIXA *pixa, l_int32 index, PIX *pix, BOX *box)
pixaReplacePix()
Definition: pixabasic.c:1283
l_int32 pixWriteStreamPng(FILE *fp, PIX *pix, l_float32 gamma)
pixWriteStreamPng()
Definition: pngio.c:1006
PIXAA * pixaaCreate(l_int32 n)
pixaaCreate()
Definition: pixabasic.c:1769
l_int32 boxaExtendArray(BOXA *boxa)
boxaExtendArray()
Definition: boxbasic.c:662
l_int32 xres
Definition: pix.h:142
l_int32 n
Definition: pix.h:494
l_int32 pixaIsFull(PIXA *pixa, l_int32 *pfullpa, l_int32 *pfullba)
pixaIsFull()
Definition: pixabasic.c:1026
l_int32 pixaaIsFull(PIXAA *paa, l_int32 *pfull)
pixaaIsFull()
Definition: pixabasic.c:2311
l_int32 numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
Definition: numabasic.c:472
PIX * pixReadStreamPng(FILE *fp)
pixReadStreamPng()
Definition: pngio.c:185
PIXAA * pixaaReadMem(const l_uint8 *data, size_t size)
pixaaReadMem()
Definition: pixabasic.c:2989
struct Boxa * boxa
Definition: pix.h:460
l_int32 pixaaAddPixa(PIXAA *paa, PIXA *pixa, l_int32 copyflag)
pixaaAddPixa()
Definition: pixabasic.c:1920
l_int32 boxaWriteStream(FILE *fp, BOXA *boxa)
boxaWriteStream()
Definition: boxbasic.c:2225
PIXA * pixaReadMem(const l_uint8 *data, size_t size)
pixaReadMem()
Definition: pixabasic.c:2612
PIXA * pixaCreate(l_int32 n)
pixaCreate()
Definition: pixabasic.c:161
l_int32 boxaExtendArrayToSize(BOXA *boxa, l_int32 size)
boxaExtendArrayToSize()
Definition: boxbasic.c:686
PIXAC * pixacompRead(const char *filename)
pixacompRead()
Definition: pixcomp.c:1597
Definition: pix.h:704
l_int32 pixSetAllArbitrary(PIX *pix, l_uint32 val)
pixSetAllArbitrary()
Definition: pix2.c:864
l_int32 yres
Definition: pix.h:144
l_int32 pixaaAddPix(PIXAA *paa, l_int32 index, PIX *pix, BOX *box, l_int32 copyflag)
pixaaAddPix()
Definition: pixabasic.c:1989
PIXAA * pixaaReadStream(FILE *fp)
pixaaReadStream()
Definition: pixabasic.c:2931
PIXA * pixaaGetPixa(PIXAA *paa, l_int32 index, l_int32 accesstype)
pixaaGetPixa()
Definition: pixabasic.c:2112
PIXA * pixaCreateFromPixacomp(PIXAC *pixac, l_int32 accesstype)
pixaCreateFromPixacomp()
Definition: pixcomp.c:1424
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
Definition: pix1.c:1772
PIXA * pixaRead(const char *filename)
pixaRead()
Definition: pixabasic.c:2516
l_int32 boxaRemoveBox(BOXA *boxa, l_int32 index)
boxaRemoveBox()
Definition: boxbasic.c:1025
l_int32 pixaInsertPix(PIXA *pixa, l_int32 index, PIX *pixs, BOX *box)
pixaInsertPix()
Definition: pixabasic.c:1333
l_int32 pixaaGetCount(PIXAA *paa, NUMA **pna)
pixaaGetCount()
Definition: pixabasic.c:2063
l_int32 boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
Definition: boxbasic.c:615
PIXAA * pixaaReadFromFiles(const char *dirname, const char *substr, l_int32 first, l_int32 nfiles)
pixaaReadFromFiles()
Definition: pixabasic.c:2844
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:336
FILE * fopenReadFromMemory(const l_uint8 *data, size_t size)
fopenReadFromMemory()
Definition: utils2.c:1670
PIXA * pixaReadBoth(const char *filename)
pixaReadBoth()
Definition: pixabasic.c:2787
BOXA * boxaCopy(BOXA *boxa, l_int32 copyflag)
boxaCopy()
Definition: boxbasic.c:531
NUMA * numaCreate(l_int32 n)
numaCreate()
Definition: numabasic.c:186
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
Definition: boxbasic.c:577
BOX * pixaGetBox(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetBox()
Definition: pixabasic.c:785
l_int32 boxaJoin(BOXA *boxad, BOXA *boxas, l_int32 istart, l_int32 iend)
boxaJoin()
Definition: boxfunc1.c:2312
l_int32 pixaClear(PIXA *pixa)
pixaClear()
Definition: pixabasic.c:1552
l_int32 pixaaWriteMem(l_uint8 **pdata, size_t *psize, PIXAA *paa)
pixaaWriteMem()
Definition: pixabasic.c:3110
l_uint32 refcount
Definition: pix.h:458
l_int32 pixaaExtendArray(PIXAA *paa)
pixaaExtendArray()
Definition: pixabasic.c:1961
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
Definition: pix5.c:1013
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:1102
l_int32 pixaGetBoxaCount(PIXA *pixa)
pixaGetBoxaCount()
Definition: pixabasic.c:753
l_int32 pixaRemovePixAndSave(PIXA *pixa, l_int32 index, PIX **ppix, BOX **pbox)
pixaRemovePixAndSave()
Definition: pixabasic.c:1435
PIX ** pixaGetPixArray(PIXA *pixa)
pixaGetPixArray()
Definition: pixabasic.c:904
l_int32 pixaaVerifyDepth(PIXAA *paa, l_int32 *psame, l_int32 *pmaxd)
pixaaVerifyDepth()
Definition: pixabasic.c:2207
l_int32 pixaVerifyDepth(PIXA *pixa, l_int32 *psame, l_int32 *pmaxd)
pixaVerifyDepth()
Definition: pixabasic.c:929
l_int32 boxaClear(BOXA *boxa)
boxaClear()
Definition: boxbasic.c:1210
PIX * pixaaGetPix(PIXAA *paa, l_int32 index, l_int32 ipix, l_int32 accessflag)
pixaaGetPix()
Definition: pixabasic.c:2174
Definition: array.h:116
l_int32 pixaVerifyDimensions(PIXA *pixa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaVerifyDimensions()
Definition: pixabasic.c:975
l_int32 pixaaAddBox(PIXAA *paa, BOX *box, l_int32 copyflag)
pixaaAddBox()
Definition: pixabasic.c:2028
BOX * boxClone(BOX *box)
boxClone()
Definition: boxbasic.c:251
l_int32 pixaaClear(PIXAA *paa)
pixaaClear()
Definition: pixabasic.c:2438
PIXA * pixaCopy(PIXA *pixa, l_int32 copyflag)
pixaCopy()
Definition: pixabasic.c:440
l_int32 pixaWriteStream(FILE *fp, PIXA *pixa)
pixaWriteStream()
Definition: pixabasic.c:2687
l_int32 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_int32 boxaIsFull(BOXA *boxa, l_int32 *pfull)
boxaIsFull()
Definition: boxbasic.c:896
Definition: array.h:59
static const l_int32 L_INSERT
Definition: pix.h:710
l_int32 pixaCountText(PIXA *pixa, l_int32 *pntext)
pixaCountText()
Definition: pixabasic.c:1076
l_int32 pixaWrite(const char *filename, PIXA *pixa)
pixaWrite()
Definition: pixabasic.c:2646
l_int32 pixaGetPixDimensions(PIXA *pixa, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixaGetPixDimensions()
Definition: pixabasic.c:695
l_int32 pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
Definition: pixabasic.c:493
l_int32 boxaInsertBox(BOXA *boxa, l_int32 index, BOX *box)
boxaInsertBox()
Definition: boxbasic.c:980
PIXA * pixaCreateFromPix(PIX *pixs, l_int32 n, l_int32 cellw, l_int32 cellh)
pixaCreateFromPix()
Definition: pixabasic.c:200
l_int32 pixClearAll(PIX *pix)
pixClearAll()
Definition: pix2.c:700
l_int32 boxaInitFull(BOXA *boxa, BOX *box)
boxaInitFull()
Definition: boxbasic.c:1173
#define PIXAA_VERSION_NUMBER
Definition: pix.h:448
struct Pix ** pix
Definition: pix.h:459
l_int32 boxGetGeometry(BOX *box, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
boxGetGeometry()
Definition: boxbasic.c:309
FILE * fopenWriteWinTempfile()
fopenWriteWinTempfile()
Definition: utils2.c:1716
char * sarrayGetString(SARRAY *sa, l_int32 index, l_int32 copyflag)
sarrayGetString()
Definition: sarray1.c:675
PIXA * pixaReadStream(FILE *fp)
pixaReadStream()
Definition: pixabasic.c:2553
PIX * pixClone(PIX *pixs)
pixClone()
Definition: pix1.c:517
Definition: pix.h:658
l_int32 nalloc
Definition: pix.h:457
void pixacompDestroy(PIXAC **ppixac)
pixacompDestroy()
Definition: pixcomp.c:819
PIXAA * pixaaRead(const char *filename)
pixaaRead()
Definition: pixabasic.c:2894
void pixDestroy(PIX **ppix)
pixDestroy()
Definition: pix1.c:545
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
Definition: boxbasic.c:760
l_int32 n
Definition: pix.h:467
l_int32 pixaSetText(PIXA *pixa, SARRAY *sa)
pixaSetText()
Definition: pixabasic.c:1119
struct Pixa ** pixa
Definition: pix.h:469
l_int32 pixaChangeRefcount(PIXA *pixa, l_int32 delta)
pixaChangeRefcount()
Definition: pixabasic.c:638
l_int32 pixaaInitFull(PIXAA *paa, PIXA *pixa)
pixaaInitFull()
Definition: pixabasic.c:2363
static l_int32 pixaExtendArray(PIXA *pixa)
pixaExtendArray()
Definition: pixabasic.c:567
void *** pixaGetLinePtrs(PIXA *pixa, l_int32 *psize)
pixaGetLinePtrs()
Definition: pixabasic.c:1177
SARRAY * getSortedPathnamesInDirectory(const char *dirname, const char *substr, l_int32 first, l_int32 nfiles)
getSortedPathnamesInDirectory()
Definition: sarray1.c:1710
Definition: pix.h:454
l_int32 pixaaJoin(PIXAA *paad, PIXAA *paas, l_int32 istart, l_int32 iend)
pixaaJoin()
Definition: pixabasic.c:1711
Definition: pix.h:465
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
Definition: utils2.c:1636
#define PIXA_VERSION_NUMBER
Definition: pix.h:449
l_int32 pixaWriteMem(l_uint8 **pdata, size_t *psize, PIXA *pixa)
pixaWriteMem()
Definition: pixabasic.c:2734
PIXA * pixaCreateFromBoxa(PIX *pixs, BOXA *boxa, l_int32 *pcropwarn)
pixaCreateFromBoxa()
Definition: pixabasic.c:263
FILE * fopenReadStream(const char *filename)
fopenReadStream()
Definition: utils2.c:1593
PIXAA * pixaaCreateFromPixa(PIXA *pixa, l_int32 n, l_int32 type, l_int32 copyflag)
pixaaCreateFromPixa()
Definition: pixabasic.c:1814
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
Definition: utils2.c:1200
l_int32 sarrayGetCount(SARRAY *sa)
sarrayGetCount()
Definition: sarray1.c:615
l_int32 pixaWriteStreamInfo(FILE *fp, PIXA *pixa)
pixaWriteStreamInfo()
Definition: pixabasic.c:1225
char * pixGetText(PIX *pix)
pixGetText()
Definition: pix1.c:1442
l_int32 pixaJoin(PIXA *pixad, PIXA *pixas, l_int32 istart, l_int32 iend)
pixaJoin()
Definition: pixabasic.c:1590
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
Definition: pixabasic.c:660
Definition: pix.h:705
l_int32 pixClipToForeground(PIX *pixs, PIX **ppixd, BOX **pbox)
pixClipToForeground()
Definition: pix5.c:1455
l_int32 pixcmapGetCount(PIXCMAP *cmap)
pixcmapGetCount()
Definition: colormap.c:593
l_int32 nalloc
Definition: pix.h:468
l_int32 pixaGetBoxGeometry(PIXA *pixa, l_int32 index, l_int32 *px, l_int32 *py, l_int32 *pw, l_int32 *ph)
pixaGetBoxGeometry()
Definition: pixabasic.c:823
BOX * boxCopy(BOX *box)
boxCopy()
Definition: boxbasic.c:229
Definition: pix.h:134
Definition: pix.h:706
l_int32 pixaRemovePix(PIXA *pixa, l_int32 index)
pixaRemovePix()
Definition: pixabasic.c:1383
l_int32 pixaAddBox(PIXA *pixa, BOX *box, l_int32 copyflag)
pixaAddBox()
Definition: pixabasic.c:537
l_int32 pixaaVerifyDimensions(PIXAA *paa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaaVerifyDimensions()
Definition: pixabasic.c:2257
BOXA * boxaCreate(l_int32 n)
boxaCreate()
Definition: boxbasic.c:496
#define PIX_SRC
Definition: pix.h:327
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
Definition: pix1.c:630
l_int32 pixaaWrite(const char *filename, PIXAA *paa)
pixaaWrite()
Definition: pixabasic.c:3023
void boxDestroy(BOX **pbox)
boxDestroy()
Definition: boxbasic.c:277
l_int32 boxaGetExtent(BOXA *boxa, l_int32 *pw, l_int32 *ph, BOX **pbox)
boxaGetExtent()
Definition: boxfunc4.c:2321
l_int32 pixaaTruncate(PIXAA *paa)
pixaaTruncate()
Definition: pixabasic.c:2469
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
Definition: boxbasic.c:715
l_int32 pixaInitFull(PIXA *pixa, PIX *pix, BOX *box)
pixaInitFull()
Definition: pixabasic.c:1510
BOXA * pixaaGetBoxa(PIXAA *paa, l_int32 accesstype)
pixaaGetBoxa()
Definition: pixabasic.c:2150
l_int32 pixSetAll(PIX *pix)
pixSetAll()
Definition: pix2.c:729
l_int32 pixGetDimensions(PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
Definition: pix1.c:1052
struct Box ** box
Definition: pix.h:497
l_int32 boxaRemoveBoxAndSave(BOXA *boxa, l_int32 index, BOX **pbox)
boxaRemoveBoxAndSave()
Definition: boxbasic.c:1067
struct Boxa * boxa
Definition: pix.h:470
Definition: pix.h:480
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
Definition: pixabasic.c:398
l_int32 pixaSetBoxa(PIXA *pixa, BOXA *boxa, l_int32 accesstype)
pixaSetBoxa()
Definition: pixabasic.c:865
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
Definition: pixabasic.c:620
l_int32 pixSetText(PIX *pix, const char *textstring)
pixSetText()
Definition: pix1.c:1466
l_int32 boxaReplaceBox(BOXA *boxa, l_int32 index, BOX *box)
boxaReplaceBox()
Definition: boxbasic.c:942
void sarrayDestroy(SARRAY **psa)
sarrayDestroy()
Definition: sarray1.c:349
l_int32 pixaaWriteStream(FILE *fp, PIXAA *paa)
pixaaWriteStream()
Definition: pixabasic.c:3064
BOXA * pixaGetBoxa(PIXA *pixa, l_int32 accesstype)
pixaGetBoxa()
Definition: pixabasic.c:729