third-party/leptonica/prog/writetext_reg.c
/*====================================================================*
- Copyright (C) 2001 Leptonica. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANY
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*====================================================================*/
/*
* writetext_reg.c
*
* Regression test for writing a block of text in one of 4 locations
* relative to a pix. This tests writing on 8 different types of images.
* Output is written to /tmp/regout/pixd[1,2,3,4].png
*/
#include "allheaders.h"
void AddTextAndSave(PIXA *pixa, PIX *pixs, L_BMF *bmf, const char *textstr,
l_int32 location, l_uint32 val);
const char *textstr[] =
{"This is a simple test of text writing: 8 bpp",
"This is a simple test of text writing: 32 bpp",
"This is a simple test of text writing: 8 bpp cmapped",
"This is a simple test of text writing: 4 bpp cmapped",
"This is a simple test of text writing: 4 bpp",
"This is a simple test of text writing: 2 bpp cmapped",
"This is a simple test of text writing: 2 bpp",
"This is a simple test of text writing: 1 bpp"};
const char *topstr[] =
{"Text is added above each image",
"Text is added over the top of each image",
"Text is added over the bottom of each image",
"Text is added below each image"};
const l_int32 loc[] = {1, 5, 6, 2};
const l_uint32 colors[6] = {0x4090e000, 0x40e09000, 0x9040e000, 0x90e04000,
0xe0409000, 0xe0904000};
int main(int argc,
char **argv)
{
char buf[512];
l_int32 i;
L_BMF *bmf, *bmftop;
PIX *pixs, *pixt, *pixd;
PIX *pix1, *pix2, *pix3, *pix4, *pix5, *pix6, *pix7, *pix8;
PIXA *pixa;
L_REGPARAMS *rp;
SARRAY *sa;
if (regTestSetup(argc, argv, &rp))
return 1;
bmf = bmfCreate("./fonts", 6);
bmftop = bmfCreate("./fonts", 10);
pixs = pixRead("lucasta-47.jpg");
pix1 = pixScale(pixs, 0.4, 0.4); /* 8 bpp grayscale */
pix2 = pixConvertTo32(pix1); /* 32 bpp rgb */
pix3 = pixThresholdOn8bpp(pix1, 12, 1); /* 8 bpp cmapped */
pix4 = pixThresholdTo4bpp(pix1, 10, 1); /* 4 bpp cmapped */
pix5 = pixThresholdTo4bpp(pix1, 10, 0); /* 4 bpp not cmapped */
pix6 = pixThresholdTo2bpp(pix1, 3, 1); /* 2 bpp cmapped */
pix7 = pixThresholdTo2bpp(pix1, 3, 0); /* 2 bpp not cmapped */
pix8 = pixThresholdToBinary(pix1, 160); /* 1 bpp */
for (i = 0; i < 4; i++) {
pixa = pixaCreate(0);
AddTextAndSave(pixa, pix1, bmf, textstr[0], loc[i], 800);
AddTextAndSave(pixa, pix2, bmf, textstr[1], loc[i], 0xff000000);
AddTextAndSave(pixa, pix3, bmf, textstr[2], loc[i], 0x00ff0000);
AddTextAndSave(pixa, pix4, bmf, textstr[3], loc[i], 0x0000ff00);
AddTextAndSave(pixa, pix5, bmf, textstr[4], loc[i], 800);
AddTextAndSave(pixa, pix6, bmf, textstr[5], loc[i], 0xff000000);
AddTextAndSave(pixa, pix7, bmf, textstr[6], loc[i], 800);
AddTextAndSave(pixa, pix8, bmf, textstr[7], loc[i], 800);
pixt = pixaDisplay(pixa, 0, 0);
pixd = pixAddSingleTextblock(pixt, bmftop, topstr[i],
0xff00ff00, L_ADD_ABOVE, NULL);
regTestWritePixAndCheck(rp, pixd, IFF_PNG); /* 0 - 4 */
pixDisplayWithTitle(pixd, 50 * i, 50, NULL, rp->display);
pixDestroy(&pixt);
pixDestroy(&pixd);
pixaDestroy(&pixa);
}
pixDestroy(&pixs);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
pixDestroy(&pix4);
pixDestroy(&pix5);
pixDestroy(&pix6);
pixDestroy(&pix7);
pixDestroy(&pix8);
bmfDestroy(&bmf);
bmfDestroy(&bmftop);
/* Write multiple lines in different colors, filling up
* the colormap and requesting even more colors. */
pixs = pixRead("weasel4.11c.png");
pix1 = pixConvertTo8(pixs, 0);
pix2 = pixScale(pixs, 8.0, 8.0);
pix3 = pixQuantFromCmap(pix2, pixGetColormap(pixs), 4, 5,
L_EUCLIDEAN_DISTANCE);
regTestWritePixAndCheck(rp, pix3, IFF_PNG); /* 5 */
pixDisplayWithTitle(pix3, 0, 500, NULL, rp->display);
bmf = bmfCreate("fonts", 10);
sa = sarrayCreate(6);
for (i = 0; i < 6; i++) {
snprintf(buf, sizeof(buf), "This is textline %d\n", i);
sarrayAddString(sa, buf, L_COPY);
}
for (i = 0; i < 6; i++) {
pixSetTextline(pix3, bmf, sarrayGetString(sa, i, L_NOCOPY),
colors[i], 50, 120 + 60 * i, NULL, NULL);
}
regTestWritePixAndCheck(rp, pix3, IFF_PNG); /* 6 */
pixDisplayWithTitle(pix3, 600, 500, NULL, rp->display);
pixDestroy(&pixs);
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
bmfDestroy(&bmf);
sarrayDestroy(&sa);
return regTestCleanup(rp);
}
void
AddTextAndSave(PIXA *pixa,
PIX *pixs,
L_BMF *bmf,
const char *textstr,
l_int32 location,
l_uint32 val)
{
l_int32 n, newrow, ovf;
PIX *pixt;
pixt = pixAddSingleTextblock(pixs, bmf, textstr, val, location, &ovf);
n = pixaGetCount(pixa);
newrow = (n % 4) ? 0 : 1;
pixSaveTiledOutline(pixt, pixa, 1, newrow, 30, 2, 32);
if (ovf) fprintf(stderr, "Overflow writing text in image %d\n", n + 1);
pixDestroy(&pixt);
return;
}