xref: /aosp_15_r20/external/libcups/cups/raster-stubs.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Imaging library stubs for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
7*5e7646d2SAndroid Build Coastguard Worker  * information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "raster-private.h"
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker  * These stubs wrap the real functions in libcups - this allows one library to
19*5e7646d2SAndroid Build Coastguard Worker  * provide all of the CUPS API functions while still supporting the old split
20*5e7646d2SAndroid Build Coastguard Worker  * library organization...
21*5e7646d2SAndroid Build Coastguard Worker  */
22*5e7646d2SAndroid Build Coastguard Worker 
23*5e7646d2SAndroid Build Coastguard Worker 
24*5e7646d2SAndroid Build Coastguard Worker /*
25*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
26*5e7646d2SAndroid Build Coastguard Worker  */
27*5e7646d2SAndroid Build Coastguard Worker 
28*5e7646d2SAndroid Build Coastguard Worker static ssize_t	cups_read_fd(void *ctx, unsigned char *buf, size_t bytes);
29*5e7646d2SAndroid Build Coastguard Worker static ssize_t	cups_write_fd(void *ctx, unsigned char *buf, size_t bytes);
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker /*
34*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterClose()' - Close a raster stream.
35*5e7646d2SAndroid Build Coastguard Worker  *
36*5e7646d2SAndroid Build Coastguard Worker  * The file descriptor associated with the raster stream must be closed
37*5e7646d2SAndroid Build Coastguard Worker  * separately as needed.
38*5e7646d2SAndroid Build Coastguard Worker  */
39*5e7646d2SAndroid Build Coastguard Worker 
40*5e7646d2SAndroid Build Coastguard Worker void
cupsRasterClose(cups_raster_t * r)41*5e7646d2SAndroid Build Coastguard Worker cupsRasterClose(cups_raster_t *r)	/* I - Stream to close */
42*5e7646d2SAndroid Build Coastguard Worker {
43*5e7646d2SAndroid Build Coastguard Worker   _cupsRasterDelete(r);
44*5e7646d2SAndroid Build Coastguard Worker }
45*5e7646d2SAndroid Build Coastguard Worker 
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker /*
48*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterErrorString()' - Return the last error from a raster function.
49*5e7646d2SAndroid Build Coastguard Worker  *
50*5e7646d2SAndroid Build Coastguard Worker  * If there are no recent errors, `NULL` is returned.
51*5e7646d2SAndroid Build Coastguard Worker  *
52*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 1.3/macOS 10.5@
53*5e7646d2SAndroid Build Coastguard Worker  */
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker const char *				/* O - Last error or `NULL` */
cupsRasterErrorString(void)56*5e7646d2SAndroid Build Coastguard Worker cupsRasterErrorString(void)
57*5e7646d2SAndroid Build Coastguard Worker {
58*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterErrorString());
59*5e7646d2SAndroid Build Coastguard Worker }
60*5e7646d2SAndroid Build Coastguard Worker 
61*5e7646d2SAndroid Build Coastguard Worker 
62*5e7646d2SAndroid Build Coastguard Worker /*
63*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output.
64*5e7646d2SAndroid Build Coastguard Worker  *
65*5e7646d2SAndroid Build Coastguard Worker  * The "media" argument specifies the media to use.
66*5e7646d2SAndroid Build Coastguard Worker  *
67*5e7646d2SAndroid Build Coastguard Worker  * The "type" argument specifies a "pwg-raster-document-type-supported" value
68*5e7646d2SAndroid Build Coastguard Worker  * that controls the color space and bit depth of the raster data.
69*5e7646d2SAndroid Build Coastguard Worker  *
70*5e7646d2SAndroid Build Coastguard Worker  * The "xres" and "yres" arguments specify the raster resolution in dots per
71*5e7646d2SAndroid Build Coastguard Worker  * inch.
72*5e7646d2SAndroid Build Coastguard Worker  *
73*5e7646d2SAndroid Build Coastguard Worker  * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value
74*5e7646d2SAndroid Build Coastguard Worker  * to apply for the back side of a page.  Pass @code NULL@ for the front side.
75*5e7646d2SAndroid Build Coastguard Worker  *
76*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 2.2/macOS 10.12@
77*5e7646d2SAndroid Build Coastguard Worker  */
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker int					/* O - 1 on success, 0 on failure */
cupsRasterInitPWGHeader(cups_page_header2_t * h,pwg_media_t * media,const char * type,int xdpi,int ydpi,const char * sides,const char * sheet_back)80*5e7646d2SAndroid Build Coastguard Worker cupsRasterInitPWGHeader(
81*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h,		/* I - Page header */
82*5e7646d2SAndroid Build Coastguard Worker     pwg_media_t         *media,		/* I - PWG media information */
83*5e7646d2SAndroid Build Coastguard Worker     const char          *type,		/* I - PWG raster type string */
84*5e7646d2SAndroid Build Coastguard Worker     int                 xdpi,		/* I - Cross-feed direction (horizontal) resolution */
85*5e7646d2SAndroid Build Coastguard Worker     int                 ydpi,		/* I - Feed direction (vertical) resolution */
86*5e7646d2SAndroid Build Coastguard Worker     const char          *sides,		/* I - IPP "sides" option value */
87*5e7646d2SAndroid Build Coastguard Worker     const char          *sheet_back)	/* I - Transform for back side or @code NULL@ for none */
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterInitPWGHeader(h, media, type, xdpi, ydpi, sides, sheet_back));
90*5e7646d2SAndroid Build Coastguard Worker }
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker 
93*5e7646d2SAndroid Build Coastguard Worker /*
94*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterOpen()' - Open a raster stream using a file descriptor.
95*5e7646d2SAndroid Build Coastguard Worker  *
96*5e7646d2SAndroid Build Coastguard Worker  * This function associates a raster stream with the given file descriptor.
97*5e7646d2SAndroid Build Coastguard Worker  * For most printer driver filters, "fd" will be 0 (stdin).  For most raster
98*5e7646d2SAndroid Build Coastguard Worker  * image processor (RIP) filters that generate raster data, "fd" will be 1
99*5e7646d2SAndroid Build Coastguard Worker  * (stdout).
100*5e7646d2SAndroid Build Coastguard Worker  *
101*5e7646d2SAndroid Build Coastguard Worker  * When writing raster data, the @code CUPS_RASTER_WRITE@,
102*5e7646d2SAndroid Build Coastguard Worker  * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can
103*5e7646d2SAndroid Build Coastguard Worker  * be used - compressed and PWG output is generally 25-50% smaller but adds a
104*5e7646d2SAndroid Build Coastguard Worker  * 100-300% execution time overhead.
105*5e7646d2SAndroid Build Coastguard Worker  */
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker cups_raster_t *				/* O - New stream */
cupsRasterOpen(int fd,cups_mode_t mode)108*5e7646d2SAndroid Build Coastguard Worker cupsRasterOpen(int         fd,		/* I - File descriptor */
109*5e7646d2SAndroid Build Coastguard Worker                cups_mode_t mode)	/* I - Mode - @code CUPS_RASTER_READ@,
110*5e7646d2SAndroid Build Coastguard Worker 	                                       @code CUPS_RASTER_WRITE@,
111*5e7646d2SAndroid Build Coastguard Worker 					       @code CUPS_RASTER_WRITE_COMPRESSED@,
112*5e7646d2SAndroid Build Coastguard Worker 					       or @code CUPS_RASTER_WRITE_PWG@ */
113*5e7646d2SAndroid Build Coastguard Worker {
114*5e7646d2SAndroid Build Coastguard Worker   if (mode == CUPS_RASTER_READ)
115*5e7646d2SAndroid Build Coastguard Worker     return (_cupsRasterNew(cups_read_fd, (void *)((intptr_t)fd), mode));
116*5e7646d2SAndroid Build Coastguard Worker   else
117*5e7646d2SAndroid Build Coastguard Worker     return (_cupsRasterNew(cups_write_fd, (void *)((intptr_t)fd), mode));
118*5e7646d2SAndroid Build Coastguard Worker }
119*5e7646d2SAndroid Build Coastguard Worker 
120*5e7646d2SAndroid Build Coastguard Worker 
121*5e7646d2SAndroid Build Coastguard Worker /*
122*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterOpenIO()' - Open a raster stream using a callback function.
123*5e7646d2SAndroid Build Coastguard Worker  *
124*5e7646d2SAndroid Build Coastguard Worker  * This function associates a raster stream with the given callback function and
125*5e7646d2SAndroid Build Coastguard Worker  * context pointer.
126*5e7646d2SAndroid Build Coastguard Worker  *
127*5e7646d2SAndroid Build Coastguard Worker  * When writing raster data, the @code CUPS_RASTER_WRITE@,
128*5e7646d2SAndroid Build Coastguard Worker  * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can
129*5e7646d2SAndroid Build Coastguard Worker  * be used - compressed and PWG output is generally 25-50% smaller but adds a
130*5e7646d2SAndroid Build Coastguard Worker  * 100-300% execution time overhead.
131*5e7646d2SAndroid Build Coastguard Worker  */
132*5e7646d2SAndroid Build Coastguard Worker 
133*5e7646d2SAndroid Build Coastguard Worker cups_raster_t *				/* O - New stream */
cupsRasterOpenIO(cups_raster_iocb_t iocb,void * ctx,cups_mode_t mode)134*5e7646d2SAndroid Build Coastguard Worker cupsRasterOpenIO(
135*5e7646d2SAndroid Build Coastguard Worker     cups_raster_iocb_t iocb,		/* I - Read/write callback */
136*5e7646d2SAndroid Build Coastguard Worker     void               *ctx,		/* I - Context pointer for callback */
137*5e7646d2SAndroid Build Coastguard Worker     cups_mode_t        mode)		/* I - Mode - @code CUPS_RASTER_READ@,
138*5e7646d2SAndroid Build Coastguard Worker 	                                       @code CUPS_RASTER_WRITE@,
139*5e7646d2SAndroid Build Coastguard Worker 					       @code CUPS_RASTER_WRITE_COMPRESSED@,
140*5e7646d2SAndroid Build Coastguard Worker 					       or @code CUPS_RASTER_WRITE_PWG@ */
141*5e7646d2SAndroid Build Coastguard Worker {
142*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterNew(iocb, ctx, mode));
143*5e7646d2SAndroid Build Coastguard Worker }
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker 
146*5e7646d2SAndroid Build Coastguard Worker /*
147*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterReadHeader()' - Read a raster page header and store it in a
148*5e7646d2SAndroid Build Coastguard Worker  *                            version 1 page header structure.
149*5e7646d2SAndroid Build Coastguard Worker  *
150*5e7646d2SAndroid Build Coastguard Worker  * This function is deprecated. Use @link cupsRasterReadHeader2@ instead.
151*5e7646d2SAndroid Build Coastguard Worker  *
152*5e7646d2SAndroid Build Coastguard Worker  * Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset
153*5e7646d2SAndroid Build Coastguard Worker  * of the version 2 page header data. This function handles reading version 2
154*5e7646d2SAndroid Build Coastguard Worker  * page headers and copying only the version 1 data into the provided buffer.
155*5e7646d2SAndroid Build Coastguard Worker  *
156*5e7646d2SAndroid Build Coastguard Worker  * @deprecated@
157*5e7646d2SAndroid Build Coastguard Worker  */
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - 1 on success, 0 on failure/end-of-file */
cupsRasterReadHeader(cups_raster_t * r,cups_page_header_t * h)160*5e7646d2SAndroid Build Coastguard Worker cupsRasterReadHeader(
161*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t      *r,		/* I - Raster stream */
162*5e7646d2SAndroid Build Coastguard Worker     cups_page_header_t *h)		/* I - Pointer to header data */
163*5e7646d2SAndroid Build Coastguard Worker {
164*5e7646d2SAndroid Build Coastguard Worker  /*
165*5e7646d2SAndroid Build Coastguard Worker   * Get the raster header...
166*5e7646d2SAndroid Build Coastguard Worker   */
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker   if (!_cupsRasterReadHeader(r))
169*5e7646d2SAndroid Build Coastguard Worker   {
170*5e7646d2SAndroid Build Coastguard Worker     memset(h, 0, sizeof(cups_page_header_t));
171*5e7646d2SAndroid Build Coastguard Worker     return (0);
172*5e7646d2SAndroid Build Coastguard Worker   }
173*5e7646d2SAndroid Build Coastguard Worker 
174*5e7646d2SAndroid Build Coastguard Worker  /*
175*5e7646d2SAndroid Build Coastguard Worker   * Copy the header to the user-supplied buffer...
176*5e7646d2SAndroid Build Coastguard Worker   */
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker   memcpy(h, &(r->header), sizeof(cups_page_header_t));
179*5e7646d2SAndroid Build Coastguard Worker   return (1);
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker 
183*5e7646d2SAndroid Build Coastguard Worker /*
184*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterReadHeader2()' - Read a raster page header and store it in a
185*5e7646d2SAndroid Build Coastguard Worker  *                             version 2 page header structure.
186*5e7646d2SAndroid Build Coastguard Worker  *
187*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 1.2/macOS 10.5@
188*5e7646d2SAndroid Build Coastguard Worker  */
189*5e7646d2SAndroid Build Coastguard Worker 
190*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - 1 on success, 0 on failure/end-of-file */
cupsRasterReadHeader2(cups_raster_t * r,cups_page_header2_t * h)191*5e7646d2SAndroid Build Coastguard Worker cupsRasterReadHeader2(
192*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t       *r,		/* I - Raster stream */
193*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h)		/* I - Pointer to header data */
194*5e7646d2SAndroid Build Coastguard Worker {
195*5e7646d2SAndroid Build Coastguard Worker  /*
196*5e7646d2SAndroid Build Coastguard Worker   * Get the raster header...
197*5e7646d2SAndroid Build Coastguard Worker   */
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker   if (!_cupsRasterReadHeader(r))
200*5e7646d2SAndroid Build Coastguard Worker   {
201*5e7646d2SAndroid Build Coastguard Worker     memset(h, 0, sizeof(cups_page_header2_t));
202*5e7646d2SAndroid Build Coastguard Worker     return (0);
203*5e7646d2SAndroid Build Coastguard Worker   }
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker  /*
206*5e7646d2SAndroid Build Coastguard Worker   * Copy the header to the user-supplied buffer...
207*5e7646d2SAndroid Build Coastguard Worker   */
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker   memcpy(h, &(r->header), sizeof(cups_page_header2_t));
210*5e7646d2SAndroid Build Coastguard Worker   return (1);
211*5e7646d2SAndroid Build Coastguard Worker }
212*5e7646d2SAndroid Build Coastguard Worker 
213*5e7646d2SAndroid Build Coastguard Worker 
214*5e7646d2SAndroid Build Coastguard Worker /*
215*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterReadPixels()' - Read raster pixels.
216*5e7646d2SAndroid Build Coastguard Worker  *
217*5e7646d2SAndroid Build Coastguard Worker  * For best performance, filters should read one or more whole lines.
218*5e7646d2SAndroid Build Coastguard Worker  * The "cupsBytesPerLine" value from the page header can be used to allocate
219*5e7646d2SAndroid Build Coastguard Worker  * the line buffer and as the number of bytes to read.
220*5e7646d2SAndroid Build Coastguard Worker  */
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - Number of bytes read */
cupsRasterReadPixels(cups_raster_t * r,unsigned char * p,unsigned len)223*5e7646d2SAndroid Build Coastguard Worker cupsRasterReadPixels(
224*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t *r,			/* I - Raster stream */
225*5e7646d2SAndroid Build Coastguard Worker     unsigned char *p,			/* I - Pointer to pixel buffer */
226*5e7646d2SAndroid Build Coastguard Worker     unsigned      len)			/* I - Number of bytes to read */
227*5e7646d2SAndroid Build Coastguard Worker {
228*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterReadPixels(r, p, len));
229*5e7646d2SAndroid Build Coastguard Worker }
230*5e7646d2SAndroid Build Coastguard Worker 
231*5e7646d2SAndroid Build Coastguard Worker 
232*5e7646d2SAndroid Build Coastguard Worker /*
233*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterWriteHeader()' - Write a raster page header from a version 1 page
234*5e7646d2SAndroid Build Coastguard Worker  *                             header structure.
235*5e7646d2SAndroid Build Coastguard Worker  *
236*5e7646d2SAndroid Build Coastguard Worker  * This function is deprecated. Use @link cupsRasterWriteHeader2@ instead.
237*5e7646d2SAndroid Build Coastguard Worker  *
238*5e7646d2SAndroid Build Coastguard Worker  * @deprecated@
239*5e7646d2SAndroid Build Coastguard Worker  */
240*5e7646d2SAndroid Build Coastguard Worker 
241*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - 1 on success, 0 on failure */
cupsRasterWriteHeader(cups_raster_t * r,cups_page_header_t * h)242*5e7646d2SAndroid Build Coastguard Worker cupsRasterWriteHeader(
243*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t      *r,		/* I - Raster stream */
244*5e7646d2SAndroid Build Coastguard Worker     cups_page_header_t *h)		/* I - Raster page header */
245*5e7646d2SAndroid Build Coastguard Worker {
246*5e7646d2SAndroid Build Coastguard Worker   if (r == NULL || r->mode == CUPS_RASTER_READ)
247*5e7646d2SAndroid Build Coastguard Worker     return (0);
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker  /*
250*5e7646d2SAndroid Build Coastguard Worker   * Make a copy of the header and write using the private function...
251*5e7646d2SAndroid Build Coastguard Worker   */
252*5e7646d2SAndroid Build Coastguard Worker 
253*5e7646d2SAndroid Build Coastguard Worker   memset(&(r->header), 0, sizeof(r->header));
254*5e7646d2SAndroid Build Coastguard Worker   memcpy(&(r->header), h, sizeof(cups_page_header_t));
255*5e7646d2SAndroid Build Coastguard Worker 
256*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterWriteHeader(r));
257*5e7646d2SAndroid Build Coastguard Worker }
258*5e7646d2SAndroid Build Coastguard Worker 
259*5e7646d2SAndroid Build Coastguard Worker 
260*5e7646d2SAndroid Build Coastguard Worker /*
261*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterWriteHeader2()' - Write a raster page header from a version 2
262*5e7646d2SAndroid Build Coastguard Worker  *                              page header structure.
263*5e7646d2SAndroid Build Coastguard Worker  *
264*5e7646d2SAndroid Build Coastguard Worker  * The page header can be initialized using @link cupsRasterInitPWGHeader@.
265*5e7646d2SAndroid Build Coastguard Worker  *
266*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 1.2/macOS 10.5@
267*5e7646d2SAndroid Build Coastguard Worker  */
268*5e7646d2SAndroid Build Coastguard Worker 
269*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - 1 on success, 0 on failure */
cupsRasterWriteHeader2(cups_raster_t * r,cups_page_header2_t * h)270*5e7646d2SAndroid Build Coastguard Worker cupsRasterWriteHeader2(
271*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t       *r,		/* I - Raster stream */
272*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h)		/* I - Raster page header */
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker   if (r == NULL || r->mode == CUPS_RASTER_READ)
275*5e7646d2SAndroid Build Coastguard Worker     return (0);
276*5e7646d2SAndroid Build Coastguard Worker 
277*5e7646d2SAndroid Build Coastguard Worker  /*
278*5e7646d2SAndroid Build Coastguard Worker   * Make a copy of the header, and compute the number of raster
279*5e7646d2SAndroid Build Coastguard Worker   * lines in the page image...
280*5e7646d2SAndroid Build Coastguard Worker   */
281*5e7646d2SAndroid Build Coastguard Worker 
282*5e7646d2SAndroid Build Coastguard Worker   memcpy(&(r->header), h, sizeof(cups_page_header2_t));
283*5e7646d2SAndroid Build Coastguard Worker 
284*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterWriteHeader(r));
285*5e7646d2SAndroid Build Coastguard Worker }
286*5e7646d2SAndroid Build Coastguard Worker 
287*5e7646d2SAndroid Build Coastguard Worker 
288*5e7646d2SAndroid Build Coastguard Worker /*
289*5e7646d2SAndroid Build Coastguard Worker  * 'cupsRasterWritePixels()' - Write raster pixels.
290*5e7646d2SAndroid Build Coastguard Worker  *
291*5e7646d2SAndroid Build Coastguard Worker  * For best performance, filters should write one or more whole lines.
292*5e7646d2SAndroid Build Coastguard Worker  * The "cupsBytesPerLine" value from the page header can be used to allocate
293*5e7646d2SAndroid Build Coastguard Worker  * the line buffer and as the number of bytes to write.
294*5e7646d2SAndroid Build Coastguard Worker  */
295*5e7646d2SAndroid Build Coastguard Worker 
296*5e7646d2SAndroid Build Coastguard Worker unsigned				/* O - Number of bytes written */
cupsRasterWritePixels(cups_raster_t * r,unsigned char * p,unsigned len)297*5e7646d2SAndroid Build Coastguard Worker cupsRasterWritePixels(
298*5e7646d2SAndroid Build Coastguard Worker     cups_raster_t *r,			/* I - Raster stream */
299*5e7646d2SAndroid Build Coastguard Worker     unsigned char *p,			/* I - Bytes to write */
300*5e7646d2SAndroid Build Coastguard Worker     unsigned      len)			/* I - Number of bytes to write */
301*5e7646d2SAndroid Build Coastguard Worker {
302*5e7646d2SAndroid Build Coastguard Worker   return (_cupsRasterWritePixels(r, p, len));
303*5e7646d2SAndroid Build Coastguard Worker }
304*5e7646d2SAndroid Build Coastguard Worker 
305*5e7646d2SAndroid Build Coastguard Worker 
306*5e7646d2SAndroid Build Coastguard Worker /*
307*5e7646d2SAndroid Build Coastguard Worker  * 'cups_read_fd()' - Read bytes from a file.
308*5e7646d2SAndroid Build Coastguard Worker  */
309*5e7646d2SAndroid Build Coastguard Worker 
310*5e7646d2SAndroid Build Coastguard Worker static ssize_t				/* O - Bytes read or -1 */
cups_read_fd(void * ctx,unsigned char * buf,size_t bytes)311*5e7646d2SAndroid Build Coastguard Worker cups_read_fd(void          *ctx,	/* I - File descriptor as pointer */
312*5e7646d2SAndroid Build Coastguard Worker              unsigned char *buf,	/* I - Buffer for read */
313*5e7646d2SAndroid Build Coastguard Worker 	     size_t        bytes)	/* I - Maximum number of bytes to read */
314*5e7646d2SAndroid Build Coastguard Worker {
315*5e7646d2SAndroid Build Coastguard Worker   int		fd = (int)((intptr_t)ctx);
316*5e7646d2SAndroid Build Coastguard Worker 					/* File descriptor */
317*5e7646d2SAndroid Build Coastguard Worker   ssize_t	count;			/* Number of bytes read */
318*5e7646d2SAndroid Build Coastguard Worker 
319*5e7646d2SAndroid Build Coastguard Worker 
320*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32 /* Sigh */
321*5e7646d2SAndroid Build Coastguard Worker   while ((count = read(fd, buf, (unsigned)bytes)) < 0)
322*5e7646d2SAndroid Build Coastguard Worker #else
323*5e7646d2SAndroid Build Coastguard Worker   while ((count = read(fd, buf, bytes)) < 0)
324*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
325*5e7646d2SAndroid Build Coastguard Worker     if (errno != EINTR && errno != EAGAIN)
326*5e7646d2SAndroid Build Coastguard Worker       return (-1);
327*5e7646d2SAndroid Build Coastguard Worker 
328*5e7646d2SAndroid Build Coastguard Worker   return (count);
329*5e7646d2SAndroid Build Coastguard Worker }
330*5e7646d2SAndroid Build Coastguard Worker 
331*5e7646d2SAndroid Build Coastguard Worker 
332*5e7646d2SAndroid Build Coastguard Worker /*
333*5e7646d2SAndroid Build Coastguard Worker  * 'cups_write_fd()' - Write bytes to a file.
334*5e7646d2SAndroid Build Coastguard Worker  */
335*5e7646d2SAndroid Build Coastguard Worker 
336*5e7646d2SAndroid Build Coastguard Worker static ssize_t				/* O - Bytes written or -1 */
cups_write_fd(void * ctx,unsigned char * buf,size_t bytes)337*5e7646d2SAndroid Build Coastguard Worker cups_write_fd(void          *ctx,	/* I - File descriptor pointer */
338*5e7646d2SAndroid Build Coastguard Worker               unsigned char *buf,	/* I - Bytes to write */
339*5e7646d2SAndroid Build Coastguard Worker 	      size_t        bytes)	/* I - Number of bytes to write */
340*5e7646d2SAndroid Build Coastguard Worker {
341*5e7646d2SAndroid Build Coastguard Worker   int		fd = (int)((intptr_t)ctx);
342*5e7646d2SAndroid Build Coastguard Worker 					/* File descriptor */
343*5e7646d2SAndroid Build Coastguard Worker   ssize_t	count;			/* Number of bytes written */
344*5e7646d2SAndroid Build Coastguard Worker 
345*5e7646d2SAndroid Build Coastguard Worker 
346*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32 /* Sigh */
347*5e7646d2SAndroid Build Coastguard Worker   while ((count = write(fd, buf, (unsigned)bytes)) < 0)
348*5e7646d2SAndroid Build Coastguard Worker #else
349*5e7646d2SAndroid Build Coastguard Worker   while ((count = write(fd, buf, bytes)) < 0)
350*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
351*5e7646d2SAndroid Build Coastguard Worker     if (errno != EINTR && errno != EAGAIN)
352*5e7646d2SAndroid Build Coastguard Worker       return (-1);
353*5e7646d2SAndroid Build Coastguard Worker 
354*5e7646d2SAndroid Build Coastguard Worker   return (count);
355*5e7646d2SAndroid Build Coastguard Worker }
356