/*! * boxaInsertBox() * * Input: boxa * index (location in boxa to insert new value) * box (new box to be inserted) * Return: 0 if OK, 1 on error * * Notes: * (1) This shifts box[i] --> box[i + 1] for all i >= index, * and then inserts box as box[index]. * (2) To insert at the beginning of the array, set index = 0. * (3) To append to the array, it's easier to use boxaAddBox(). * (4) This should not be used repeatedly to insert into large arrays, * because the function is O(n). */ l_int32 boxaInsertBox(BOXA *boxa, l_int32 index, BOX *box) { l_int32 i, n; BOX **array; PROCNAME("boxaInsertBox"); if (!boxa) return ERROR_INT("boxa not defined", procName, 1); n = boxaGetCount(boxa); if (index < 0 || index > n) return ERROR_INT("index not in {0...n}", procName, 1); if (!box) return ERROR_INT("box not defined", procName, 1); if (n >= boxa->nalloc) boxaExtendArray(boxa); array = boxa->box; boxa->n++; for (i = n; i > index; i--) array[i] = array[i - 1]; array[index] = box; return 0; }
/*! * pixaInsertPix() * * Input: pixa * index (at which pix is to be inserted) * pixs (new pix to be inserted) * box (<optional> new box to be inserted) * Return: 0 if OK, 1 on error * * Notes: * (1) This shifts pixa[i] --> pixa[i + 1] for all i >= index, * and then inserts at pixa[index]. * (2) To insert at the beginning of the array, set index = 0. * (3) It should not be used repeatedly on large arrays, * because the function is O(n). * (4) To append a pix to a pixa, it's easier to use pixaAddPix(). */ l_int32 pixaInsertPix(PIXA *pixa, l_int32 index, PIX *pixs, BOX *box) { l_int32 i, n; PROCNAME("pixaInsertPix"); if (!pixa) return ERROR_INT("pixa not defined", procName, 1); n = pixaGetCount(pixa); if (index < 0 || index > n) return ERROR_INT("index not in {0...n}", procName, 1); if (!pixs) return ERROR_INT("pixs not defined", procName, 1); if (n >= pixa->nalloc) { /* extend both ptr arrays */ pixaExtendArray(pixa); boxaExtendArray(pixa->boxa); } pixa->n++; for (i = n; i > index; i--) pixa->pix[i] = pixa->pix[i - 1]; pixa->pix[index] = pixs; /* Optionally, insert the box */ if (box) boxaInsertBox(pixa->boxa, index, box); return 0; }
/*! * boxaAddBox() * * Input: boxa * box (to be added) * copyflag (L_INSERT, L_COPY, L_CLONE) * Return: 0 if OK, 1 on error */ l_int32 boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag) { l_int32 n; BOX *boxc; PROCNAME("boxaAddBox"); if (!boxa) return ERROR_INT("boxa not defined", procName, 1); if (!box) return ERROR_INT("box not defined", procName, 1); if (copyflag == L_INSERT) boxc = box; else if (copyflag == L_COPY) boxc = boxCopy(box); else if (copyflag == L_CLONE) boxc = boxClone(box); else return ERROR_INT("invalid copyflag", procName, 1); if (!boxc) return ERROR_INT("boxc not made", procName, 1); n = boxaGetCount(boxa); if (n >= boxa->nalloc) boxaExtendArray(boxa); boxa->box[n] = boxc; boxa->n++; return 0; }