96 #include <config_auto.h> 100 #include "allheaders.h" 102 static const l_uint32 MaxArraySize = 100000000;
103 static const l_uint32 MaxPtrArraySize = 10000000;
124 PROCNAME(
"ptaCreate");
126 if (n <= 0 || n > MaxArraySize)
129 pta = (
PTA *)LEPT_CALLOC(1,
sizeof(
PTA));
132 ptaChangeRefcount(pta, 1);
133 pta->x = (l_float32 *)LEPT_CALLOC(n,
sizeof(l_float32));
134 pta->
y = (l_float32 *)LEPT_CALLOC(n,
sizeof(l_float32));
135 if (!pta->x || !pta->
y) {
137 return (
PTA *)ERROR_PTR(
"x and y arrays not both made", procName, NULL);
156 l_float32 startx, delx, xval, yval;
159 PROCNAME(
"ptaCreateFromNuma");
162 return (
PTA *)ERROR_PTR(
"nay not defined", procName, NULL);
165 return (
PTA *)ERROR_PTR(
"nax and nay sizes differ", procName, NULL);
169 for (i = 0; i < n; i++) {
173 xval = startx + i * delx;
199 PROCNAME(
"ptaDestroy");
202 L_WARNING(
"ptr address is NULL!\n", procName);
206 if ((pta = *ppta) == NULL)
209 ptaChangeRefcount(pta, -1);
210 if (ptaGetRefcount(pta) <= 0) {
235 return (
PTA *)ERROR_PTR(
"pta not defined", procName, NULL);
238 return (
PTA *)ERROR_PTR(
"npta not made", procName, NULL);
240 for (i = 0; i < pta->
n; i++) {
265 PROCNAME(
"ptaCopyRange");
268 return (
PTA *)ERROR_PTR(
"ptas not defined", procName, NULL);
273 return (
PTA *)ERROR_PTR(
"istart out of bounds", procName, NULL);
274 if (iend <= 0 || iend >= n)
277 return (
PTA *)ERROR_PTR(
"istart > iend; no pts", procName, NULL);
279 if ((ptad =
ptaCreate(iend - istart + 1)) == NULL)
280 return (
PTA *)ERROR_PTR(
"ptad not made", procName, NULL);
281 for (i = istart; i <= iend; i++) {
299 PROCNAME(
"ptaClone");
302 return (
PTA *)ERROR_PTR(
"pta not defined", procName, NULL);
304 ptaChangeRefcount(pta, 1);
323 PROCNAME(
"ptaEmpty");
326 return ERROR_INT(
"ptad not defined", procName, 1);
349 PROCNAME(
"ptaAddPt");
352 return ERROR_INT(
"pta not defined", procName, 1);
357 return ERROR_INT(
"extension failed", procName, 1);
382 size_t oldsize, newsize;
384 PROCNAME(
"ptaExtendArrays");
387 return ERROR_INT(
"pta not defined", procName, 1);
388 if (pta->
nalloc > MaxArraySize)
389 return ERROR_INT(
"pta at maximum size; can't extend", procName, 1);
390 oldsize = 4 * pta->
nalloc;
391 if (pta->
nalloc > MaxArraySize / 2) {
392 newsize = 4 * MaxArraySize;
393 pta->
nalloc = MaxArraySize;
395 newsize = 2 * oldsize;
398 if ((pta->x = (l_float32 *)
reallocNew((
void **)&pta->x,
399 oldsize, newsize)) == NULL)
400 return ERROR_INT(
"new x array not returned", procName, 1);
402 oldsize, newsize)) == NULL)
403 return ERROR_INT(
"new y array not returned", procName, 1);
428 PROCNAME(
"ptaInsertPt");
431 return ERROR_INT(
"pta not defined", procName, 1);
433 if (index < 0 || index > n) {
434 L_ERROR(
"index %d not in [0,...,%d]\n", procName, index, n);
440 return ERROR_INT(
"extension failed", procName, 1);
443 for (i = n; i > index; i--) {
444 pta->x[i] = pta->x[i - 1];
445 pta->
y[i] = pta->
y[i - 1];
473 PROCNAME(
"ptaRemovePt");
476 return ERROR_INT(
"pta not defined", procName, 1);
478 if (index < 0 || index >= n) {
479 L_ERROR(
"index %d not in [0,...,%d]\n", procName, index, n - 1);
484 for (i = index + 1; i < n; i++) {
485 pta->x[i - 1] = pta->x[i];
486 pta->
y[i - 1] = pta->
y[i];
497 ptaGetRefcount(
PTA *pta)
499 PROCNAME(
"ptaGetRefcount");
502 return ERROR_INT(
"pta not defined", procName, 1);
508 ptaChangeRefcount(
PTA *pta,
511 PROCNAME(
"ptaChangeRefcount");
514 return ERROR_INT(
"pta not defined", procName, 1);
529 PROCNAME(
"ptaGetCount");
532 return ERROR_INT(
"pta not defined", procName, 0);
553 PROCNAME(
"ptaGetPt");
558 return ERROR_INT(
"pta not defined", procName, 1);
559 if (index < 0 || index >= pta->
n)
560 return ERROR_INT(
"invalid index", procName, 1);
562 if (px) *px = pta->x[index];
563 if (py) *py = pta->
y[index];
583 PROCNAME(
"ptaGetIPt");
588 return ERROR_INT(
"pta not defined", procName, 1);
589 if (index < 0 || index >= pta->
n)
590 return ERROR_INT(
"invalid index", procName, 1);
592 if (px) *px = (l_int32)(pta->x[index] + 0.5);
593 if (py) *py = (l_int32)(pta->
y[index] + 0.5);
612 PROCNAME(
"ptaSetPt");
615 return ERROR_INT(
"pta not defined", procName, 1);
616 if (index < 0 || index >= pta->
n)
617 return ERROR_INT(
"invalid index", procName, 1);
646 PROCNAME(
"ptaGetArrays");
649 return ERROR_INT(
"no output requested", procName, 1);
650 if (pnax) *pnax = NULL;
651 if (pnay) *pnay = NULL;
653 return ERROR_INT(
"pta not defined", procName, 1);
655 return ERROR_INT(
"pta is empty", procName, 1);
659 return ERROR_INT(
"nax not made", procName, 1);
661 for (i = 0; i < n; i++)
662 nax->
array[i] = pta->x[i];
667 return ERROR_INT(
"nay not made", procName, 1);
669 for (i = 0; i < n; i++)
670 nay->
array[i] = pta->
y[i];
695 return (
PTA *)ERROR_PTR(
"filename not defined", procName, NULL);
698 return (
PTA *)ERROR_PTR(
"stream not opened", procName, NULL);
702 return (
PTA *)ERROR_PTR(
"pta not read", procName, NULL);
723 l_int32 i, n, ix, iy, type, version;
727 PROCNAME(
"ptaReadStream");
730 return (
PTA *)ERROR_PTR(
"stream not defined", procName, NULL);
732 if (fscanf(fp,
"\n Pta Version %d\n", &version) != 1)
733 return (
PTA *)ERROR_PTR(
"not a pta file", procName, NULL);
735 return (
PTA *)ERROR_PTR(
"invalid pta version", procName, NULL);
736 if (fscanf(fp,
" Number of pts = %d; format = %127s\n", &n, typestr) != 2)
737 return (
PTA *)ERROR_PTR(
"not a pta file", procName, NULL);
739 return (
PTA *)ERROR_PTR(
"num pts <= 0", procName, NULL);
740 if (n > MaxArraySize)
741 return (
PTA *)ERROR_PTR(
"too many pts", procName, NULL);
742 if (n == 0) L_INFO(
"the pta is empty\n", procName);
744 if (!strcmp(typestr,
"float"))
749 return (
PTA *)ERROR_PTR(
"pta not made", procName, NULL);
750 for (i = 0; i < n; i++) {
752 if (fscanf(fp,
" (%f, %f)\n", &x, &y) != 2) {
754 return (
PTA *)ERROR_PTR(
"error reading floats", procName, NULL);
758 if (fscanf(fp,
" (%d, %d)\n", &ix, &iy) != 2) {
760 return (
PTA *)ERROR_PTR(
"error reading ints", procName, NULL);
784 PROCNAME(
"ptaReadMem");
787 return (
PTA *)ERROR_PTR(
"data not defined", procName, NULL);
789 return (
PTA *)ERROR_PTR(
"stream not opened", procName, NULL);
793 if (!pta) L_ERROR(
"pta not read\n", procName);
820 PROCNAME(
"ptaWriteDebug");
823 return ptaWrite(filename, pta, type);
825 L_INFO(
"write to named temp file %s is disabled\n", procName, filename);
847 PROCNAME(
"ptaWrite");
850 return ERROR_INT(
"filename not defined", procName, 1);
852 return ERROR_INT(
"pta not defined", procName, 1);
855 return ERROR_INT(
"stream not opened", procName, 1);
859 return ERROR_INT(
"pta not written to stream", procName, 1);
877 l_int32 i, n, ix, iy;
880 PROCNAME(
"ptaWriteStream");
883 return ERROR_INT(
"stream not defined", procName, 1);
885 return ERROR_INT(
"pta not defined", procName, 1);
890 fprintf(fp,
" Number of pts = %d; format = float\n", n);
892 fprintf(fp,
" Number of pts = %d; format = integer\n", n);
893 for (i = 0; i < n; i++) {
896 fprintf(fp,
" (%f, %f)\n", x, y);
899 fprintf(fp,
" (%d, %d)\n", ix, iy);
930 PROCNAME(
"ptaWriteMem");
932 if (pdata) *pdata = NULL;
933 if (psize) *psize = 0;
935 return ERROR_INT(
"&data not defined", procName, 1);
937 return ERROR_INT(
"&size not defined", procName, 1);
939 return ERROR_INT(
"pta not defined", procName, 1);
942 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
943 return ERROR_INT(
"stream not opened", procName, 1);
949 L_INFO(
"work-around: writing to a temp file\n", procName);
952 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
954 if ((fp = tmpfile()) == NULL)
955 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
980 PROCNAME(
"ptaaCreate");
982 if (n <= 0 || n > MaxPtrArraySize)
985 ptaa = (
PTAA *)LEPT_CALLOC(1,
sizeof(
PTAA));
988 if ((ptaa->
pta = (
PTA **)LEPT_CALLOC(n,
sizeof(
PTA *))) == NULL) {
990 return (
PTAA *)ERROR_PTR(
"pta ptrs not made", procName, NULL);
1008 PROCNAME(
"ptaaDestroy");
1010 if (pptaa == NULL) {
1011 L_WARNING(
"ptr address is NULL!\n", procName);
1015 if ((ptaa = *pptaa) == NULL)
1018 for (i = 0; i < ptaa->
n; i++)
1020 LEPT_FREE(ptaa->
pta);
1045 PROCNAME(
"ptaaAddPta");
1048 return ERROR_INT(
"ptaa not defined", procName, 1);
1050 return ERROR_INT(
"pta not defined", procName, 1);
1054 }
else if (copyflag ==
L_COPY) {
1055 if ((ptac =
ptaCopy(pta)) == NULL)
1056 return ERROR_INT(
"ptac not made", procName, 1);
1057 }
else if (copyflag ==
L_CLONE) {
1058 if ((ptac =
ptaClone(pta)) == NULL)
1059 return ERROR_INT(
"pta clone not made", procName, 1);
1061 return ERROR_INT(
"invalid copyflag", procName, 1);
1069 return ERROR_INT(
"extension failed", procName, 1);
1073 ptaa->
pta[n] = ptac;
1095 size_t oldsize, newsize;
1097 PROCNAME(
"ptaaExtendArray");
1100 return ERROR_INT(
"ptaa not defined", procName, 1);
1102 newsize = 2 * oldsize;
1103 if (newsize > 8 * MaxPtrArraySize)
1104 return ERROR_INT(
"newsize > 80 MB; too large", procName, 1);
1107 oldsize, newsize)) == NULL)
1108 return ERROR_INT(
"new ptr array not returned", procName, 1);
1127 PROCNAME(
"ptaaGetCount");
1130 return ERROR_INT(
"ptaa not defined", procName, 0);
1149 PROCNAME(
"ptaaGetPta");
1152 return (
PTA *)ERROR_PTR(
"ptaa not defined", procName, NULL);
1153 if (index < 0 || index >= ptaa->
n)
1154 return (
PTA *)ERROR_PTR(
"index not valid", procName, NULL);
1156 if (accessflag ==
L_COPY)
1158 else if (accessflag ==
L_CLONE)
1161 return (
PTA *)ERROR_PTR(
"invalid accessflag", procName, NULL);
1184 PROCNAME(
"ptaaGetPt");
1189 return ERROR_INT(
"ptaa not defined", procName, 1);
1190 if (ipta < 0 || ipta >= ptaa->
n)
1191 return ERROR_INT(
"index ipta not valid", procName, 1);
1194 if (jpt < 0 || jpt >= pta->
n) {
1196 return ERROR_INT(
"index jpt not valid", procName, 1);
1222 PROCNAME(
"ptaaInitFull");
1225 return ERROR_INT(
"ptaa not defined", procName, 1);
1227 return ERROR_INT(
"pta not defined", procName, 1);
1231 for (i = 0; i < n; i++) {
1261 PROCNAME(
"ptaaReplacePta");
1264 return ERROR_INT(
"ptaa not defined", procName, 1);
1266 return ERROR_INT(
"pta not defined", procName, 1);
1268 if (index < 0 || index >= n)
1269 return ERROR_INT(
"index not valid", procName, 1);
1272 ptaa->
pta[index] = pta;
1293 PROCNAME(
"ptaaAddPt");
1296 return ERROR_INT(
"ptaa not defined", procName, 1);
1297 if (ipta < 0 || ipta >= ptaa->
n)
1298 return ERROR_INT(
"index ipta not valid", procName, 1);
1326 PROCNAME(
"ptaaTruncate");
1329 return ERROR_INT(
"ptaa not defined", procName, 1);
1332 for (i = n - 1; i >= 0; i--) {
1366 PROCNAME(
"ptaaRead");
1369 return (
PTAA *)ERROR_PTR(
"filename not defined", procName, NULL);
1372 return (
PTAA *)ERROR_PTR(
"stream not opened", procName, NULL);
1376 return (
PTAA *)ERROR_PTR(
"ptaa not read", procName, NULL);
1395 l_int32 i, n, version;
1399 PROCNAME(
"ptaaReadStream");
1402 return (
PTAA *)ERROR_PTR(
"stream not defined", procName, NULL);
1404 if (fscanf(fp,
"\nPtaa Version %d\n", &version) != 1)
1405 return (
PTAA *)ERROR_PTR(
"not a ptaa file", procName, NULL);
1407 return (
PTAA *)ERROR_PTR(
"invalid ptaa version", procName, NULL);
1408 if (fscanf(fp,
"Number of Pta = %d\n", &n) != 1)
1409 return (
PTAA *)ERROR_PTR(
"not a ptaa file", procName, NULL);
1411 return (
PTAA *)ERROR_PTR(
"num pta ptrs <= 0", procName, NULL);
1412 if (n > MaxPtrArraySize)
1413 return (
PTAA *)ERROR_PTR(
"too many pta ptrs", procName, NULL);
1414 if (n == 0) L_INFO(
"the ptaa is empty\n", procName);
1417 return (
PTAA *)ERROR_PTR(
"ptaa not made", procName, NULL);
1418 for (i = 0; i < n; i++) {
1421 return (
PTAA *)ERROR_PTR(
"error reading pta", procName, NULL);
1444 PROCNAME(
"ptaaReadMem");
1447 return (
PTAA *)ERROR_PTR(
"data not defined", procName, NULL);
1449 return (
PTAA *)ERROR_PTR(
"stream not opened", procName, NULL);
1453 if (!ptaa) L_ERROR(
"ptaa not read\n", procName);
1480 PROCNAME(
"ptaaWriteDebug");
1485 L_INFO(
"write to named temp file %s is disabled\n", procName, filename);
1507 PROCNAME(
"ptaaWrite");
1510 return ERROR_INT(
"filename not defined", procName, 1);
1512 return ERROR_INT(
"ptaa not defined", procName, 1);
1515 return ERROR_INT(
"stream not opened", procName, 1);
1519 return ERROR_INT(
"ptaa not written to stream", procName, 1);
1540 PROCNAME(
"ptaaWriteStream");
1543 return ERROR_INT(
"stream not defined", procName, 1);
1545 return ERROR_INT(
"ptaa not defined", procName, 1);
1549 fprintf(fp,
"Number of Pta = %d\n", n);
1550 for (i = 0; i < n; i++) {
1583 PROCNAME(
"ptaaWriteMem");
1585 if (pdata) *pdata = NULL;
1586 if (psize) *psize = 0;
1588 return ERROR_INT(
"&data not defined", procName, 1);
1590 return ERROR_INT(
"&size not defined", procName, 1);
1592 return ERROR_INT(
"ptaa not defined", procName, 1);
1595 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1596 return ERROR_INT(
"stream not opened", procName, 1);
1600 *psize = *psize - 1;
1602 L_INFO(
"work-around: writing to a temp file\n", procName);
1605 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
1607 if ((fp = tmpfile()) == NULL)
1608 return ERROR_INT(
"tmpfile stream not opened", procName, 1);
l_ok numaGetFValue(NUMA *na, l_int32 index, l_float32 *pval)
numaGetFValue()
l_ok ptaaGetPt(PTAA *ptaa, l_int32 ipta, l_int32 jpt, l_float32 *px, l_float32 *py)
ptaaGetPt()
PTA * ptaCopyRange(PTA *ptas, l_int32 istart, l_int32 iend)
ptaCopyRange()
l_ok ptaaAddPt(PTAA *ptaa, l_int32 ipta, l_float32 x, l_float32 y)
ptaaAddPt()
l_ok ptaWriteStream(FILE *fp, PTA *pta, l_int32 type)
ptaWriteStream()
l_ok ptaInsertPt(PTA *pta, l_int32 index, l_int32 x, l_int32 y)
ptaInsertPt()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
PTA * ptaReadMem(const l_uint8 *data, size_t size)
ptaReadMem()
#define PTA_VERSION_NUMBER
PTA * ptaCreate(l_int32 n)
ptaCreate()
static l_int32 ptaaExtendArray(PTAA *ptaa)
ptaaExtendArray()
l_ok ptaaTruncate(PTAA *ptaa)
ptaaTruncate()
FILE * fopenReadFromMemory(const l_uint8 *data, size_t size)
fopenReadFromMemory()
l_ok ptaGetArrays(PTA *pta, NUMA **pnax, NUMA **pnay)
ptaGetArrays()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_int32 ptaGetCount(PTA *pta)
ptaGetCount()
static const l_int32 InitialArraySize
PTA * ptaRead(const char *filename)
ptaRead()
PTA * ptaaGetPta(PTAA *ptaa, l_int32 index, l_int32 accessflag)
ptaaGetPta()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
PTA * ptaClone(PTA *pta)
ptaClone()
l_ok ptaaWriteStream(FILE *fp, PTAA *ptaa, l_int32 type)
ptaaWriteStream()
void ptaaDestroy(PTAA **pptaa)
ptaaDestroy()
l_ok ptaGetPt(PTA *pta, l_int32 index, l_float32 *px, l_float32 *py)
ptaGetPt()
PTA * ptaCreateFromNuma(NUMA *nax, NUMA *nay)
ptaCreateFromNuma()
l_ok ptaaInitFull(PTAA *ptaa, PTA *pta)
ptaaInitFull()
void * reallocNew(void **pindata, size_t oldsize, size_t newsize)
reallocNew()
l_ok ptaaReplacePta(PTAA *ptaa, l_int32 index, PTA *pta)
ptaaReplacePta()
l_ok numaGetParameters(NUMA *na, l_float32 *pstartx, l_float32 *pdelx)
numaGetParameters()
l_ok ptaRemovePt(PTA *pta, l_int32 index)
ptaRemovePt()
PTA * ptaCopy(PTA *pta)
ptaCopy()
static l_int32 ptaExtendArrays(PTA *pta)
ptaExtendArrays()
l_ok ptaSetPt(PTA *pta, l_int32 index, l_float32 x, l_float32 y)
ptaSetPt()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
FILE * fopenWriteWinTempfile(void)
fopenWriteWinTempfile()
FILE * fopenReadStream(const char *filename)
fopenReadStream()
l_uint8 * l_binaryReadStream(FILE *fp, size_t *pnbytes)
l_binaryReadStream()
l_int32 ptaaGetCount(PTAA *ptaa)
ptaaGetCount()
l_ok ptaEmpty(PTA *pta)
ptaEmpty()
l_ok ptaWrite(const char *filename, PTA *pta, l_int32 type)
ptaWrite()
l_ok ptaWriteDebug(const char *filename, PTA *pta, l_int32 type)
ptaWriteDebug()
l_ok ptaaWriteMem(l_uint8 **pdata, size_t *psize, PTAA *ptaa, l_int32 type)
ptaaWriteMem()
l_ok ptaaWrite(const char *filename, PTAA *ptaa, l_int32 type)
ptaaWrite()
void ptaDestroy(PTA **ppta)
ptaDestroy()
PTAA * ptaaReadStream(FILE *fp)
ptaaReadStream()
l_ok ptaGetIPt(PTA *pta, l_int32 index, l_int32 *px, l_int32 *py)
ptaGetIPt()
l_ok ptaaAddPta(PTAA *ptaa, PTA *pta, l_int32 copyflag)
ptaaAddPta()
l_ok ptaWriteMem(l_uint8 **pdata, size_t *psize, PTA *pta, l_int32 type)
ptaWriteMem()
PTAA * ptaaReadMem(const l_uint8 *data, size_t size)
ptaaReadMem()
PTAA * ptaaCreate(l_int32 n)
ptaaCreate()
PTA * ptaReadStream(FILE *fp)
ptaReadStream()
l_ok ptaaWriteDebug(const char *filename, PTAA *ptaa, l_int32 type)
ptaaWriteDebug()
PTAA * ptaaRead(const char *filename)
ptaaRead()