70 #include <config_auto.h>
74 #include "allheaders.h"
77 static const l_float32 VertFractSep = 0.3;
80 #define DEBUG_BASELINE 0
82 #define DEBUG_FONT_GEN 0
86 l_int32 *pbl0, l_int32 *pbl1,
89 l_int32 *pbl1, l_int32 *pbl2);
91 l_int32 *pbl1, l_int32 *pbl2);
123 PROCNAME(
"bmfCreate");
125 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
126 return (
L_BMF *)ERROR_PTR(
"fontsize must be in {4, 6, ..., 20}",
138 L_INFO(
"Generating pixa of bitmap fonts from file\n", procName);
142 L_ERROR(
"Failed to make font; use string\n", procName);
151 return (
L_BMF *)ERROR_PTR(
"font pixa not made", procName, NULL);
155 bmf->
size = fontsize;
173 PROCNAME(
"bmfDestroy");
176 L_WARNING(
"ptr address is null!\n", procName);
180 if ((bmf = *pbmf) == NULL)
210 PROCNAME(
"bmfGetPix");
212 if ((index = (l_int32)chr) == 10)
215 return (
PIX *)ERROR_PTR(
"bmf not defined", procName, NULL);
219 L_ERROR(
"no bitmap representation for %d\n", procName, index);
223 if ((pixa = bmf->
pixa) == NULL)
224 return (
PIX *)ERROR_PTR(
"pixa not found", procName, NULL);
246 PROCNAME(
"bmfGetWidth");
249 return ERROR_INT(
"&w not defined", procName, 1);
252 return ERROR_INT(
"bmf not defined", procName, 1);
253 if ((index = (l_int32)chr) == 10)
258 L_ERROR(
"no bitmap representation for %d\n", procName, index);
262 if ((pixa = bmf->
pixa) == NULL)
263 return ERROR_INT(
"pixa not found", procName, 1);
284 PROCNAME(
"bmfGetBaseline");
287 return ERROR_INT(
"&baseline not defined", procName, 1);
290 return ERROR_INT(
"bmf not defined", procName, 1);
291 if ((index = (l_int32)chr) == 10)
296 L_ERROR(
"no bitmap representation for %d\n", procName, index);
334 PROCNAME(
"pixaGetFont");
336 fileno = (fontsize / 2) - 2;
337 if (fileno < 0 || fileno >= NUM_FONTS)
338 return (
PIXA *)ERROR_PTR(
"font size invalid", procName, NULL);
339 if (!pbl0 || !pbl1 || !pbl2)
340 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
341 *pbl0 = baselines[fileno][0];
342 *pbl1 = baselines[fileno][1];
343 *pbl2 = baselines[fileno][2];
345 pathname =
pathJoin(dir, outputfonts[fileno]);
350 L_WARNING(
"pixa of char bitmaps not found\n", procName);
379 l_int32 bl1, bl2, bl3;
382 PROCNAME(
"pixaSaveFont");
384 if (fontsize < 4 || fontsize > 20 || (fontsize % 2))
385 return ERROR_INT(
"fontsize must be in {4, 6, ..., 20}", procName, 1);
392 return ERROR_INT(
"pixa not made", procName, 1);
394 pathname =
pathJoin(outdir, outputfonts[(fontsize - 4) / 2]);
398 L_INFO(
"Found %d chars in font size %d\n", procName,
pixaGetCount(pixa),
400 L_INFO(
"Baselines are at: %d, %d, %d\n", procName, bl1, bl2, bl3);
447 PROCNAME(
"pixaGenerateFontFromFile");
449 if (!pbl0 || !pbl1 || !pbl2)
450 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
451 *pbl0 = *pbl1 = *pbl2 = 0;
453 return (
PIXA *)ERROR_PTR(
"dir not defined", procName, NULL);
454 fileno = (fontsize / 2) - 2;
455 if (fileno < 0 || fileno >= NUM_FONTS)
456 return (
PIXA *)ERROR_PTR(
"font size invalid", procName, NULL);
458 pathname =
pathJoin(dir, inputfonts[fileno]);
462 L_ERROR(
"pix not found for font size %d\n", procName, fontsize);
493 l_int32 redsize, nbytes;
497 PROCNAME(
"pixaGenerateFontFromString");
499 if (!pbl0 || !pbl1 || !pbl2)
500 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
501 *pbl0 = *pbl1 = *pbl2 = 0;
502 redsize = (fontsize / 2) - 2;
503 if (redsize < 0 || redsize >= NUM_FONTS)
504 return (
PIXA *)ERROR_PTR(
"invalid font size", procName, NULL);
507 data = decodeBase64(fontdata_4, strlen(fontdata_4), &nbytes);
508 }
else if (fontsize == 6) {
509 data = decodeBase64(fontdata_6, strlen(fontdata_6), &nbytes);
510 }
else if (fontsize == 8) {
511 data = decodeBase64(fontdata_8, strlen(fontdata_8), &nbytes);
512 }
else if (fontsize == 10) {
513 data = decodeBase64(fontdata_10, strlen(fontdata_10), &nbytes);
514 }
else if (fontsize == 12) {
515 data = decodeBase64(fontdata_12, strlen(fontdata_12), &nbytes);
516 }
else if (fontsize == 14) {
517 data = decodeBase64(fontdata_14, strlen(fontdata_14), &nbytes);
518 }
else if (fontsize == 16) {
519 data = decodeBase64(fontdata_16, strlen(fontdata_16), &nbytes);
520 }
else if (fontsize == 18) {
521 data = decodeBase64(fontdata_18, strlen(fontdata_18), &nbytes);
523 data = decodeBase64(fontdata_20, strlen(fontdata_20), &nbytes);
526 return (
PIXA *)ERROR_PTR(
"data not made", procName, NULL);
531 return (
PIXA *)ERROR_PTR(
"pix not made", procName, NULL);
564 l_int32 i, j, nrows, nrowchars, nchars, h, yval;
565 l_int32 width, height;
568 BOX *box, *box1, *box2;
569 BOXA *boxar, *boxac, *boxacs;
570 PIX *pix1, *pix2, *pixr, *pixrc, *pixc;
572 l_int32 n, w, inrow, top;
576 PROCNAME(
"pixaGenerateFont");
578 if (!pbl0 || !pbl1 || !pbl2)
579 return (
PIXA *)ERROR_PTR(
"&bl not all defined", procName, NULL);
580 *pbl0 = *pbl1 = *pbl2 = 0;
582 return (
PIXA *)ERROR_PTR(
"pixs not defined", procName, NULL);
585 w = pixGetWidth(pixs);
591 for (i = 0; i < n; i++) {
592 if (!inrow && ia[i] > 0) {
595 }
else if (inrow && ia[i] == 0) {
605 L_INFO(
"For fontsize %s, have %d rows\n", procName, fontsize, nrows);
608 L_INFO(
"nrows = %d; skipping fontsize %d\n", procName, nrows, fontsize);
610 return (
PIXA *)ERROR_PTR(
"3 rows not generated", procName, NULL);
620 for (i = 0; i < nrows; i++) {
627 L_INFO(
"Baseline info: row %d, yval = %d, h = %d\n", procName,
628 i, yval, pixGetHeight(pixr));
633 pixWriteDebug(
"/tmp/baseline/row0.png", pix1, IFF_PNG);
635 pixWriteDebug(
"/tmp/baseline/row1.png", pix1, IFF_PNG);
637 pixWriteDebug(
"/tmp/baseline/row2.png", pix1, IFF_PNG);
648 box1->
w = box2->
x + box2->
w - box1->
x;
653 h = pixGetHeight(pixr);
655 for (j = 0; j < nrowchars; j++) {
657 if (box->
w <= 2 && box->
h == 1) {
665 if (i == 0 && j == 0)
667 if (i == 2 && j == 0)
680 return (
PIXA *)ERROR_PTR(
"95 chars not generated", procName, NULL);
689 width = 2 * pixGetWidth(pix1);
690 height = pixGetHeight(pix1);
703 pixDisplay(pix1, 100 * i, 200);
733 l_int32 i, h, val1, val2, diff, diffmax, ymax;
737 PROCNAME(
"pixGetTextBaseline");
740 return ERROR_INT(
"pixs not defined", procName, 1);
742 return ERROR_INT(
"&y not defined", procName, 1);
753 for (i = 1; i < h; i++) {
756 diff = L_MAX(0, val1 - val2);
757 if (diff > diffmax) {
806 l_int32 i, maxh, height, charwidth, xwidth, kernwidth;
807 l_int32 *fonttab, *baselinetab, *widthtab;
810 PROCNAME(
"bmfMakeAsciiTables");
813 return ERROR_INT(
"bmf not defined", procName, 1);
816 fonttab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
818 for (i = 0; i < 128; i++)
820 for (i = 32; i < 127; i++)
823 baselinetab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
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 widthtab = (l_int32 *)LEPT_CALLOC(128,
sizeof(l_int32));
838 for (i = 0; i < 128; i++)
840 for (i = 32; i < 127; i++) {
842 widthtab[i] = charwidth;
848 maxh = pixGetHeight(pix);
851 height = pixGetHeight(pix);
853 maxh = L_MAX(maxh, height);
855 height = pixGetHeight(pix);
857 maxh = L_MAX(maxh, height);
865 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_int32 boxaGetCount(BOXA *boxa)
boxaGetCount()
l_ok boxaAddBox(BOXA *boxa, BOX *box, l_int32 copyflag)
boxaAddBox()
void boxaDestroy(BOXA **pboxa)
boxaDestroy()
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()