111#include <config_auto.h>
115#include "allheaders.h"
163convertFilesToPS(
const char *dirin,
171 return ERROR_INT(
"dirin not defined", __func__, 1);
173 return ERROR_INT(
"fileout not defined", __func__, 1);
175 L_INFO(
"setting res to 300 ppi\n", __func__);
178 if (res < 10 || res > 4000)
179 L_WARNING(
"res is typically in the range 300-600 ppi\n", __func__);
182 sa = getSortedPathnamesInDirectory(dirin, substr, 0, 0);
185 l_psWriteBoundingBox(FALSE);
186 sarrayConvertFilesToPS(sa, res, fileout);
187 l_psWriteBoundingBox(TRUE);
208sarrayConvertFilesToPS(
SARRAY *sa,
213l_int32 i, nfiles, index, ret, format;
216 return ERROR_INT(
"sa not defined", __func__, 1);
218 return ERROR_INT(
"fileout not defined", __func__, 1);
220 L_INFO(
"setting res to 300 ppi\n", __func__);
223 if (res < 10 || res > 4000)
224 L_WARNING(
"res is typically in the range 300-600 ppi\n", __func__);
226 nfiles = sarrayGetCount(sa);
227 for (i = 0, index = 0; i < nfiles; i++) {
228 fname = sarrayGetString(sa, i,
L_NOCOPY);
229 ret = pixReadHeader(fname, &format, NULL, NULL, NULL, NULL, NULL);
231 if (format == IFF_UNKNOWN)
234 writeImageCompressedToPSFile(fname, fileout, res, &index);
273convertFilesFittedToPS(
const char *dirin,
282 return ERROR_INT(
"dirin not defined", __func__, 1);
284 return ERROR_INT(
"fileout not defined", __func__, 1);
286 L_INFO(
"setting xpts to 612.0 ppi\n", __func__);
290 L_INFO(
"setting ypts to 792.0 ppi\n", __func__);
293 if (xpts < 100.0 || xpts > 2000.0 || ypts < 100.0 || ypts > 2000.0)
294 L_WARNING(
"xpts,ypts are typically in the range 500-800\n", __func__);
297 sa = getSortedPathnamesInDirectory(dirin, substr, 0, 0);
300 l_psWriteBoundingBox(FALSE);
301 sarrayConvertFilesFittedToPS(sa, xpts, ypts, fileout);
302 l_psWriteBoundingBox(TRUE);
323sarrayConvertFilesFittedToPS(
SARRAY *sa,
329l_int32 ret, i, w, h, nfiles, index, format, res;
332 return ERROR_INT(
"sa not defined", __func__, 1);
334 return ERROR_INT(
"fileout not defined", __func__, 1);
336 L_INFO(
"setting xpts to 612.0\n", __func__);
340 L_INFO(
"setting ypts to 792.0\n", __func__);
343 if (xpts < 100.0 || xpts > 2000.0 || ypts < 100.0 || ypts > 2000.0)
344 L_WARNING(
"xpts,ypts are typically in the range 500-800\n", __func__);
346 nfiles = sarrayGetCount(sa);
347 for (i = 0, index = 0; i < nfiles; i++) {
348 fname = sarrayGetString(sa, i,
L_NOCOPY);
349 ret = pixReadHeader(fname, &format, &w, &h, NULL, NULL, NULL);
351 if (format == IFF_UNKNOWN)
355 if (xpts * h < ypts * w)
356 res = (l_int32)((l_float32)w * 72.0 / xpts);
358 res = (l_int32)((l_float32)h * 72.0 / ypts);
360 writeImageCompressedToPSFile(fname, fileout, res, &index);
389writeImageCompressedToPSFile(
const char *filein,
395l_int32 format, retval;
398 return ERROR_INT(
"&index not defined", __func__, 1);
400 findFileFormat(filein, &format);
401 if (format == IFF_UNKNOWN) {
402 L_ERROR(
"format of %s not known\n", __func__, filein);
406 op = (*pindex == 0) ?
"w" :
"a";
407 if (format == IFF_JFIF_JPEG) {
408 retval = convertJpegToPS(filein, fileout, op, 0, 0,
409 res, 1.0, *pindex + 1, TRUE);
410 }
else if (format == IFF_TIFF_G4) {
411 retval = convertG4ToPS(filein, fileout, op, 0, 0,
412 res, 1.0, *pindex + 1, FALSE, TRUE);
414 retval = convertFlateToPS(filein, fileout, op, 0, 0,
415 res, 1.0, *pindex + 1, TRUE);
417 if (retval == 0) (*pindex)++;
482convertSegmentedPagesToPS(
const char *pagedir,
491 l_float32 imagescale,
495l_int32 pageno, i, npages;
500 return ERROR_INT(
"pagedir not defined", __func__, 1);
502 return ERROR_INT(
"maskdir not defined", __func__, 1);
504 return ERROR_INT(
"fileout not defined", __func__, 1);
505 if (threshold <= 0) {
506 L_INFO(
"setting threshold to 190\n", __func__);
511 sapage = getNumberedPathnamesInDirectory(pagedir, pagestr,
512 page_numpre, numpost, maxnum);
513 samask = getNumberedPathnamesInDirectory(maskdir, maskstr,
514 mask_numpre, numpost, maxnum);
515 sarrayPadToSameSize(sapage, samask,
"");
516 if ((npages = sarrayGetCount(sapage)) == 0) {
517 sarrayDestroy(&sapage);
518 sarrayDestroy(&samask);
519 return ERROR_INT(
"no matching pages found", __func__, 1);
524 for (i = 0; i < npages; i++) {
525 if ((pixs = pixReadIndexed(sapage, i)) == NULL)
527 pixm = pixReadIndexed(samask, i);
528 pixWriteSegmentedPageToPS(pixs, pixm, textscale, imagescale,
529 threshold, pageno, fileout);
535 sarrayDestroy(&sapage);
536 sarrayDestroy(&samask);
578pixWriteSegmentedPageToPS(
PIX *pixs,
581 l_float32 imagescale,
586l_int32 alltext, notext, d, ret;
589PIX *pixmi, *pixmis, *pixt, *pixg, *pixsc, *pixb, *pixc;
592 return ERROR_INT(
"pixs not defined", __func__, 1);
594 return ERROR_INT(
"fileout not defined", __func__, 1);
595 if (imagescale <= 0.0 || textscale <= 0.0)
596 return ERROR_INT(
"relative scales must be > 0.0", __func__, 1);
607 pixZero(pixm, &alltext);
611 pixmi = pixInvert(NULL, pixm);
612 pixZero(pixmi, ¬ext);
614 scaleratio = textscale / imagescale;
618 if (pixGetDepth(pixs) == 1) {
619 pixb = pixClone(pixs);
622 pixt = pixConvertTo8Or32(pixs,
L_CLONE, 0);
627 if (notext == FALSE) {
628 d = pixGetDepth(pixt);
630 pixg = pixCopy(NULL, pixt);
632 pixg = pixConvertRGBToLuminance(pixt);
634 pixSetMasked(pixg, pixm, 255);
635 if (textscale == 1.0)
636 pixsc = pixClone(pixg);
637 else if (textscale >= 0.7)
638 pixsc = pixScaleGrayLI(pixg, textscale, textscale);
640 pixsc = pixScaleAreaMap(pixg, textscale, textscale);
641 pixb = pixThresholdToBinary(pixsc, threshold);
649 if (imagescale == 1.0)
650 pixsc = pixClone(pixt);
652 pixsc = pixScale(pixt, imagescale, imagescale);
663 if (notext == FALSE) {
664 pixmis = pixScale(pixm, imagescale, imagescale);
665 pixmi = pixInvert(NULL, pixmis);
666 val = (d == 8) ? 0xff : 0xffffff00;
667 pixc = pixCopy(NULL, pixsc);
668 pixSetMasked(pixc, pixmi, val);
672 pixc = pixClone(pixsc);
680 l_psWriteBoundingBox(FALSE);
681 ret = pixWriteMixedToPS(pixb, pixc, scaleratio, pageno, fileout);
682 l_psWriteBoundingBox(TRUE);
727pixWriteMixedToPS(
PIX *pixb,
735l_int32 resb, resc, endpage, maskop, ret;
738 return ERROR_INT(
"pixb and pixc both undefined", __func__, 1);
740 return ERROR_INT(
"fileout not defined", __func__, 1);
744 resb = getResLetterPage(pixGetWidth(pixb), pixGetHeight(pixb), 0);
746 resc = getResLetterPage(pixGetWidth(pixc), pixGetHeight(pixc), 0);
748 resb = (l_int32)(scale * resc);
753 tname = l_makeTempFilename();
754 pixWrite(tname, pixc, IFF_JFIF_JPEG);
755 endpage = (pixb) ? FALSE : TRUE;
756 op = (pageno <= 1) ?
"w" :
"a";
757 ret = convertJpegToPS(tname, fileout, op, 0, 0, resc, 1.0,
762 return ERROR_INT(
"jpeg data not written", __func__, 1);
768 tname = l_makeTempFilename();
769 pixWrite(tname, pixb, IFF_TIFF_G4);
770 op = (pageno <= 1 && !pixc) ?
"w" :
"a";
771 maskop = (pixc) ? 1 : 0;
772 ret = convertG4ToPS(tname, fileout, op, 0, 0, resb, 1.0,
777 return ERROR_INT(
"tiff data not written", __func__, 1);
812convertToPSEmbed(
const char *filein,
821 return ERROR_INT(
"filein not defined", __func__, 1);
823 return ERROR_INT(
"fileout not defined", __func__, 1);
824 if (level != 1 && level != 2 && level != 3) {
825 L_ERROR(
"invalid level specified; using level 2\n", __func__);
830 pixWritePSEmbed(filein, fileout);
835 findFileFormat(filein, &format);
836 if (format == IFF_JFIF_JPEG) {
837 convertJpegToPSEmbed(filein, fileout);
839 }
else if (format == IFF_TIFF_G4) {
840 convertG4ToPSEmbed(filein, fileout);
842 }
else if (format == IFF_UNKNOWN) {
843 L_ERROR(
"format of %s not known\n", __func__, filein);
849 convertFlateToPSEmbed(filein, fileout);
854 if ((pixs = pixRead(filein)) == NULL)
855 return ERROR_INT(
"image not read from file", __func__, 1);
856 d = pixGetDepth(pixs);
857 if ((d == 2 || d == 4) && !pixGetColormap(pixs))
858 pix = pixConvertTo8(pixs, 0);
865 return ERROR_INT(
"converted pix not made", __func__, 1);
867 d = pixGetDepth(pix);
868 tname = l_makeTempFilename();
870 if (pixWrite(tname, pix, IFF_TIFF_G4)) {
873 return ERROR_INT(
"g4 tiff not written", __func__, 1);
875 convertG4ToPSEmbed(tname, fileout);
877 if (pixWrite(tname, pix, IFF_JFIF_JPEG)) {
880 return ERROR_INT(
"jpeg not written", __func__, 1);
882 convertJpegToPSEmbed(tname, fileout);
914pixaWriteCompressedToPS(
PIXA *pixa,
919l_int32 i, n, index, ret;
923 return ERROR_INT(
"pixa not defined", __func__, 1);
925 return ERROR_INT(
"fileout not defined", __func__, 1);
926 if (level != 2 && level != 3) {
927 L_ERROR(
"only levels 2 and 3 permitted; using level 2\n", __func__);
932 n = pixaGetCount(pixa);
933 for (i = 0; i < n; i++) {
934 pix = pixaGetPix(pixa, i,
L_CLONE);
935 ret = pixWriteCompressedToPS(pix, fileout, res, level, &index);
936 if (ret) L_ERROR(
"PS string not written for image %d\n", __func__, i);
986pixWriteCompressedToPS(
PIX *pix,
998 return ERROR_INT(
"pix not defined", __func__, 1);
1000 return ERROR_INT(
"fileout not defined", __func__, 1);
1001 if (level != 2 && level != 3) {
1002 L_ERROR(
"only levels 2 and 3 permitted; using level 2\n", __func__);
1006 return ERROR_INT(
"&index not defined", __func__, 1);
1008 tname = l_makeTempFilename();
1010 d = pixGetDepth(pix);
1011 cmap = pixGetColormap(pix);
1013 if (pixWrite(tname, pix, IFF_TIFF_G4))
1015 }
else if (level == 3) {
1016 if (pixWrite(tname, pix, IFF_PNG))
1020 pixt = pixConvertForPSWrap(pix);
1021 if (pixWrite(tname, pixt, IFF_JFIF_JPEG))
1024 }
else if (d == 16) {
1025 L_WARNING(
"d = 16; converting to 8 bpp for jpeg\n", __func__);
1027 if (pixWrite(tname, pixt, IFF_JFIF_JPEG))
1030 }
else if (d == 2 || d == 4) {
1031 pixt = pixConvertTo8(pix, 0);
1032 if (pixWrite(tname, pixt, IFF_JFIF_JPEG))
1035 }
else if (d == 8 || d == 32) {
1036 if (pixWrite(tname, pix, IFF_JFIF_JPEG))
1039 L_ERROR(
"invalid depth with level 2: %d\n", __func__, d);
1045 writeImageCompressedToPSFile(tname, fileout, res, pindex);
1047 if (lept_rmfile(tname) != 0)
1048 L_ERROR(
"temp file %s was not deleted\n", __func__, tname);
1050 return (writeout) ? 0 : 1;
@ REMOVE_CMAP_BASED_ON_SRC