61 #include "allheaders.h" 105 PIX *pixh, *pixv, *pixt, *pixg1, *pixg2, *pixg3, *pixg4;
107 PROCNAME(
"pixStrokeWidthTransform");
109 if (!pixs || pixGetDepth(pixs) != 1)
110 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
111 if (depth != 8 && depth != 16)
112 return (
PIX *)ERROR_PTR(
"depth must be 8 or 16 bpp", procName, NULL);
113 if (nangles != 2 && nangles != 4 && nangles != 6 && nangles != 8)
114 return (
PIX *)ERROR_PTR(
"nangles not in {2,4,6,8}", procName, NULL);
125 pixg1 =
pixMinOrMax(NULL, pixh, pixv, L_CHOOSE_MIN);
129 pixg2 = pixg3 = pixg4 = NULL;
131 if (nangles == 4 || nangles == 8) {
153 angle = 3.0 * pi / 8.0;
200 l_int32 w, h, diag, xoff, yoff;
201 PIX *pixb, *pixr, *pixh, *pixv, *pixg1, *pixg2, *pixd;
204 PROCNAME(
"pixFindMinRunsOrthogonal");
206 if (!pixs || pixGetDepth(pixs) != 1)
207 return (
PIX *)ERROR_PTR(
"pixs undefined or not 1 bpp", procName, NULL);
212 diag = (l_int32)(sqrt((l_float64)(w * w + h * h)) + 2.5);
213 xoff = (diag - w) / 2;
214 yoff = (diag - h) / 2;
223 pixg1 =
pixMinOrMax(NULL, pixh, pixv, L_CHOOSE_MIN);
267 l_int32 i, j, w, h, wpld, bufsize, maxsize, n;
268 l_int32 *start, *end, *buffer;
269 l_uint32 *datad, *lined;
272 PROCNAME(
"pixRunlengthTransform");
275 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
276 if (pixGetDepth(pixs) != 1)
277 return (
PIX *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
278 if (depth != 8 && depth != 16)
279 return (
PIX *)ERROR_PTR(
"depth must be 8 or 16 bpp", procName, NULL);
287 return (
PIX *)ERROR_PTR(
"invalid direction", procName, NULL);
288 bufsize = L_MAX(w, h);
289 if (bufsize > 1000000) {
290 L_ERROR(
"largest image dimension = %d; too big\n", procName, bufsize);
294 if ((pixd =
pixCreate(w, h, depth)) == NULL)
295 return (
PIX *)ERROR_PTR(
"pixd not made", procName, NULL);
297 wpld = pixGetWpl(pixd);
299 start = (l_int32 *)LEPT_CALLOC(maxsize,
sizeof(l_int32));
300 end = (l_int32 *)LEPT_CALLOC(maxsize,
sizeof(l_int32));
301 buffer = (l_int32 *)LEPT_CALLOC(bufsize,
sizeof(l_int32));
310 for (i = 0; i < h; i++) {
313 lined = datad + i * wpld;
315 for (j = 0; j < w; j++)
318 for (j = 0; j < w; j++)
323 for (j = 0; j < w; j++) {
327 for (i = 0; i < h; i++) {
328 lined = datad + i * wpld;
332 for (i = 0; i < h; i++) {
333 lined = datad + i * wpld;
379 l_int32
index, w, h, d, j, wpl, val;
382 PROCNAME(
"pixFindHorizontalRuns");
385 return ERROR_INT(
"&n not defined", procName, 1);
388 return ERROR_INT(
"pix not defined", procName, 1);
391 return ERROR_INT(
"pix not 1 bpp", procName, 1);
393 return ERROR_INT(
"y not in [0 ... h - 1]", procName, 1);
395 return ERROR_INT(
"xstart not defined", procName, 1);
397 return ERROR_INT(
"xend not defined", procName, 1);
399 wpl = pixGetWpl(pix);
404 for (j = 0; j < w; j++) {
413 xend[
index++] = j - 1;
421 xend[
index++] = w - 1;
456 l_int32
index, w, h, d, i, wpl, val;
457 l_uint32 *data, *line;
459 PROCNAME(
"pixFindVerticalRuns");
462 return ERROR_INT(
"&n not defined", procName, 1);
465 return ERROR_INT(
"pix not defined", procName, 1);
468 return ERROR_INT(
"pix not 1 bpp", procName, 1);
470 return ERROR_INT(
"x not in [0 ... w - 1]", procName, 1);
472 return ERROR_INT(
"ystart not defined", procName, 1);
474 return ERROR_INT(
"yend not defined", procName, 1);
476 wpl = pixGetWpl(pix);
481 for (i = 0; i < h; i++) {
482 line = data + i * wpl;
491 yend[
index++] = i - 1;
499 yend[
index++] = h - 1;
529 l_int32 w, h, i, start, size;
532 PROCNAME(
"pixFindMaxRuns");
534 if (pnastart) *pnastart = NULL;
536 return (
NUMA *)ERROR_PTR(
"direction invalid", procName, NULL);
537 if (!pix || pixGetDepth(pix) != 1)
538 return (
NUMA *)ERROR_PTR(
"pix undefined or not 1 bpp", procName, NULL);
544 for (i = 0; i < h; i++) {
550 for (i = 0; i < w; i++) {
584 l_int32 w, h, j, wpl, val, maxstart, maxsize, length, start;
587 PROCNAME(
"pixFindMaxHorizontalRunOnLine");
589 if (pxstart) *pxstart = 0;
591 return ERROR_INT(
"&size not defined", procName, 1);
593 if (!pix || pixGetDepth(pix) != 1)
594 return ERROR_INT(
"pix not defined or not 1 bpp", procName, 1);
597 return ERROR_INT(
"y not in [0 ... h - 1]", procName, 1);
599 wpl = pixGetWpl(pix);
605 for (j = 0; j < w; j++) {
614 if (length > maxsize) {
624 if (length > maxsize) {
629 if (pxstart) *pxstart = maxstart;
658 l_int32 w, h, i, wpl, val, maxstart, maxsize, length, start;
659 l_uint32 *data, *line;
661 PROCNAME(
"pixFindMaxVerticalRunOnLine");
663 if (pystart) *pystart = 0;
665 return ERROR_INT(
"&size not defined", procName, 1);
667 if (!pix || pixGetDepth(pix) != 1)
668 return ERROR_INT(
"pix not defined or not 1 bpp", procName, 1);
671 return ERROR_INT(
"x not in [0 ... w - 1]", procName, 1);
673 wpl = pixGetWpl(pix);
679 for (i = 0; i < h; i++) {
680 line = data + i * wpl;
689 if (length > maxsize) {
699 if (length > maxsize) {
704 if (pystart) *pystart = maxstart;
740 l_int32 i, j, first, last, diff, max;
742 PROCNAME(
"runlengthMembershipOnLine");
745 return ERROR_INT(
"buffer not defined", procName, 1);
747 return ERROR_INT(
"start not defined", procName, 1);
749 return ERROR_INT(
"end not defined", procName, 1);
756 memset(buffer, 0, 4 * size);
757 for (i = 0; i < n; i++) {
760 diff = last - first + 1;
761 diff = L_MIN(diff, max);
762 for (j = first; j <= last; j++)
797 PROCNAME(
"makeMSBitLocTab");
799 if ((tab = (l_int32 *)LEPT_CALLOC(256,
sizeof(l_int32))) == NULL)
800 return (l_int32 *)ERROR_PTR(
"tab not made", procName, NULL);
802 for (i = 0; i < 256; i++) {
808 for (j = 0; j < 8; j++) {
PIX * pixRotateShear(PIX *pixs, l_int32 xcen, l_int32 ycen, l_float32 angle, l_int32 incolor)
pixRotateShear()
l_ok numaAddNumber(NUMA *na, l_float32 val)
numaAddNumber()
l_ok pixRasterop(PIX *pixd, l_int32 dx, l_int32 dy, l_int32 dw, l_int32 dh, l_int32 op, PIX *pixs, l_int32 sx, l_int32 sy)
pixRasterop()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
PIX * pixInvert(PIX *pixd, PIX *pixs)
pixInvert()
NUMA * numaCreate(l_int32 n)
numaCreate()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok pixFindMaxVerticalRunOnLine(PIX *pix, l_int32 x, l_int32 *pystart, l_int32 *psize)
pixFindMaxVerticalRunOnLine()
#define GET_DATA_BIT(pdata, n)
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
l_ok pixFindHorizontalRuns(PIX *pix, l_int32 y, l_int32 *xstart, l_int32 *xend, l_int32 *pn)
pixFindHorizontalRuns()
l_int32 * makeMSBitLocTab(l_int32 bitval)
makeMSBitLocTab()
#define SET_DATA_BYTE(pdata, n, val)
PIX * pixClone(PIX *pixs)
pixClone()
static PIX * pixFindMinRunsOrthogonal(PIX *pixs, l_float32 angle, l_int32 depth)
pixFindMinRunsOrthogonal()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
l_ok pixFindVerticalRuns(PIX *pix, l_int32 x, l_int32 *ystart, l_int32 *yend, l_int32 *pn)
pixFindVerticalRuns()
PIX * pixRunlengthTransform(PIX *pixs, l_int32 color, l_int32 direction, l_int32 depth)
pixRunlengthTransform()
l_ok runlengthMembershipOnLine(l_int32 *buffer, l_int32 size, l_int32 depth, l_int32 *start, l_int32 *end, l_int32 n)
runlengthMembershipOnLine()
l_ok pixFindMaxHorizontalRunOnLine(PIX *pix, l_int32 y, l_int32 *pxstart, l_int32 *psize)
pixFindMaxHorizontalRunOnLine()
void boxDestroy(BOX **pbox)
boxDestroy()
PIX * pixMinOrMax(PIX *pixd, PIX *pixs1, PIX *pixs2, l_int32 type)
pixMinOrMax()
PIX * pixStrokeWidthTransform(PIX *pixs, l_int32 color, l_int32 depth, l_int32 nangles)
pixStrokeWidthTransform()
NUMA * pixFindMaxRuns(PIX *pix, l_int32 direction, NUMA **pnastart)
pixFindMaxRuns()
#define SET_DATA_TWO_BYTES(pdata, n, val)
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()