70 #include <config_auto.h>
74 #include "allheaders.h"
78 static const l_float32 VertFractSep = 0.3;
81 #define DEBUG_BASELINE 0
83 #define DEBUG_FONT_GEN 0
87 l_int32 *pbl0, l_int32 *pbl1,
90 l_int32 *pbl1, l_int32 *pbl2);
92 l_int32 *pbl1, l_int32 *pbl2);
124 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
125 return (
L_BMF *)ERROR_PTR(
"fontsize must be in {4, 6, ..., 20}",
137 L_INFO(
"Generating pixa of bitmap fonts from file\n", __func__);
141 L_ERROR(
"Failed to make font; use string\n", __func__);
150 return (
L_BMF *)ERROR_PTR(
"font pixa not made", __func__, NULL);
154 bmf->
size = fontsize;
173 L_WARNING(
"ptr address is null!\n", __func__);
177 if ((bmf = *pbmf) == NULL)
207 if ((index = (l_int32)chr) == 10)
210 return (
PIX *)ERROR_PTR(
"bmf not defined", __func__, NULL);
214 L_ERROR(
"no bitmap representation for %d\n", __func__, index);
218 if ((pixa = bmf->
pixa) == NULL)
219 return (
PIX *)ERROR_PTR(
"pixa not found", __func__, NULL);
242 return ERROR_INT(
"&w not defined", __func__, 1);
245 return ERROR_INT(
"bmf not defined", __func__, 1);
246 if ((index = (l_int32)chr) == 10)
251 L_ERROR(
"no bitmap representation for %d\n", __func__, index);
255 if ((pixa = bmf->
pixa) == NULL)
256 return ERROR_INT(
"pixa not found", __func__, 1);
278 return ERROR_INT(
"&baseline not defined", __func__, 1);
281 return ERROR_INT(
"bmf not defined", __func__, 1);
282 if ((index = (l_int32)chr) == 10)
287 L_ERROR(
"no bitmap representation for %d\n", __func__, index);
325 fileno = (fontsize / 2) - 2;
326 if (fileno < 0 || fileno >= NUM_FONTS)
327 return (
PIXA *)ERROR_PTR(
"font size invalid", __func__, NULL);
328 if (!pbl0 || !pbl1 || !pbl2)
329 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
330 *pbl0 = baselines[fileno][0];
331 *pbl1 = baselines[fileno][1];
332 *pbl2 = baselines[fileno][2];
334 pathname =
pathJoin(dir, outputfonts[fileno]);
339 L_WARNING(
"pixa of char bitmaps not found\n", __func__);
368 l_int32 bl1, bl2, bl3;
371 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
372 return ERROR_INT(
"fontsize must be in {4, 6, ..., 20}", __func__, 1);
379 return ERROR_INT(
"pixa not made", __func__, 1);
381 pathname =
pathJoin(outdir, outputfonts[(fontsize - 4) / 2]);
385 L_INFO(
"Found %d chars in font size %d\n", __func__,
pixaGetCount(pixa),
387 L_INFO(
"Baselines are at: %d, %d, %d\n", __func__, bl1, bl2, bl3);
434 if (!pbl0 || !pbl1 || !pbl2)
435 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
436 *pbl0 = *pbl1 = *pbl2 = 0;
438 return (
PIXA *)ERROR_PTR(
"dir not defined", __func__, NULL);
439 fileno = (fontsize / 2) - 2;
440 if (fileno < 0 || fileno >= NUM_FONTS)
441 return (
PIXA *)ERROR_PTR(
"font size invalid", __func__, NULL);
443 pathname =
pathJoin(dir, inputfonts[fileno]);
447 L_ERROR(
"pix not found for font size %d\n", __func__, fontsize);
478 l_int32 redsize, nbytes;
482 if (!pbl0 || !pbl1 || !pbl2)
483 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
484 *pbl0 = *pbl1 = *pbl2 = 0;
485 redsize = (fontsize / 2) - 2;
486 if (redsize < 0 || redsize >= NUM_FONTS)
487 return (
PIXA *)ERROR_PTR(
"invalid font size", __func__, NULL);
490 data = decodeBase64(fontdata_4, strlen(fontdata_4), &nbytes);
491 }
else if (fontsize == 6) {
492 data = decodeBase64(fontdata_6, strlen(fontdata_6), &nbytes);
493 }
else if (fontsize == 8) {
494 data = decodeBase64(fontdata_8, strlen(fontdata_8), &nbytes);
495 }
else if (fontsize == 10) {
496 data = decodeBase64(fontdata_10, strlen(fontdata_10), &nbytes);
497 }
else if (fontsize == 12) {
498 data = decodeBase64(fontdata_12, strlen(fontdata_12), &nbytes);
499 }
else if (fontsize == 14) {
500 data = decodeBase64(fontdata_14, strlen(fontdata_14), &nbytes);
501 }
else if (fontsize == 16) {
502 data = decodeBase64(fontdata_16, strlen(fontdata_16), &nbytes);
503 }
else if (fontsize == 18) {
504 data = decodeBase64(fontdata_18, strlen(fontdata_18), &nbytes);
506 data = decodeBase64(fontdata_20, strlen(fontdata_20), &nbytes);
509 return (
PIXA *)ERROR_PTR(
"data not made", __func__, NULL);
514 return (
PIXA *)ERROR_PTR(
"pix not made", __func__, NULL);
547 l_int32 i, j, nrows, nrowchars, nchars, h, yval;
548 l_int32 width, height;
551 BOX *box, *box1, *box2;
552 BOXA *boxar, *boxac, *boxacs;
553 PIX *pix1, *pix2, *pixr, *pixrc, *pixc;
555 l_int32 n, w, inrow, top;
559 if (!pbl0 || !pbl1 || !pbl2)
560 return (
PIXA *)ERROR_PTR(
"&bl not all defined", __func__, NULL);
561 *pbl0 = *pbl1 = *pbl2 = 0;
563 return (
PIXA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
566 w = pixGetWidth(pixs);
572 for (i = 0; i < n; i++) {
573 if (!inrow && ia[i] > 0) {
576 }
else if (inrow && ia[i] == 0) {
586 L_INFO(
"For fontsize %s, have %d rows\n", __func__, fontsize, nrows);
589 L_INFO(
"nrows = %d; skipping fontsize %d\n", __func__, nrows, fontsize);
591 return (
PIXA *)ERROR_PTR(
"3 rows not generated", __func__, NULL);
601 for (i = 0; i < nrows; i++) {
608 L_INFO(
"Baseline info: row %d, yval = %d, h = %d\n", __func__,
609 i, yval, pixGetHeight(pixr));
614 pixWriteDebug(
"/tmp/baseline/row0.png", pix1, IFF_PNG);
616 pixWriteDebug(
"/tmp/baseline/row1.png", pix1, IFF_PNG);
618 pixWriteDebug(
"/tmp/baseline/row2.png", pix1, IFF_PNG);
629 box1->
w = box2->
x + box2->
w - box1->
x;
634 h = pixGetHeight(pixr);
636 for (j = 0; j < nrowchars; j++) {
638 if (box->
w <= 2 && box->
h == 1) {
646 if (i == 0 && j == 0)
648 if (i == 2 && j == 0)
661 return (
PIXA *)ERROR_PTR(
"95 chars not generated", __func__, NULL);
670 width = 2 * pixGetWidth(pix1);
671 height = pixGetHeight(pix1);
684 pixDisplay(pix1, 100 * i, 200);
714 l_int32 i, h, val1, val2, diff, diffmax, ymax;
719 return ERROR_INT(
"pixs not defined", __func__, 1);
721 return ERROR_INT(
"&y not defined", __func__, 1);
732 for (i = 1; i < h; i++) {
735 diff = L_MAX(0, val1 - val2);
736 if (diff > diffmax) {
785 l_int32 i, maxh, height, charwidth, xwidth, kernwidth;
786 l_int32 *fonttab, *baselinetab, *widthtab;
790 return ERROR_INT(
"bmf not defined", __func__, 1);
793 fonttab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
795 for (i = 0; i < 128; i++)
797 for (i = 32; i < 127; i++)
800 baselinetab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
802 for (i = 0; i < 128; i++)
803 baselinetab[i] = UNDEF;
804 for (i = 32; i <= 57; i++)
806 for (i = 58; i <= 91; i++)
809 for (i = 93; i < 127; i++)
813 widthtab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
815 for (i = 0; i < 128; i++)
817 for (i = 32; i < 127; i++) {
819 widthtab[i] = charwidth;
825 maxh = pixGetHeight(pix);
828 height = pixGetHeight(pix);
830 maxh = L_MAX(maxh, height);
832 height = pixGetHeight(pix);
834 maxh = L_MAX(maxh, height);
842 kernwidth = (l_int32)(0.08 * (l_float32)xwidth + 0.5);
PIXA * pixaGetFont(const char *dir, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGetFont()
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
static PIXA * pixaGenerateFontFromFile(const char *dir, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFontFromFile()
static PIXA * pixaGenerateFont(PIX *pixs, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFont()
PIX * bmfGetPix(L_BMF *bmf, char chr)
bmfGetPix()
L_BMF * bmfCreate(const char *dir, l_int32 fontsize)
bmfCreate()
static PIXA * pixaGenerateFontFromString(l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFontFromString()
l_ok bmfGetBaseline(L_BMF *bmf, char chr, l_int32 *pbaseline)
bmfGetBaseline()
static l_int32 bmfMakeAsciiTables(L_BMF *bmf)
bmfMakeAsciiTables
l_ok pixaSaveFont(const char *indir, const char *outdir, l_int32 fontsize)
pixaSaveFont()
static l_int32 pixGetTextBaseline(PIX *pixs, l_int32 *tab8, l_int32 *py)
pixGetTextBaseline()
l_ok bmfGetWidth(L_BMF *bmf, char chr, l_int32 *pw)
bmfGetWidth()
void boxDestroy(BOX **pbox)
boxDestroy()
l_ok boxaRemoveBox(BOXA *boxa, l_int32 index)
boxaRemoveBox()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
l_int32 boxaGetCount(const BOXA *boxa)
boxaGetCount()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
BOXA * boxaSort(BOXA *boxas, l_int32 sorttype, l_int32 sortorder, NUMA **pnaindex)
boxaSort()
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
l_ok pixRenderLine(PIX *pix, l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2, l_int32 width, l_int32 op)
pixRenderLine()
PIX * pixCloseSafeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeBrick()
void numaDestroy(NUMA **pna)
numaDestroy()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
void pixDestroy(PIX **ppix)
pixDestroy()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_int32 * makePixelSumTab8(void)
makePixelSumTab8()
NUMA * pixCountPixelsByRow(PIX *pix, l_int32 *tab8)
pixCountPixelsByRow()
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
l_ok pixaGetPixDimensions(PIXA *pixa, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixaGetPixDimensions()
PIXA * pixaRead(const char *filename)
pixaRead()
l_ok pixaReplacePix(PIXA *pixa, l_int32 index, PIX *pix, BOX *box)
pixaReplacePix()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
l_ok pixaWrite(const char *filename, PIXA *pixa)
pixaWrite()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
PIX * pixaDisplayTiled(PIXA *pixa, l_int32 maxwidth, l_int32 background, l_int32 spacing)
pixaDisplayTiled()
PIX * pixReadMem(const l_uint8 *data, size_t size)
pixReadMem()
PIX * pixRead(const char *filename)
pixRead()
PIX * pixFlipLR(PIX *pixd, PIX *pixs)
pixFlipLR()
char * stringNew(const char *src)
stringNew()
l_int32 lept_rmdir(const char *subdir)
lept_rmdir()
char * pathJoin(const char *dir, const char *fname)
pathJoin()
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()