#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "allheaders.h"
Макросы | |
#define | L_BUF_SIZE 512 |
#define | DEBUG_MIXED_PS 0 |
#define | DEBUG_JPEG 0 |
#define | DEBUG_G4 0 |
#define | PRINT_BOUNDING_BOX 0 |
Функции | |
static l_int32 | writeImageCompressedToPSFile (const char *filein, const char *fileout, l_int32 format, l_int32 res, l_int32 *pfirstfile, l_int32 *pindex) |
l_int32 | convertFilesToPS (const char *dirin, const char *substr, l_int32 res, const char *fileout) |
l_int32 | sarrayConvertFilesToPS (SARRAY *sa, l_int32 res, const char *fileout) |
l_int32 | convertFilesFittedToPS (const char *dirin, const char *substr, l_float32 xpts, l_float32 ypts, const char *fileout) |
l_int32 | sarrayConvertFilesFittedToPS (SARRAY *sa, l_float32 xpts, l_float32 ypts, const char *fileout) |
l_int32 | convertSegmentedPagesToPS (const char *pagedir, const char *maskdir, l_float32 textscale, l_float32 imagescale, l_int32 threshold, l_int32 numpre, l_int32 numpost, const char *fileout) |
l_int32 | pixWriteSegmentedPageToPS (PIX *pixs, PIX *pixm, l_float32 textscale, l_float32 imagescale, l_int32 threshold, l_int32 pageno, const char *fileout) |
l_int32 | pixWriteMixedToPS (PIX *pixb, PIX *pixc, l_float32 scale, l_int32 pageno, const char *fileout) |
NUMA * | sarrayFindMaskAndPagePairings (SARRAY *sapage, SARRAY *samask, l_int32 numpre, l_int32 numpost, l_int32 maxnum) |
l_int32 | convertToPSEmbed (const char *filein, const char *fileout, l_int32 level) |
l_int32 | pixWritePSEmbed (const char *filein, const char *fileout) |
l_int32 | pixWriteStreamPS (FILE *fp, PIX *pix, BOX *box, l_int32 res, l_float32 scale) |
char * | pixWriteStringPS (PIX *pixs, BOX *box, l_int32 res, l_float32 scale) |
void | getScaledParametersPS (BOX *box, l_int32 wpix, l_int32 hpix, l_int32 res, l_float32 scale, l_float32 *pxpt, l_float32 *pypt, l_float32 *pwpt, l_float32 *phpt) |
void | convertByteToHexAscii (l_uint8 byteval, char *pnib1, char *pnib2) |
l_int32 | convertJpegToPSEmbed (const char *filein, const char *fileout) |
l_int32 | convertJpegToPS (const char *filein, const char *fileout, const char *operation, l_int32 x, l_int32 y, l_int32 res, l_float32 scale, l_int32 pageno, l_int32 endpage) |
l_int32 | convertJpegToPSString (const char *filein, char **poutstr, l_int32 *pnbytes, l_int32 x, l_int32 y, l_int32 res, l_float32 scale, l_int32 pageno, l_int32 endpage) |
l_int32 | convertTiffG4ToPSEmbed (const char *filein, const char *fileout) |
l_int32 | convertTiffG4ToPS (const char *filein, const char *fileout, const char *operation, l_int32 x, l_int32 y, l_int32 res, l_float32 scale, l_int32 pageno, l_int32 mask, l_int32 endpage) |
l_int32 | convertTiffG4ToPSString (const char *filein, char **poutstr, l_int32 *pnbytes, l_int32 x, l_int32 y, l_int32 res, l_float32 scale, l_int32 pageno, l_int32 mask, l_int32 endpage) |
l_int32 | convertTiffMultipageToPS (const char *filein, const char *fileout, const char *tempfile, l_float32 fillfract) |
l_int32 | pixWriteMemPS (l_uint8 **pdata, size_t *psize, PIX *pix, BOX *box, l_int32 res, l_float32 scale) |
l_int32 | getResLetterPage (l_int32 w, l_int32 h, l_float32 fillfract) |
l_int32 | getResA4Page (l_int32 w, l_int32 h, l_float32 fillfract) |
char * | encodeAscii85 (l_uint8 *inarray, l_int32 insize, l_int32 *poutsize) |
l_int32 | convertChunkToAscii85 (l_uint8 *inarray, l_int32 insize, l_int32 *pindex, char *outbuf, l_int32 *pnbout) |
l_uint8 * | decodeAscii85 (char *ina, l_int32 insize, l_int32 *poutsize) |
Переменные | |
static const char * | TEMP_G4TIFF_FILE = "/tmp/junk_temp_g4tiff.tif" |
static const char * | TEMP_JPEG_FILE = "/tmp/junk_temp_jpeg.jpg" |
static const l_int32 | DEFAULT_PRINTER_RES = 300 |
static const l_int32 | MIN_RES = 5 |
static const l_int32 | MAX_RES = 3000 |
static const l_int32 | MAX_85_LINE_COUNT = 64 |
static const l_int32 | LETTER_WIDTH = 612 |
static const l_int32 | LETTER_HEIGHT = 792 |
static const l_int32 | A4_WIDTH = 595 |
static const l_int32 | A4_HEIGHT = 842 |
static const l_float32 | DEFAULT_FILL_FRACTION = 0.95 |
static const l_uint32 | power85 [5] |
#define DEBUG_G4 0 |
#define DEBUG_JPEG 0 |
#define DEBUG_MIXED_PS 0 |
#define L_BUF_SIZE 512 |
#define PRINT_BOUNDING_BOX 0 |
void convertByteToHexAscii | ( | l_uint8 | byteval, | |
char * | pnib1, | |||
char * | pnib2 | |||
) |
Input: byteval (input byte) &nib1, &nib2 (<return> two hex ascii characters) Return: void
l_int32 convertChunkToAscii85 | ( | l_uint8 * | inarray, | |
l_int32 | insize, | |||
l_int32 * | pindex, | |||
char * | outbuf, | |||
l_int32 * | pnbout | |||
) |
Input: inarray (input data) insize (number of bytes in input array) &index (use and <return> -- ptr) outbuf (holds 8 ascii chars; we use no more than 7) &nbsout (<return> number of bytes written to outbuf) Return: boolean for eof (0 if more data, 1 if end of file)
Notes: (1) Attempts to read 4 bytes and write 5. (2) Writes 1 byte if the value is 0; writes 2 extra bytes if EOF.
l_int32 convertFilesFittedToPS | ( | const char * | dirin, | |
const char * | substr, | |||
l_float32 | xpts, | |||
l_float32 | ypts, | |||
const char * | fileout | |||
) |
l_int32 convertFilesToPS | ( | const char * | dirin, | |
const char * | substr, | |||
l_int32 | res, | |||
const char * | fileout | |||
) |
l_int32 convertJpegToPS | ( | const char * | filein, | |
const char * | fileout, | |||
const char * | operation, | |||
l_int32 | x, | |||
l_int32 | y, | |||
l_int32 | res, | |||
l_float32 | scale, | |||
l_int32 | pageno, | |||
l_int32 | endpage | |||
) |
Input: filein (input jpeg file) fileout (output ps file) operation ("w" for write; "a" for append) x, y (location of LL corner of image, in pixels, relative to the PostScript origin (0,0) at the LL corner of the page) res (resolution of the input image, in ppi; use 0 for default) scale (scaling by printer; use 0.0 or 1.0 for no scaling) pageno (page number; must start with 1; you can use 0 if there is only one page.) endpage (boolean: TRUE if the last image to be added to the page; FALSE otherwise) Return: 0 if OK, 1 on error
Notes: (1) This is simpler to use than pixWriteStringPS(), and it outputs in level 2 PS as compressed DCT (overlaid with ascii85 encoding). (2) An output file can contain multiple pages, each with multiple images. The arguments to convertJpegToPS() allow you to control placement of jpeg images on multiple pages within a PostScript file. (3) For the first image written to a file, use "w", which opens for write and clears the file. For all subsequent images written to that file, use "a". (4) The (x, y) parameters give the LL corner of the image relative to the LL corner of the page. They are in units of pixels if scale = 1.0. If you use (e.g.) scale = 2.0, the image is placed at (2x, 2y) on the page, and the image dimensions are also doubled. (5) Display vs printed resolution: * If your display is 75 ppi and your image was created at a resolution of 300 ppi, you can get the image to print at the same size as it appears on your display by either setting scale = 4.0 or by setting res = 75. Both tell the printer to make a 4x enlarged image. * If your image is generated at 150 ppi and you use scale = 1, it will be rendered such that 150 pixels correspond to 72 pts (1 inch on the printer). This function does the conversion from pixels (with or without scaling) to pts, which are the units that the printer uses. * The printer will choose its own resolution to use in rendering the image, which will not affect the size of the rendered image. That is because the output PostScript file describes the geometry in terms of pts, which are defined to be 1/72 inch. The printer will only see the size of the image in pts, through the scale and translate parameters and the affine transform (the ImageMatrix) of the image. (6) To render multiple images on the same page, set endpage = FALSE for each image until you get to the last, for which you set endpage = TRUE. This causes the "showpage" command to be invoked. Showpage outputs the entire page and clears the raster buffer for the next page to be added. Without a "showpage", subsequent images from the next page will overlay those previously put down. (7) For multiple pages, increment the page number, starting with page 1. This allows PostScript (and PDF) to build a page directory, which viewers use for navigation.
l_int32 convertJpegToPSEmbed | ( | const char * | filein, | |
const char * | fileout | |||
) |
Input: filein (input jpeg file) fileout (output ps file) Return: 0 if OK, 1 on error
Notes: (1) This function takes a jpeg file as input and generates a DCT compressed, ascii85 encoded PS file, with a bounding box. (2) The bounding box is required when a program such as TeX (through epsf) places and rescales the image. (3) The bounding box is sized for fitting the image to an 8.5 x 11.0 inch page.
l_int32 convertJpegToPSString | ( | const char * | filein, | |
char ** | poutstr, | |||
l_int32 * | pnbytes, | |||
l_int32 | x, | |||
l_int32 | y, | |||
l_int32 | res, | |||
l_float32 | scale, | |||
l_int32 | pageno, | |||
l_int32 | endpage | |||
) |
Generates PS string in jpeg format from jpeg file
Input: filein (input jpeg file) &poutstr (<return> PS string) &nbytes (<return> number of bytes in PS string) x, y (location of LL corner of image, in pixels, relative to the PostScript origin (0,0) at the LL corner of the page) res (resolution of the input image, in ppi; use 0 for default) scale (scaling by printer; use 0.0 or 1.0 for no scaling) pageno (page number; must start with 1; you can use 0 if there is only one page.) endpage (boolean: TRUE if the last image to be added to the page; FALSE otherwise) Return: 0 if OK, 1 on error
Notes: (1) The returned PS character array is binary string, not a null-terminated ascii C string. It has null bytes embedded in it!
Usage: See convertJpegToPS()
l_int32 convertSegmentedPagesToPS | ( | const char * | pagedir, | |
const char * | maskdir, | |||
l_float32 | textscale, | |||
l_float32 | imagescale, | |||
l_int32 | threshold, | |||
l_int32 | numpre, | |||
l_int32 | numpost, | |||
const char * | fileout | |||
) |
l_int32 convertTiffG4ToPS | ( | const char * | filein, | |
const char * | fileout, | |||
const char * | operation, | |||
l_int32 | x, | |||
l_int32 | y, | |||
l_int32 | res, | |||
l_float32 | scale, | |||
l_int32 | pageno, | |||
l_int32 | mask, | |||
l_int32 | endpage | |||
) |
Input: filein (input tiff g4 file) fileout (output ps file) operation ("w" for write; "a" for append) x, y (location of LL corner of image, in pixels, relative to the PostScript origin (0,0) at the LL corner of the page) res (resolution of the input image, in ppi; typ. values are 300 and 600; use 0 for automatic determination based on image size) scale (scaling by printer; use 0.0 or 1.0 for no scaling) pageno (page number; must start with 1; you can use 0 if there is only one page.) mask (boolean: use TRUE if just painting through fg; FALSE if painting both fg and bg. endpage (boolean: use TRUE if the last image to be added to the page; FALSE otherwise) Return: 0 if OK, 1 on error
Notes: (1) See the usage comments in convertJpegToPS(), some of which are repeated here. (2) This is a wrapper for tiff g4. The PostScript that is generated is expanded by about 5/4 (due to the ascii85 encoding. If you convert to pdf (ps2pdf), the ascii85 decoder is automatically invoked, so that the pdf wrapped g4 file is essentially the same size as the original g4 file. It's useful to have the PS file ascii85 encoded, because many printers will not print binary PS files. (3) For the first image written to a file, use "w", which opens for write and clears the file. For all subsequent images written to that file, use "a". (4) To render multiple images on the same page, set endpage = FALSE for each image until you get to the last, for which you set endpage = TRUE. This causes the "showpage" command to be invoked. Showpage outputs the entire page and clears the raster buffer for the next page to be added. Without a "showpage", subsequent images from the next page will overlay those previously put down. (5) For multiple images to the same page, where you are writing both jpeg and tiff-g4, you have two options: (a) write the g4 first, as either image (mask == false) or imagemask (mask == true), and then write the jpeg over it. (b) write the jpeg first and as the last item, write the g4 as an imagemask (mask == true), to paint through the foreground only. We have this flexibility with the tiff-g4 because it is 1 bpp. (6) For multiple pages, increment the page number, starting with page 1. This allows PostScript (and PDF) to build a page directory, which viewers use for navigation.
l_int32 convertTiffG4ToPSEmbed | ( | const char * | filein, | |
const char * | fileout | |||
) |
Input: filein (input jpeg file) fileout (output ps file) Return: 0 if OK, 1 on error
Notes: (1) This function takes a g4 compressed tif file as input and generates a g4 compressed, ascii85 encoded PS file, with a bounding box. (2) The bounding box is required when a program such as TeX (through epsf) places and rescales the image. (3) The bounding box is sized for fitting the image to an 8.5 x 11.0 inch page. (4) We paint this through a mask, over whatever is below.
l_int32 convertTiffG4ToPSString | ( | const char * | filein, | |
char ** | poutstr, | |||
l_int32 * | pnbytes, | |||
l_int32 | x, | |||
l_int32 | y, | |||
l_int32 | res, | |||
l_float32 | scale, | |||
l_int32 | pageno, | |||
l_int32 | mask, | |||
l_int32 | endpage | |||
) |
Input: filein (input tiff g4 file) &poutstr (<return> PS string) &nbytes (<return> number of bytes in PS string) x, y (location of LL corner of image, in pixels, relative to the PostScript origin (0,0) at the LL corner of the page) res (resolution of the input image, in ppi; typ. values are 300 and 600; use 0 for automatic determination based on image size) scale (scaling by printer; use 0.0 or 1.0 for no scaling) pageno (page number; must start with 1; you can use 0 if there is only one page.) mask (boolean: use TRUE if just painting through fg; FALSE if painting both fg and bg. endpage (boolean: use TRUE if the last image to be added to the page; FALSE otherwise) Return: 0 if OK, 1 on error
Notes: (1) Generates PS string in G4 compressed tiff format from G4 tiff file. (2) The returned PS character array is binary string, not a null-terminated C string. It has null bytes embedded in it! (3) For usage, see convertTiffG4ToPS().
l_int32 convertTiffMultipageToPS | ( | const char * | filein, | |
const char * | fileout, | |||
const char * | tempfile, | |||
l_float32 | fillfract | |||
) |
Input: filein (input tiff multipage file) fileout (output ps file) tempfile (<optional> for temporary g4 tiffs; use NULL for default) factor (for filling 8.5 x 11 inch page; use 0.0 for DEFAULT_FILL_FRACTION) Return: 0 if OK, 1 on error
Notes: (1) This converts a multipage tiff file of binary page images into a ccitt g4 compressed PS file. (2) If the images are generated from a standard resolution fax, the vertical resolution is doubled to give a normal-looking aspect ratio.
Input: inarray (ascii85 input data) insize (number of bytes in input array) &outsize (<return> number of bytes in output l_uint8 array) Return: outarray (binary)
Notes: (1) We assume the data is properly encoded, so we do not check for invalid characters or the final '>' character. (2) We permit whitespace to be added to the encoding in an arbitrary way.
Input: inarray (input data) insize (number of bytes in input array) &outsize (<return> number of bytes in output char array) Return: chara (with 64 characters +
in each line)
Notes: (1) Ghostscript has a stack break if the last line of data only has a '>', so we avoid the problem by always putting '~>' on the last line.
Input: w (image width, pixels) h (image height, pixels) fillfract (fraction in linear dimension of full page, not to be exceeded; use 0 for default) Return: 0 if OK, 1 on error
Input: w (image width, pixels) h (image height, pixels) fillfract (fraction in linear dimension of full page, not to be exceeded; use 0 for default) Return: 0 if OK, 1 on error
void getScaledParametersPS | ( | BOX * | box, | |
l_int32 | wpix, | |||
l_int32 | hpix, | |||
l_int32 | res, | |||
l_float32 | scale, | |||
l_float32 * | pxpt, | |||
l_float32 * | pypt, | |||
l_float32 * | pwpt, | |||
l_float32 * | phpt | |||
) |
Input: box (<optional> location of image in mils; with (x,y) being the LL corner) wpix (pix width in pixels) hpix (pix height in pixels) res (of printer; use 0 for default) scale (use 1.0 or 0.0 for no scaling) &xpt (location of llx in pts) &ypt (location of lly in pts) &wpt (image width in pts) &hpt (image height in pts) Return: void (no arg checking)
Notes: (1) The image is always scaled, depending on res and scale. (2) If no box, the image is centered on the page. (3) If there is a box, the image is placed within it.
l_int32 pixWriteMemPS | ( | l_uint8 ** | pdata, | |
size_t * | psize, | |||
PIX * | pix, | |||
BOX * | box, | |||
l_int32 | res, | |||
l_float32 | scale | |||
) |
Input: &data (<return> data of tiff compressed image) &size (<return> size of returned data) pix box (<optional>) res (can use 0 for default of 300 ppi) scale (to prevent scaling, use either 1.0 or 0.0) Return: 0 if OK, 1 on error
Notes: (1) See pixWriteStringPS() for usage. (2) This is just a wrapper for pixWriteStringPS(), which writes uncompressed image data to memory.
l_int32 pixWriteMixedToPS | ( | PIX * | pixb, | |
PIX * | pixc, | |||
l_float32 | scale, | |||
l_int32 | pageno, | |||
const char * | fileout | |||
) |
l_int32 pixWritePSEmbed | ( | const char * | filein, | |
const char * | fileout | |||
) |
Input: filein (input file) fileout (output ps file) Return: 0 if OK, 1 on error
Notes: (1) This is a simple wrapper function that generates an uncompressed PS file, with a bounding box. (2) The bounding box is required when a program such as TeX (through epsf) places and rescales the image. (3) The bounding box is sized for fitting the image to an 8.5 x 11.0 inch page.
l_int32 pixWriteSegmentedPageToPS | ( | PIX * | pixs, | |
PIX * | pixm, | |||
l_float32 | textscale, | |||
l_float32 | imagescale, | |||
l_int32 | threshold, | |||
l_int32 | pageno, | |||
const char * | fileout | |||
) |
Input: stream pix box (<optional>) res (can use 0 for default of 300 ppi) scale (to prevent scaling, use either 1.0 or 0.0) Return: 0 if OK; 1 on error
Notes: (1) This writes image in PS format, optionally scaled, adjusted for the printer resolution, and with a bounding box. (2) For details on use of parameters, see pixWriteStringPS().
Input: pix: 1, 2, 4, 8 bpp, with or without cmap; 32 bpp (RGB) box: (a) If box == null, image is placed, optionally scaled, in a standard b.b. at the center of the page. This is to be used when another program like TeX (through epsf) places the image. (b) If box != null, image is placed without a b.b. at the specified page location and with (optional) scaling. This is to be used when you want to specify exactly where (and optionally how big) you want the image to be. Note that all coordinates are in PS convention, with (0,0) at LL corner of the page: (x,y) location of LL corner of image, in mils. (w,h) scaled size, in mils. Use 0 to scale with "scale" and "res" input. res: resolution, in printer ppi. Use 0 for default (300 ppi). scale: scale factor. If no scaling is desired, use either 1.0 or 0.0. Scaling just resets the resolution parameter; the actual scaling is done in the interpreter at rendering time. This is important: it allows you to scale the image up without increasing the file size.
Return: ps string if OK, or null on error
Notes: (1) OK, this seems a bit complicated, because there are various ways to scale and not to scale. Here's a summary: (2) If you don't want any scaling at all: * if you are using a box: set w = 0, h = 0, and use scale = 1.0; it will print each pixel unscaled at printer resolution * if you are not using a box: set scale = 1.0; it will print at printer resolution (3) If you want the image to be a certain size in inches: * you must use a box and set the box (w,h) in mils (4) If you want the image to be scaled by a scale factor != 1.0: * if you are using a box: set w = 0, h = 0, and use the desired scale factor; the higher the printer resolution, the smaller the image will actually appear. * if you are not using a box: set the desired scale factor; the higher the printer resolution, the smaller the image will actually appear. (5) Another complication is the proliferation of distance units: * The interface distances are in milli-inches. * Three different units are used internally:
l_int32 sarrayConvertFilesFittedToPS | ( | SARRAY * | sa, | |
l_float32 | xpts, | |||
l_float32 | ypts, | |||
const char * | fileout | |||
) |
NUMA* sarrayFindMaskAndPagePairings | ( | SARRAY * | sapage, | |
SARRAY * | samask, | |||
l_int32 | numpre, | |||
l_int32 | numpost, | |||
l_int32 | maxnum | |||
) |
static l_int32 writeImageCompressedToPSFile | ( | const char * | filein, | |
const char * | fileout, | |||
l_int32 | format, | |||
l_int32 | res, | |||
l_int32 * | pfirstfile, | |||
l_int32 * | pindex | |||
) | [static] |
const l_float32 DEFAULT_FILL_FRACTION = 0.95 [static] |
const l_int32 DEFAULT_PRINTER_RES = 300 [static] |
const l_int32 LETTER_HEIGHT = 792 [static] |
const l_int32 LETTER_WIDTH = 612 [static] |
const l_int32 MAX_85_LINE_COUNT = 64 [static] |
const char* TEMP_G4TIFF_FILE = "/tmp/junk_temp_g4tiff.tif" [static] |
const char* TEMP_JPEG_FILE = "/tmp/junk_temp_jpeg.jpg" [static] |