373l_int32 bl1, bl2, bl3;
376 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
377 return ERROR_INT(
"fontsize must be in {4, 6, ..., 20}", __func__, 1);
384 return ERROR_INT(
"pixa not made", __func__, 1);
386 pathname = pathJoin(outdir, outputfonts[(fontsize - 4) / 2]);
387 pixaWrite(pathname, pixa);
390 L_INFO(
"Found %d chars in font size %d\n", __func__, pixaGetCount(pixa),
392 L_INFO(
"Baselines are at: %d, %d, %d\n", __func__, bl1, bl2, bl3);
483l_int32 redsize, nbytes;
487 if (!pbl0 || !pbl1 || !pbl2)
488 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
489 *pbl0 = *pbl1 = *pbl2 = 0;
490 redsize = (fontsize / 2) - 2;
491 if (redsize < 0 || redsize >= NUM_FONTS)
492 return (
PIXA *)ERROR_PTR(
"invalid font size", __func__, NULL);
495 data = decodeBase64(fontdata_4, strlen(fontdata_4), &nbytes);
496 }
else if (fontsize == 6) {
497 data = decodeBase64(fontdata_6, strlen(fontdata_6), &nbytes);
498 }
else if (fontsize == 8) {
499 data = decodeBase64(fontdata_8, strlen(fontdata_8), &nbytes);
500 }
else if (fontsize == 10) {
501 data = decodeBase64(fontdata_10, strlen(fontdata_10), &nbytes);
502 }
else if (fontsize == 12) {
503 data = decodeBase64(fontdata_12, strlen(fontdata_12), &nbytes);
504 }
else if (fontsize == 14) {
505 data = decodeBase64(fontdata_14, strlen(fontdata_14), &nbytes);
506 }
else if (fontsize == 16) {
507 data = decodeBase64(fontdata_16, strlen(fontdata_16), &nbytes);
508 }
else if (fontsize == 18) {
509 data = decodeBase64(fontdata_18, strlen(fontdata_18), &nbytes);
511 data = decodeBase64(fontdata_20, strlen(fontdata_20), &nbytes);
514 return (
PIXA *)ERROR_PTR(
"data not made", __func__, NULL);
516 pix = pixReadMem(data, nbytes);
519 return (
PIXA *)ERROR_PTR(
"pix not made", __func__, NULL);
552l_int32 i, j, nrows, nrowchars, nchars, h, yval;
553l_int32 width, height;
556BOX *box, *box1, *box2;
557BOXA *boxar, *boxac, *boxacs;
558PIX *pix1, *pix2, *pixr, *pixrc, *pixc;
560l_int32 n, w, inrow, top;
564 if (!pbl0 || !pbl1 || !pbl2)
565 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
566 *pbl0 = *pbl1 = *pbl2 = 0;
568 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
571 w = pixGetWidth(pixs);
572 na = pixCountPixelsByRow(pixs, NULL);
573 boxar = boxaCreate(0);
574 n = numaGetCount(na);
575 ia = numaGetIArray(na);
577 for (i = 0; i < n; i++) {
578 if (!inrow && ia[i] > 0) {
581 }
else if (inrow && ia[i] == 0) {
583 box = boxCreate(0, top, w, i - top);
589 nrows = boxaGetCount(boxar);
591 L_INFO(
"For fontsize %s, have %d rows\n", __func__, fontsize, nrows);
594 L_INFO(
"nrows = %d; skipping fontsize %d\n", __func__, nrows, fontsize);
596 return (
PIXA *)ERROR_PTR(
"3 rows not generated", __func__, NULL);
601 lept_rmdir(
"baseline");
602 lept_mkdir(
"baseline");
604 tab = makePixelSumTab8();
605 pixa = pixaCreate(95);
606 for (i = 0; i < nrows; i++) {
607 box = boxaGetBox(boxar, i,
L_CLONE);
608 pixr = pixClipRectangle(pixs, box, NULL);
613 L_INFO(
"Baseline info: row %d, yval = %d, h = %d\n", __func__,
614 i, yval, pixGetHeight(pixr));
615 pix1 = pixCopy(NULL, pixr);
616 pixRenderLine(pix1, 0, yval, pixGetWidth(pix1), yval, 1,
619 pixWriteDebug(
"/tmp/baseline/row0.png", pix1, IFF_PNG);
621 pixWriteDebug(
"/tmp/baseline/row1.png", pix1, IFF_PNG);
623 pixWriteDebug(
"/tmp/baseline/row2.png", pix1, IFF_PNG);
628 pixrc = pixCloseSafeBrick(NULL, pixr, 1, 35);
629 boxac = pixConnComp(pixrc, NULL, 8);
632 box1 = boxaGetBox(boxacs, 1,
L_CLONE);
633 box2 = boxaGetBox(boxacs, 2,
L_CLONE);
634 box1->
w = box2->
x + box2->
w - box1->
x;
637 boxaRemoveBox(boxacs, 2);
639 h = pixGetHeight(pixr);
640 nrowchars = boxaGetCount(boxacs);
641 for (j = 0; j < nrowchars; j++) {
642 box = boxaGetBox(boxacs, j,
L_COPY);
643 if (box->
w <= 2 && box->
h == 1) {
649 pixc = pixClipRectangle(pixr, box, NULL);
651 if (i == 0 && j == 0)
652 pixaAddPix(pixa, pixc,
L_COPY);
653 if (i == 2 && j == 0)
654 pixaAddPix(pixa, pixc,
L_COPY);
660 boxaDestroy(&boxacs);
664 nchars = pixaGetCount(pixa);
666 return (
PIXA *)ERROR_PTR(
"95 chars not generated", __func__, NULL);
674 pix1 = pixaGetPix(pixa, 0,
L_CLONE);
675 width = 2 * pixGetWidth(pix1);
676 height = pixGetHeight(pix1);
678 pix1 = pixCreate(width, height, 1);
679 pixaReplacePix(pixa, 0, pix1, NULL);
682 pix1 = pixaGetPix(pixa, 15,
L_CLONE);
683 pix2 = pixFlipLR(NULL, pix1);
685 pixaReplacePix(pixa, 60, pix2, NULL);
688 pix1 = pixaDisplayTiled(pixa, 1500, 0, 10);
689 pixDisplay(pix1, 100 * i, 200);
719l_int32 i, h, val1, val2, diff, diffmax, ymax;
724 return ERROR_INT(
"pixs not defined", __func__, 1);
726 return ERROR_INT(
"&y not defined", __func__, 1);
729 tab = makePixelSumTab8();
733 na = pixCountPixelsByRow(pixs, tab);
734 h = numaGetCount(na);
737 for (i = 1; i < h; i++) {
738 numaGetIValue(na, i - 1, &val1);
739 numaGetIValue(na, i, &val2);
740 diff = L_MAX(0, val1 - val2);
741 if (diff > diffmax) {
787l_int32 i, maxh, height, charwidth, xwidth, kernwidth;
788l_int32 *fonttab, *baselinetab;
792 return ERROR_INT(
"bmf not defined", __func__, 1);
795 fonttab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
797 for (i = 0; i < 128; i++)
799 for (i = 32; i < 127; i++)
802 baselinetab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
804 for (i = 0; i < 128; i++)
805 baselinetab[i] = UNDEF;
806 for (i = 32; i <= 57; i++)
808 for (i = 58; i <= 91; i++)
811 for (i = 93; i < 127; i++)
817 maxh = pixGetHeight(pix);
820 height = pixGetHeight(pix);
822 maxh = L_MAX(maxh, height);
824 height = pixGetHeight(pix);
826 maxh = L_MAX(maxh, height);
834 kernwidth = (l_int32)(0.08 * (l_float32)xwidth + 0.5);