91 #include "allheaders.h" 111 l_int32
y, l_int32
dy, l_int32 ymax,
112 l_int32 *pminx, l_int32 *pmaxx,
113 l_int32 *pminy, l_int32 *pmaxy);
115 l_int32
y, l_int32
dy, l_int32 ymax);
117 l_int32 *py, l_int32 *pdy);
120 #ifndef NO_CONSOLE_IO 146 l_int32 connectivity)
149 PROCNAME(
"pixConnComp");
151 if (ppixa) *ppixa = NULL;
153 return (
BOXA *)ERROR_PTR(
"pixs not defined", procName, NULL);
154 if (pixGetDepth(pixs) != 1)
155 return (
BOXA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
156 if (connectivity != 4 && connectivity != 8)
157 return (
BOXA *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
192 l_int32 connectivity)
195 l_int32 x,
y, xstart, ystart;
196 PIX *pix1, *pix2, *pix3, *pix4;
202 PROCNAME(
"pixConnCompPixa");
205 return (
BOXA *)ERROR_PTR(
"&pixa not defined", procName, NULL);
207 if (!pixs || pixGetDepth(pixs) != 1)
208 return (
BOXA *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
209 if (connectivity != 4 && connectivity != 8)
210 return (
BOXA *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
212 pix1 = pix2 = pix3 = pix4 = NULL;
223 if (!pix1 || !pix2) {
224 L_ERROR(
"pix1 or pix2 not made\n", procName);
229 h = pixGetHeight(pixs);
231 L_ERROR(
"stack not made\n", procName);
245 if ((box =
pixSeedfillBB(pix1, stack, x,
y, connectivity)) == NULL) {
248 L_ERROR(
"box not made\n", procName);
268 fprintf(stderr,
"Number of remaining pixels = %d\n", iszero);
269 pixWrite(
"junkremain", pix1, IFF_PNG);
304 l_int32 connectivity)
307 l_int32 x,
y, xstart, ystart;
313 PROCNAME(
"pixConnCompBB");
315 if (!pixs || pixGetDepth(pixs) != 1)
316 return (
BOXA *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
317 if (connectivity != 4 && connectivity != 8)
318 return (
BOXA *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
327 if ((pix1 =
pixCopy(NULL, pixs)) == NULL)
328 return (
BOXA *)ERROR_PTR(
"pix1 not made", procName, NULL);
330 h = pixGetHeight(pixs);
332 L_ERROR(
"stack not made\n", procName);
345 if ((box =
pixSeedfillBB(pix1, stack, x,
y, connectivity)) == NULL) {
346 L_ERROR(
"box not made\n", procName);
358 fprintf(stderr,
"Number of remaining pixels = %d\n", iszero);
359 pixWrite(
"junkremain", pix1, IFF_PNG);
386 l_int32 connectivity,
390 l_int32 x,
y, xstart, ystart;
394 PROCNAME(
"pixCountConnComp");
397 return ERROR_INT(
"&count not defined", procName, 1);
399 if (!pixs || pixGetDepth(pixs) != 1)
400 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
401 if (connectivity != 4 && connectivity != 8)
402 return ERROR_INT(
"connectivity not 4 or 8", procName, 1);
409 if ((pix1 =
pixCopy(NULL, pixs)) == NULL)
410 return ERROR_INT(
"pix1 not made", procName, 1);
411 h = pixGetHeight(pixs);
414 return ERROR_INT(
"stack not made\n", procName, 1);
453 l_int32 w, h, d, wpl;
456 PROCNAME(
"nextOnPixelInRaster");
459 return ERROR_INT(
"pixs not defined", procName, 0);
462 return ERROR_INT(
"pixs not 1 bpp", procName, 0);
464 wpl = pixGetWpl(pixs);
490 l_int32 i, x,
y, xend, startword;
491 l_uint32 *line, *pword;
494 line = data + ystart * wpl;
495 pword = line + (xstart / 32);
497 xend = xstart - (xstart % 32) + 31;
498 for (x = xstart; x <= xend && x < w; x++) {
508 startword = (xstart / 32) + 1;
510 for (pword = line + startword; x < w; pword++, x += 32) {
512 for (i = 0; i < 32 && x < w; i++, x++) {
523 for (
y = ystart + 1;
y < h;
y++) {
524 line = data +
y * wpl;
525 for (pword = line, x = 0; x < w; pword++, x += 32) {
527 for (i = 0; i < 32 && x < w; i++, x++) {
562 l_int32 connectivity)
566 PROCNAME(
"pixSeedfillBB");
568 if (!pixs || pixGetDepth(pixs) != 1)
569 return (
BOX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
571 return (
BOX *)ERROR_PTR(
"stack not defined", procName, NULL);
572 if (connectivity != 4 && connectivity != 8)
573 return (
BOX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
575 if (connectivity == 4) {
577 return (
BOX *)ERROR_PTR(
"box not made", procName, NULL);
578 }
else if (connectivity == 8) {
580 return (
BOX *)ERROR_PTR(
"box not made", procName, NULL);
582 return (
BOX *)ERROR_PTR(
"connectivity not 4 or 8", procName, NULL);
626 l_int32 w, h, xstart, wpl, x1, x2,
dy;
628 l_int32 minx, maxx, miny, maxy;
629 l_uint32 *data, *line;
632 PROCNAME(
"pixSeedfill4BB");
634 if (!pixs || pixGetDepth(pixs) != 1)
635 return (
BOX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
637 return (
BOX *)ERROR_PTR(
"stack not defined", procName, NULL);
645 wpl = pixGetWpl(pixs);
646 line = data +
y * wpl;
649 if (x < 0 || x > xmax || y < 0 || y > ymax || (
GET_DATA_BIT(line, x) == 0))
655 minx = miny = 100000;
657 pushFillsegBB(stack, x, x,
y, 1, ymax, &minx, &maxx, &miny, &maxy);
658 pushFillsegBB(stack, x, x,
y + 1, -1, ymax, &minx, &maxx, &miny, &maxy);
665 line = data +
y * wpl;
678 for (x = x1; x >= 0 && (
GET_DATA_BIT(line, x) == 1); x--)
685 ymax, &minx, &maxx, &miny, &maxy);
692 ymax, &minx, &maxx, &miny, &maxy);
695 ymax, &minx, &maxx, &miny, &maxy);
696 skip:
for (x++; x <= x2 &&
701 }
while (x <= x2 && x <= xmax);
704 if ((box =
boxCreate(minx, miny, maxx - minx + 1, maxy - miny + 1))
706 return (
BOX *)ERROR_PTR(
"box not made", procName, NULL);
741 l_int32 w, h, xstart, wpl, x1, x2,
dy;
743 l_int32 minx, maxx, miny, maxy;
744 l_uint32 *data, *line;
747 PROCNAME(
"pixSeedfill8BB");
749 if (!pixs || pixGetDepth(pixs) != 1)
750 return (
BOX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
752 return (
BOX *)ERROR_PTR(
"stack not defined", procName, NULL);
760 wpl = pixGetWpl(pixs);
761 line = data +
y * wpl;
764 if (x < 0 || x > xmax || y < 0 || y > ymax || (
GET_DATA_BIT(line, x) == 0))
770 minx = miny = 100000;
772 pushFillsegBB(stack, x, x,
y, 1, ymax, &minx, &maxx, &miny, &maxy);
773 pushFillsegBB(stack, x, x,
y + 1, -1, ymax, &minx, &maxx, &miny, &maxy);
780 line = data +
y * wpl;
793 for (x = x1 - 1; x >= 0 && (
GET_DATA_BIT(line, x) == 1); x--)
800 ymax, &minx, &maxx, &miny, &maxy);
807 ymax, &minx, &maxx, &miny, &maxy);
810 ymax, &minx, &maxx, &miny, &maxy);
811 skip:
for (x++; x <= x2 + 1 &&
816 }
while (x <= x2 + 1 && x <= xmax);
819 if ((box =
boxCreate(minx, miny, maxx - minx + 1, maxy - miny + 1))
821 return (
BOX *)ERROR_PTR(
"box not made", procName, NULL);
846 l_int32 connectivity)
850 PROCNAME(
"pixSeedfill");
852 if (!pixs || pixGetDepth(pixs) != 1)
853 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
855 return ERROR_INT(
"stack not defined", procName, 1);
856 if (connectivity != 4 && connectivity != 8)
857 return ERROR_INT(
"connectivity not 4 or 8", procName, 1);
859 if (connectivity == 4)
891 l_int32 w, h, xstart, wpl, x1, x2,
dy;
893 l_uint32 *data, *line;
895 PROCNAME(
"pixSeedfill4");
897 if (!pixs || pixGetDepth(pixs) != 1)
898 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
900 return ERROR_INT(
"stack not defined", procName, 1);
908 wpl = pixGetWpl(pixs);
909 line = data +
y * wpl;
912 if (x < 0 || x > xmax || y < 0 || y > ymax || (
GET_DATA_BIT(line, x) == 0))
922 line = data +
y * wpl;
935 for (x = x1; x >= 0 && (
GET_DATA_BIT(line, x) == 1); x--)
950 skip:
for (x++; x <= x2 &&
955 }
while (x <= x2 && x <= xmax);
985 l_int32 w, h, xstart, wpl, x1, x2,
dy;
987 l_uint32 *data, *line;
989 PROCNAME(
"pixSeedfill8");
991 if (!pixs || pixGetDepth(pixs) != 1)
992 return ERROR_INT(
"pixs not defined or not 1 bpp", procName, 1);
994 return ERROR_INT(
"stack not defined", procName, 1);
1002 wpl = pixGetWpl(pixs);
1003 line = data +
y * wpl;
1006 if (x < 0 || x > xmax || y < 0 || y > ymax || (
GET_DATA_BIT(line, x) == 0))
1016 line = data +
y * wpl;
1029 for (x = x1 - 1; x >= 0 && (
GET_DATA_BIT(line, x) == 1); x--)
1044 skip:
for (x++; x <= x2 + 1 &&
1049 }
while (x <= x2 + 1 && x <= xmax);
1097 PROCNAME(
"pushFillsegBB");
1100 L_ERROR(
"stack not defined\n", procName);
1104 *pminx = L_MIN(*pminx,
xleft);
1105 *pmaxx = L_MAX(*pmaxx,
xright);
1106 *pminy = L_MIN(*pminy,
y);
1107 *pmaxy = L_MAX(*pmaxy,
y);
1109 if (
y +
dy >= 0 &&
y +
dy <= ymax) {
1110 if ((auxstack = stack->
auxstack) == NULL) {
1111 L_ERROR(
"auxstack not defined\n", procName);
1119 if ((fseg = (
FILLSEG *)LEPT_CALLOC(1,
sizeof(
FILLSEG))) == NULL) {
1120 L_ERROR(
"fillseg not made\n", procName);
1164 PROCNAME(
"pushFillseg");
1167 L_ERROR(
"stack not defined\n", procName);
1171 if (
y +
dy >= 0 &&
y +
dy <= ymax) {
1172 if ((auxstack = stack->
auxstack) == NULL) {
1173 L_ERROR(
"auxstack not defined\n", procName);
1181 if ((fseg = (
FILLSEG *)LEPT_CALLOC(1,
sizeof(
FILLSEG))) == NULL) {
1182 L_ERROR(
"fillseg not made\n", procName);
1224 PROCNAME(
"popFillseg");
1227 L_ERROR(
"stack not defined\n", procName);
1230 if ((auxstack = stack->
auxstack) == NULL) {
1231 L_ERROR(
"auxstack not defined\n", procName);
1238 *pxleft = fseg->
xleft;
1240 *py = fseg->
y + fseg->
dy;
BOX * pixSeedfill4BB(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y)
pixSeedfill4BB()
The struct FillSeg is used by the Heckbert seedfill algorithm to hold information about image segment...
BOX * pixSeedfillBB(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y, l_int32 connectivity)
pixSeedfillBB()
void lstackDestroy(L_STACK **plstack, l_int32 freeflag)
lstackDestroy()
l_int32 nextOnPixelInRaster(PIX *pixs, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
nextOnPixelInRaster()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_int32 pixZero(PIX *pix, l_int32 *pempty)
pixZero()
BOX * pixSeedfill8BB(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y)
pixSeedfill8BB()
l_int32 lstackGetCount(L_STACK *lstack)
lstackGetCount()
l_int32 boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
static void pushFillsegBB(L_STACK *stack, l_int32 xleft, l_int32 xright, l_int32 y, l_int32 dy, l_int32 ymax, l_int32 *pminx, l_int32 *pmaxx, l_int32 *pminy, l_int32 *pmaxy)
pushFillsegBB()
BOXA * boxaCopy(BOXA *boxa, l_int32 copyflag)
boxaCopy()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
#define GET_DATA_BIT(pdata, n)
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
#define CLEAR_DATA_BIT(pdata, n)
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()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
static const l_int32 L_INSERT
PIX * pixXor(PIX *pixd, PIX *pixs1, PIX *pixs2)
pixXor()
void * lstackRemove(L_STACK *lstack)
lstackRemove()
l_int32 pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
BOXA * pixConnCompBB(PIX *pixs, l_int32 connectivity)
pixConnCompBB()
l_int32 pixCountConnComp(PIX *pixs, l_int32 connectivity, l_int32 *pcount)
pixCountConnComp()
l_int32 pixSeedfill4(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y)
pixSeedfill4()
L_STACK * lstackCreate(l_int32 nalloc)
lstackCreate()
void pixDestroy(PIX **ppix)
pixDestroy()
BOXA * pixConnCompPixa(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnCompPixa()
static void pushFillseg(L_STACK *stack, l_int32 xleft, l_int32 xright, l_int32 y, l_int32 dy, l_int32 ymax)
pushFillseg()
struct L_Stack * auxstack
static void popFillseg(L_STACK *stack, l_int32 *pxleft, l_int32 *pxright, l_int32 *py, l_int32 *pdy)
popFillseg()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
l_int32 pixGetDimensions(PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_int32 pixSeedfill(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y, l_int32 connectivity)
pixSeedfill()
l_int32 pixSeedfill8(PIX *pixs, L_STACK *stack, l_int32 x, l_int32 y)
pixSeedfill8()
l_int32 nextOnPixelInRasterLow(l_uint32 *data, l_int32 w, l_int32 h, l_int32 wpl, l_int32 xstart, l_int32 ystart, l_int32 *px, l_int32 *py)
nextOnPixelInRasterLow()
l_int32 pixCountPixels(PIX *pixs, l_int32 *pcount, l_int32 *tab8)
pixCountPixels()
l_int32 lstackAdd(L_STACK *lstack, void *item)
lstackAdd()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()