70 #include "allheaders.h" 73 static const l_float32 VERT_FRACT_SEP = 0.3;
76 #define DEBUG_BASELINE 0 78 #define DEBUG_FONT_GEN 0 82 l_int32 *pbl0, l_int32 *pbl1,
85 l_int32 *pbl1, l_int32 *pbl2);
87 l_int32 *pbl1, l_int32 *pbl2);
120 PROCNAME(
"bmfCreate");
122 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
123 return (
L_BMF *)ERROR_PTR(
"fontsize must be in {4, 6, ..., 20}",
125 if ((bmf = (
L_BMF *)LEPT_CALLOC(1,
sizeof(
L_BMF))) == NULL)
126 return (
L_BMF *)ERROR_PTR(
"bmf not made", procName, NULL);
135 L_INFO(
"Generating pixa of bitmap fonts from file\n", procName);
139 L_ERROR(
"Failed to make font; use string\n", procName);
148 return (
L_BMF *)ERROR_PTR(
"font pixa not made", procName, NULL);
152 bmf->
size = fontsize;
170 PROCNAME(
"bmfDestroy");
173 L_WARNING(
"ptr address is null!\n", procName);
177 if ((bmf = *pbmf) == NULL)
208 PROCNAME(
"bmfGetPix");
210 if ((index = (l_int32)chr) == 10)
213 return (
PIX *)ERROR_PTR(
"bmf not defined", procName, NULL);
217 L_ERROR(
"no bitmap representation for %d\n", procName, index);
221 if ((pixa = bmf->
pixa) == NULL)
222 return (
PIX *)ERROR_PTR(
"pixa not found", procName, NULL);
244 PROCNAME(
"bmfGetWidth");
247 return ERROR_INT(
"&w not defined", procName, 1);
250 return ERROR_INT(
"bmf not defined", procName, 1);
251 if ((index = (l_int32)chr) == 10)
256 L_ERROR(
"no bitmap representation for %d\n", procName, index);
260 if ((pixa = bmf->
pixa) == NULL)
261 return ERROR_INT(
"pixa not found", procName, 1);
282 PROCNAME(
"bmfGetBaseline");
285 return ERROR_INT(
"&baseline not defined", procName, 1);
288 return ERROR_INT(
"bmf not defined", procName, 1);
289 if ((index = (l_int32)chr) == 10)
294 L_ERROR(
"no bitmap representation for %d\n", procName, index);
332 PROCNAME(
"pixaGetFont");
334 fileno = (fontsize / 2) - 2;
335 if (fileno < 0 || fileno >= NUM_FONTS)
336 return (
PIXA *)ERROR_PTR(
"font size invalid", procName, NULL);
337 if (!pbl0 || !pbl1 || !pbl2)
338 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
339 *pbl0 = baselines[fileno][0];
340 *pbl1 = baselines[fileno][1];
341 *pbl2 = baselines[fileno][2];
343 pathname =
pathJoin(dir, outputfonts[fileno]);
348 L_WARNING(
"pixa of char bitmaps not found\n", procName);
377 l_int32 bl1, bl2, bl3;
380 PROCNAME(
"pixaSaveFont");
382 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
383 return ERROR_INT(
"fontsize must be in {4, 6, ..., 20}", procName, 1);
390 return ERROR_INT(
"pixa not made", procName, 1);
392 pathname =
pathJoin(outdir, outputfonts[(fontsize - 4) / 2]);
396 L_INFO(
"Found %d chars in font size %d\n", procName,
pixaGetCount(pixa),
398 L_INFO(
"Baselines are at: %d, %d, %d\n", procName, bl1, bl2, bl3);
445 PROCNAME(
"pixaGenerateFontFromFile");
447 if (!pbl0 || !pbl1 || !pbl2)
448 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
449 *pbl0 = *pbl1 = *pbl2 = 0;
451 return (
PIXA *)ERROR_PTR(
"dir not defined", procName, NULL);
452 fileno = (fontsize / 2) - 2;
453 if (fileno < 0 || fileno >= NUM_FONTS)
454 return (
PIXA *)ERROR_PTR(
"font size invalid", procName, NULL);
456 pathname =
pathJoin(dir, inputfonts[fileno]);
460 L_ERROR(
"pix not found for font size %d\n", procName, fontsize);
491 l_int32 redsize, nbytes;
495 PROCNAME(
"pixaGenerateFontFromString");
497 if (!pbl0 || !pbl1 || !pbl2)
498 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
499 *pbl0 = *pbl1 = *pbl2 = 0;
500 redsize = (fontsize / 2) - 2;
501 if (redsize < 0 || redsize >= NUM_FONTS)
502 return (
PIXA *)ERROR_PTR(
"invalid font size", procName, NULL);
505 data = decodeBase64(fontdata_4, strlen(fontdata_4), &nbytes);
506 }
else if (fontsize == 6) {
507 data = decodeBase64(fontdata_6, strlen(fontdata_6), &nbytes);
508 }
else if (fontsize == 8) {
509 data = decodeBase64(fontdata_8, strlen(fontdata_8), &nbytes);
510 }
else if (fontsize == 10) {
511 data = decodeBase64(fontdata_10, strlen(fontdata_10), &nbytes);
512 }
else if (fontsize == 12) {
513 data = decodeBase64(fontdata_12, strlen(fontdata_12), &nbytes);
514 }
else if (fontsize == 14) {
515 data = decodeBase64(fontdata_14, strlen(fontdata_14), &nbytes);
516 }
else if (fontsize == 16) {
517 data = decodeBase64(fontdata_16, strlen(fontdata_16), &nbytes);
518 }
else if (fontsize == 18) {
519 data = decodeBase64(fontdata_18, strlen(fontdata_18), &nbytes);
521 data = decodeBase64(fontdata_20, strlen(fontdata_20), &nbytes);
524 return (
PIXA *)ERROR_PTR(
"data not made", procName, NULL);
529 return (
PIXA *)ERROR_PTR(
"pix not made", procName, NULL);
562 l_int32 i, j, nrows, nrowchars, nchars, h, yval;
563 l_int32 width, height;
566 BOX *box, *box1, *box2;
567 BOXA *boxar, *boxac, *boxacs;
568 PIX *pix1, *pix2, *pixr, *pixrc, *pixc;
570 l_int32 n, w, inrow, top;
574 PROCNAME(
"pixaGenerateFont");
576 if (!pbl0 || !pbl1 || !pbl2)
577 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
578 *pbl0 = *pbl1 = *pbl2 = 0;
580 return (
PIXA *)ERROR_PTR(
"pixs not defined", procName, NULL);
583 w = pixGetWidth(
pixs);
589 for (i = 0; i < n; i++) {
590 if (!inrow && ia[i] > 0) {
593 }
else if (inrow && ia[i] == 0) {
603 L_INFO(
"For fontsize %s, have %d rows\n", procName, fontsize, nrows);
606 L_INFO(
"nrows = %d; skipping fontsize %d\n", procName, nrows, fontsize);
608 return (
PIXA *)ERROR_PTR(
"3 rows not generated", procName, NULL);
618 for (i = 0; i < nrows; i++) {
625 L_INFO(
"Baseline info: row %d, yval = %d, h = %d\n", procName,
626 i, yval, pixGetHeight(pixr));
631 pixWriteDebug(
"/tmp/baseline/row0.png", pix1, IFF_PNG);
633 pixWriteDebug(
"/tmp/baseline/row1.png", pix1, IFF_PNG);
635 pixWriteDebug(
"/tmp/baseline/row2.png", pix1, IFF_PNG);
646 box1->
w = box2->
x + box2->
w - box1->
x;
651 h = pixGetHeight(pixr);
653 for (j = 0; j < nrowchars; j++) {
655 if (box->
w <= 2 && box->
h == 1) {
663 if (i == 0 && j == 0)
665 if (i == 2 && j == 0)
678 return (
PIXA *)ERROR_PTR(
"95 chars not generated", procName, NULL);
687 width = 2 * pixGetWidth(pix1);
688 height = pixGetHeight(pix1);
701 pixDisplay(pix1, 100 * i, 200);
731 l_int32 i, h, val1, val2, diff, diffmax, ymax;
735 PROCNAME(
"pixGetTextBaseline");
738 return ERROR_INT(
"pixs not defined", procName, 1);
740 return ERROR_INT(
"&y not defined", procName, 1);
751 for (i = 1; i < h; i++) {
754 diff = L_MAX(0, val1 - val2);
755 if (diff > diffmax) {
804 l_int32 i, maxh, height, charwidth, xwidth, kernwidth;
805 l_int32 *fonttab, *baselinetab, *widthtab;
808 PROCNAME(
"bmfMakeAsciiTables");
811 return ERROR_INT(
"bmf not defined", procName, 1);
814 if ((fonttab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32))) == NULL)
815 return ERROR_INT(
"fonttab not made", procName, 1);
817 for (i = 0; i < 128; i++)
819 for (i = 32; i < 127; i++)
822 if ((baselinetab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32))) == NULL)
823 return ERROR_INT(
"baselinetab not made", procName, 1);
825 for (i = 0; i < 128; i++)
826 baselinetab[i] = UNDEF;
827 for (i = 32; i <= 57; i++)
829 for (i = 58; i <= 91; i++)
832 for (i = 93; i < 127; i++)
836 if ((widthtab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32))) == NULL)
837 return ERROR_INT(
"widthtab not made", procName, 1);
839 for (i = 0; i < 128; i++)
841 for (i = 32; i < 127; i++) {
843 widthtab[i] = charwidth;
849 maxh = pixGetHeight(pix);
852 height = pixGetHeight(pix);
854 maxh = L_MAX(maxh, height);
856 height = pixGetHeight(pix);
858 maxh = L_MAX(maxh, height);
866 kernwidth = (l_int32)(0.08 * (l_float32)xwidth + 0.5);
static PIXA * pixaGenerateFont(PIX *pixs, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFont()
PIX * pixFlipLR(PIX *pixd, PIX *pixs)
pixFlipLR()
NUMA * pixCountPixelsByRow(PIX *pix, l_int32 *tab8)
pixCountPixelsByRow()
void bmfDestroy(L_BMF **pbmf)
bmfDestroy()
l_int32 lept_mkdir(const char *subdir)
lept_mkdir()
PIX * bmfGetPix(L_BMF *bmf, char chr)
bmfGetPix()
BOXA * boxaSort(BOXA *boxas, l_int32 sorttype, l_int32 sortorder, NUMA **pnaindex)
boxaSort()
l_ok pixaSaveFont(const char *indir, const char *outdir, l_int32 fontsize)
pixaSaveFont()
PIXA * pixaGetFont(const char *dir, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGetFont()
PIXA * pixaCreate(l_int32 n)
pixaCreate()
char * stringNew(const char *src)
stringNew()
l_ok pixaWrite(const char *filename, PIXA *pixa)
pixaWrite()
PIXA * pixaRead(const char *filename)
pixaRead()
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
PIX * pixReadMem(const l_uint8 *data, size_t size)
pixReadMem()
PIX * pixClipRectangle(PIX *pixs, BOX *box, BOX **pboxc)
pixClipRectangle()
l_ok bmfGetWidth(L_BMF *bmf, char chr, l_int32 *pw)
bmfGetWidth()
l_int32 * numaGetIArray(NUMA *na)
numaGetIArray()
static l_int32 bmfMakeAsciiTables(L_BMF *bmf)
bmfMakeAsciiTables
BOXA * pixConnComp(PIX *pixs, PIXA **ppixa, l_int32 connectivity)
pixConnComp()
l_ok numaGetIValue(NUMA *na, l_int32 index, l_int32 *pival)
numaGetIValue()
l_ok pixaAddPix(PIXA *pixa, PIX *pix, l_int32 copyflag)
pixaAddPix()
PIX * pixCloseSafeBrick(PIX *pixd, PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseSafeBrick()
l_int32 numaGetCount(NUMA *na)
numaGetCount()
static PIXA * pixaGenerateFontFromFile(const char *dir, l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFontFromFile()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
l_int32 * makePixelSumTab8(void)
makePixelSumTab8()
void pixDestroy(PIX **ppix)
pixDestroy()
BOX * boxaGetBox(BOXA *boxa, l_int32 index, l_int32 accessflag)
boxaGetBox()
l_ok bmfGetBaseline(L_BMF *bmf, char chr, l_int32 *pbaseline)
bmfGetBaseline()
l_ok pixRenderLine(PIX *pix, l_int32 x1, l_int32 y1, l_int32 x2, l_int32 y2, l_int32 width, l_int32 op)
pixRenderLine()
void numaDestroy(NUMA **pna)
numaDestroy()
PIX * pixRead(const char *filename)
pixRead()
l_ok boxaRemoveBox(BOXA *boxa, l_int32 index)
boxaRemoveBox()
char * pathJoin(const char *dir, const char *fname)
pathJoin()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
static PIXA * pixaGenerateFontFromString(l_int32 fontsize, l_int32 *pbl0, l_int32 *pbl1, l_int32 *pbl2)
pixaGenerateFontFromString()
l_ok pixaGetPixDimensions(PIXA *pixa, l_int32 index, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixaGetPixDimensions()
BOXA * boxaCreate(l_int32 n)
boxaCreate()
PIX * pixCopy(PIX *pixd, PIX *pixs)
pixCopy()
void boxDestroy(BOX **pbox)
boxDestroy()
l_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
static l_int32 pixGetTextBaseline(PIX *pixs, l_int32 *tab8, l_int32 *py)
pixGetTextBaseline()
l_int32 lept_rmdir(const char *subdir)
lept_rmdir()
void pixaDestroy(PIXA **ppixa)
pixaDestroy()
BOX * boxCreate(l_int32 x, l_int32 y, l_int32 w, l_int32 h)
boxCreate()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()
l_ok pixaReplacePix(PIXA *pixa, l_int32 index, PIX *pix, BOX *box)
pixaReplacePix()
PIX * pixaDisplayTiled(PIXA *pixa, l_int32 maxwidth, l_int32 background, l_int32 spacing)
pixaDisplayTiled()
L_BMF * bmfCreate(const char *dir, l_int32 fontsize)
bmfCreate()