xref: /aosp_15_r20/external/libcups/cups/ppd-page.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Page size functions for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2015 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2007 by Easy Software Products, all rights reserved.
6*5e7646d2SAndroid Build Coastguard Worker  *
7*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker  * information.
9*5e7646d2SAndroid Build Coastguard Worker  *
10*5e7646d2SAndroid Build Coastguard Worker  * PostScript is a trademark of Adobe Systems, Inc.
11*5e7646d2SAndroid Build Coastguard Worker  */
12*5e7646d2SAndroid Build Coastguard Worker 
13*5e7646d2SAndroid Build Coastguard Worker /*
14*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
15*5e7646d2SAndroid Build Coastguard Worker  */
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
18*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
19*5e7646d2SAndroid Build Coastguard Worker #include "ppd.h"
20*5e7646d2SAndroid Build Coastguard Worker 
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker /*
23*5e7646d2SAndroid Build Coastguard Worker  * 'ppdPageSize()' - Get the page size record for the named size.
24*5e7646d2SAndroid Build Coastguard Worker  */
25*5e7646d2SAndroid Build Coastguard Worker 
26*5e7646d2SAndroid Build Coastguard Worker ppd_size_t *				/* O - Size record for page or NULL */
ppdPageSize(ppd_file_t * ppd,const char * name)27*5e7646d2SAndroid Build Coastguard Worker ppdPageSize(ppd_file_t *ppd,		/* I - PPD file record */
28*5e7646d2SAndroid Build Coastguard Worker             const char *name)		/* I - Size name */
29*5e7646d2SAndroid Build Coastguard Worker {
30*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
31*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	*size;			/* Current page size */
32*5e7646d2SAndroid Build Coastguard Worker   double	w, l;			/* Width and length of page */
33*5e7646d2SAndroid Build Coastguard Worker   char		*nameptr;		/* Pointer into name */
34*5e7646d2SAndroid Build Coastguard Worker   struct lconv	*loc;			/* Locale data */
35*5e7646d2SAndroid Build Coastguard Worker   ppd_coption_t	*coption;		/* Custom option for page size */
36*5e7646d2SAndroid Build Coastguard Worker   ppd_cparam_t	*cparam;		/* Custom option parameter */
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker 
39*5e7646d2SAndroid Build Coastguard Worker   DEBUG_printf(("2ppdPageSize(ppd=%p, name=\"%s\")", ppd, name));
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker   if (!ppd)
42*5e7646d2SAndroid Build Coastguard Worker   {
43*5e7646d2SAndroid Build Coastguard Worker     DEBUG_puts("3ppdPageSize: Bad PPD pointer, returning NULL...");
44*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
45*5e7646d2SAndroid Build Coastguard Worker   }
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker   if (name)
48*5e7646d2SAndroid Build Coastguard Worker   {
49*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(name, "Custom.", 7) && ppd->variable_sizes)
50*5e7646d2SAndroid Build Coastguard Worker     {
51*5e7646d2SAndroid Build Coastguard Worker      /*
52*5e7646d2SAndroid Build Coastguard Worker       * Find the custom page size...
53*5e7646d2SAndroid Build Coastguard Worker       */
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker       for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
56*5e7646d2SAndroid Build Coastguard Worker 	if (!strcmp("Custom", size->name))
57*5e7646d2SAndroid Build Coastguard Worker           break;
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker       if (!i)
60*5e7646d2SAndroid Build Coastguard Worker       {
61*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_puts("3ppdPageSize: No custom sizes, returning NULL...");
62*5e7646d2SAndroid Build Coastguard Worker         return (NULL);
63*5e7646d2SAndroid Build Coastguard Worker       }
64*5e7646d2SAndroid Build Coastguard Worker 
65*5e7646d2SAndroid Build Coastguard Worker      /*
66*5e7646d2SAndroid Build Coastguard Worker       * Variable size; size name can be one of the following:
67*5e7646d2SAndroid Build Coastguard Worker       *
68*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTHin    - Size in inches
69*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTHft    - Size in feet
70*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTHcm    - Size in centimeters
71*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTHmm    - Size in millimeters
72*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTHm     - Size in meters
73*5e7646d2SAndroid Build Coastguard Worker       *    Custom.WIDTHxLENGTH[pt]  - Size in points
74*5e7646d2SAndroid Build Coastguard Worker       */
75*5e7646d2SAndroid Build Coastguard Worker 
76*5e7646d2SAndroid Build Coastguard Worker       loc = localeconv();
77*5e7646d2SAndroid Build Coastguard Worker       w   = _cupsStrScand(name + 7, &nameptr, loc);
78*5e7646d2SAndroid Build Coastguard Worker       if (!nameptr || *nameptr != 'x')
79*5e7646d2SAndroid Build Coastguard Worker         return (NULL);
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker       l = _cupsStrScand(nameptr + 1, &nameptr, loc);
82*5e7646d2SAndroid Build Coastguard Worker       if (!nameptr)
83*5e7646d2SAndroid Build Coastguard Worker         return (NULL);
84*5e7646d2SAndroid Build Coastguard Worker 
85*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(nameptr, "in"))
86*5e7646d2SAndroid Build Coastguard Worker       {
87*5e7646d2SAndroid Build Coastguard Worker         w *= 72.0;
88*5e7646d2SAndroid Build Coastguard Worker 	l *= 72.0;
89*5e7646d2SAndroid Build Coastguard Worker       }
90*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(nameptr, "ft"))
91*5e7646d2SAndroid Build Coastguard Worker       {
92*5e7646d2SAndroid Build Coastguard Worker         w *= 12.0 * 72.0;
93*5e7646d2SAndroid Build Coastguard Worker 	l *= 12.0 * 72.0;
94*5e7646d2SAndroid Build Coastguard Worker       }
95*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(nameptr, "mm"))
96*5e7646d2SAndroid Build Coastguard Worker       {
97*5e7646d2SAndroid Build Coastguard Worker         w *= 72.0 / 25.4;
98*5e7646d2SAndroid Build Coastguard Worker         l *= 72.0 / 25.4;
99*5e7646d2SAndroid Build Coastguard Worker       }
100*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(nameptr, "cm"))
101*5e7646d2SAndroid Build Coastguard Worker       {
102*5e7646d2SAndroid Build Coastguard Worker         w *= 72.0 / 2.54;
103*5e7646d2SAndroid Build Coastguard Worker         l *= 72.0 / 2.54;
104*5e7646d2SAndroid Build Coastguard Worker       }
105*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(nameptr, "m"))
106*5e7646d2SAndroid Build Coastguard Worker       {
107*5e7646d2SAndroid Build Coastguard Worker         w *= 72.0 / 0.0254;
108*5e7646d2SAndroid Build Coastguard Worker         l *= 72.0 / 0.0254;
109*5e7646d2SAndroid Build Coastguard Worker       }
110*5e7646d2SAndroid Build Coastguard Worker 
111*5e7646d2SAndroid Build Coastguard Worker       size->width  = (float)w;
112*5e7646d2SAndroid Build Coastguard Worker       size->length = (float)l;
113*5e7646d2SAndroid Build Coastguard Worker       size->left   = ppd->custom_margins[0];
114*5e7646d2SAndroid Build Coastguard Worker       size->bottom = ppd->custom_margins[1];
115*5e7646d2SAndroid Build Coastguard Worker       size->right  = (float)(w - ppd->custom_margins[2]);
116*5e7646d2SAndroid Build Coastguard Worker       size->top    = (float)(l - ppd->custom_margins[3]);
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker      /*
119*5e7646d2SAndroid Build Coastguard Worker       * Update the custom option records for the page size, too...
120*5e7646d2SAndroid Build Coastguard Worker       */
121*5e7646d2SAndroid Build Coastguard Worker 
122*5e7646d2SAndroid Build Coastguard Worker       if ((coption = ppdFindCustomOption(ppd, "PageSize")) != NULL)
123*5e7646d2SAndroid Build Coastguard Worker       {
124*5e7646d2SAndroid Build Coastguard Worker         if ((cparam = ppdFindCustomParam(coption, "Width")) != NULL)
125*5e7646d2SAndroid Build Coastguard Worker 	  cparam->current.custom_points = (float)w;
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker         if ((cparam = ppdFindCustomParam(coption, "Height")) != NULL)
128*5e7646d2SAndroid Build Coastguard Worker 	  cparam->current.custom_points = (float)l;
129*5e7646d2SAndroid Build Coastguard Worker       }
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker      /*
132*5e7646d2SAndroid Build Coastguard Worker       * Return the page size...
133*5e7646d2SAndroid Build Coastguard Worker       */
134*5e7646d2SAndroid Build Coastguard Worker 
135*5e7646d2SAndroid Build Coastguard Worker       DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size,
136*5e7646d2SAndroid Build Coastguard Worker                     size->name, size->width, size->length));
137*5e7646d2SAndroid Build Coastguard Worker 
138*5e7646d2SAndroid Build Coastguard Worker       return (size);
139*5e7646d2SAndroid Build Coastguard Worker     }
140*5e7646d2SAndroid Build Coastguard Worker     else
141*5e7646d2SAndroid Build Coastguard Worker     {
142*5e7646d2SAndroid Build Coastguard Worker      /*
143*5e7646d2SAndroid Build Coastguard Worker       * Lookup by name...
144*5e7646d2SAndroid Build Coastguard Worker       */
145*5e7646d2SAndroid Build Coastguard Worker 
146*5e7646d2SAndroid Build Coastguard Worker       for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
147*5e7646d2SAndroid Build Coastguard Worker 	if (!_cups_strcasecmp(name, size->name))
148*5e7646d2SAndroid Build Coastguard Worker 	{
149*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size,
150*5e7646d2SAndroid Build Coastguard Worker 			size->name, size->width, size->length));
151*5e7646d2SAndroid Build Coastguard Worker 
152*5e7646d2SAndroid Build Coastguard Worker           return (size);
153*5e7646d2SAndroid Build Coastguard Worker 	}
154*5e7646d2SAndroid Build Coastguard Worker     }
155*5e7646d2SAndroid Build Coastguard Worker   }
156*5e7646d2SAndroid Build Coastguard Worker   else
157*5e7646d2SAndroid Build Coastguard Worker   {
158*5e7646d2SAndroid Build Coastguard Worker    /*
159*5e7646d2SAndroid Build Coastguard Worker     * Find default...
160*5e7646d2SAndroid Build Coastguard Worker     */
161*5e7646d2SAndroid Build Coastguard Worker 
162*5e7646d2SAndroid Build Coastguard Worker     for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
163*5e7646d2SAndroid Build Coastguard Worker       if (size->marked)
164*5e7646d2SAndroid Build Coastguard Worker       {
165*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size,
166*5e7646d2SAndroid Build Coastguard Worker 		      size->name, size->width, size->length));
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker         return (size);
169*5e7646d2SAndroid Build Coastguard Worker       }
170*5e7646d2SAndroid Build Coastguard Worker   }
171*5e7646d2SAndroid Build Coastguard Worker 
172*5e7646d2SAndroid Build Coastguard Worker   DEBUG_puts("3ppdPageSize: Size not found, returning NULL");
173*5e7646d2SAndroid Build Coastguard Worker 
174*5e7646d2SAndroid Build Coastguard Worker   return (NULL);
175*5e7646d2SAndroid Build Coastguard Worker }
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker /*
179*5e7646d2SAndroid Build Coastguard Worker  * 'ppdPageSizeLimits()' - Return the custom page size limits.
180*5e7646d2SAndroid Build Coastguard Worker  *
181*5e7646d2SAndroid Build Coastguard Worker  * This function returns the minimum and maximum custom page sizes and printable
182*5e7646d2SAndroid Build Coastguard Worker  * areas based on the currently-marked (selected) options.
183*5e7646d2SAndroid Build Coastguard Worker  *
184*5e7646d2SAndroid Build Coastguard Worker  * If the specified PPD file does not support custom page sizes, both
185*5e7646d2SAndroid Build Coastguard Worker  * "minimum" and "maximum" are filled with zeroes.
186*5e7646d2SAndroid Build Coastguard Worker  *
187*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 1.4/macOS 10.6@
188*5e7646d2SAndroid Build Coastguard Worker  */
189*5e7646d2SAndroid Build Coastguard Worker 
190*5e7646d2SAndroid Build Coastguard Worker int					/* O - 1 if custom sizes are supported, 0 otherwise */
ppdPageSizeLimits(ppd_file_t * ppd,ppd_size_t * minimum,ppd_size_t * maximum)191*5e7646d2SAndroid Build Coastguard Worker ppdPageSizeLimits(ppd_file_t *ppd,	/* I - PPD file record */
192*5e7646d2SAndroid Build Coastguard Worker                   ppd_size_t *minimum,	/* O - Minimum custom size */
193*5e7646d2SAndroid Build Coastguard Worker 		  ppd_size_t *maximum)	/* O - Maximum custom size */
194*5e7646d2SAndroid Build Coastguard Worker {
195*5e7646d2SAndroid Build Coastguard Worker   ppd_choice_t	*qualifier2,		/* Second media qualifier */
196*5e7646d2SAndroid Build Coastguard Worker 		*qualifier3;		/* Third media qualifier */
197*5e7646d2SAndroid Build Coastguard Worker   ppd_attr_t	*attr;			/* Attribute */
198*5e7646d2SAndroid Build Coastguard Worker   float		width,			/* Min/max width */
199*5e7646d2SAndroid Build Coastguard Worker 		length;			/* Min/max length */
200*5e7646d2SAndroid Build Coastguard Worker   char		spec[PPD_MAX_NAME];	/* Selector for min/max */
201*5e7646d2SAndroid Build Coastguard Worker 
202*5e7646d2SAndroid Build Coastguard Worker 
203*5e7646d2SAndroid Build Coastguard Worker  /*
204*5e7646d2SAndroid Build Coastguard Worker   * Range check input...
205*5e7646d2SAndroid Build Coastguard Worker   */
206*5e7646d2SAndroid Build Coastguard Worker 
207*5e7646d2SAndroid Build Coastguard Worker   if (!ppd || !ppd->variable_sizes || !minimum || !maximum)
208*5e7646d2SAndroid Build Coastguard Worker   {
209*5e7646d2SAndroid Build Coastguard Worker     if (minimum)
210*5e7646d2SAndroid Build Coastguard Worker       memset(minimum, 0, sizeof(ppd_size_t));
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker     if (maximum)
213*5e7646d2SAndroid Build Coastguard Worker       memset(maximum, 0, sizeof(ppd_size_t));
214*5e7646d2SAndroid Build Coastguard Worker 
215*5e7646d2SAndroid Build Coastguard Worker     return (0);
216*5e7646d2SAndroid Build Coastguard Worker   }
217*5e7646d2SAndroid Build Coastguard Worker 
218*5e7646d2SAndroid Build Coastguard Worker  /*
219*5e7646d2SAndroid Build Coastguard Worker   * See if we have the cupsMediaQualifier2 and cupsMediaQualifier3 attributes...
220*5e7646d2SAndroid Build Coastguard Worker   */
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker   cupsArraySave(ppd->sorted_attrs);
223*5e7646d2SAndroid Build Coastguard Worker 
224*5e7646d2SAndroid Build Coastguard Worker   if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier2", NULL)) != NULL &&
225*5e7646d2SAndroid Build Coastguard Worker       attr->value)
226*5e7646d2SAndroid Build Coastguard Worker     qualifier2 = ppdFindMarkedChoice(ppd, attr->value);
227*5e7646d2SAndroid Build Coastguard Worker   else
228*5e7646d2SAndroid Build Coastguard Worker     qualifier2 = NULL;
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker   if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier3", NULL)) != NULL &&
231*5e7646d2SAndroid Build Coastguard Worker       attr->value)
232*5e7646d2SAndroid Build Coastguard Worker     qualifier3 = ppdFindMarkedChoice(ppd, attr->value);
233*5e7646d2SAndroid Build Coastguard Worker   else
234*5e7646d2SAndroid Build Coastguard Worker     qualifier3 = NULL;
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker  /*
237*5e7646d2SAndroid Build Coastguard Worker   * Figure out the current minimum width and length...
238*5e7646d2SAndroid Build Coastguard Worker   */
239*5e7646d2SAndroid Build Coastguard Worker 
240*5e7646d2SAndroid Build Coastguard Worker   width  = ppd->custom_min[0];
241*5e7646d2SAndroid Build Coastguard Worker   length = ppd->custom_min[1];
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker   if (qualifier2)
244*5e7646d2SAndroid Build Coastguard Worker   {
245*5e7646d2SAndroid Build Coastguard Worker    /*
246*5e7646d2SAndroid Build Coastguard Worker     * Try getting cupsMinSize...
247*5e7646d2SAndroid Build Coastguard Worker     */
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker     if (qualifier3)
250*5e7646d2SAndroid Build Coastguard Worker     {
251*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice,
252*5e7646d2SAndroid Build Coastguard Worker 	       qualifier3->choice);
253*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMinSize", spec);
254*5e7646d2SAndroid Build Coastguard Worker     }
255*5e7646d2SAndroid Build Coastguard Worker     else
256*5e7646d2SAndroid Build Coastguard Worker       attr = NULL;
257*5e7646d2SAndroid Build Coastguard Worker 
258*5e7646d2SAndroid Build Coastguard Worker     if (!attr)
259*5e7646d2SAndroid Build Coastguard Worker     {
260*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice);
261*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMinSize", spec);
262*5e7646d2SAndroid Build Coastguard Worker     }
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker     if (!attr && qualifier3)
265*5e7646d2SAndroid Build Coastguard Worker     {
266*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), "..%s", qualifier3->choice);
267*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMinSize", spec);
268*5e7646d2SAndroid Build Coastguard Worker     }
269*5e7646d2SAndroid Build Coastguard Worker 
270*5e7646d2SAndroid Build Coastguard Worker     if ((attr && attr->value &&
271*5e7646d2SAndroid Build Coastguard Worker          sscanf(attr->value, "%f%f", &width, &length) != 2) || !attr)
272*5e7646d2SAndroid Build Coastguard Worker     {
273*5e7646d2SAndroid Build Coastguard Worker       width  = ppd->custom_min[0];
274*5e7646d2SAndroid Build Coastguard Worker       length = ppd->custom_min[1];
275*5e7646d2SAndroid Build Coastguard Worker     }
276*5e7646d2SAndroid Build Coastguard Worker   }
277*5e7646d2SAndroid Build Coastguard Worker 
278*5e7646d2SAndroid Build Coastguard Worker   minimum->width  = width;
279*5e7646d2SAndroid Build Coastguard Worker   minimum->length = length;
280*5e7646d2SAndroid Build Coastguard Worker   minimum->left   = ppd->custom_margins[0];
281*5e7646d2SAndroid Build Coastguard Worker   minimum->bottom = ppd->custom_margins[1];
282*5e7646d2SAndroid Build Coastguard Worker   minimum->right  = width - ppd->custom_margins[2];
283*5e7646d2SAndroid Build Coastguard Worker   minimum->top    = length - ppd->custom_margins[3];
284*5e7646d2SAndroid Build Coastguard Worker 
285*5e7646d2SAndroid Build Coastguard Worker  /*
286*5e7646d2SAndroid Build Coastguard Worker   * Figure out the current maximum width and length...
287*5e7646d2SAndroid Build Coastguard Worker   */
288*5e7646d2SAndroid Build Coastguard Worker 
289*5e7646d2SAndroid Build Coastguard Worker   width  = ppd->custom_max[0];
290*5e7646d2SAndroid Build Coastguard Worker   length = ppd->custom_max[1];
291*5e7646d2SAndroid Build Coastguard Worker 
292*5e7646d2SAndroid Build Coastguard Worker   if (qualifier2)
293*5e7646d2SAndroid Build Coastguard Worker   {
294*5e7646d2SAndroid Build Coastguard Worker    /*
295*5e7646d2SAndroid Build Coastguard Worker     * Try getting cupsMaxSize...
296*5e7646d2SAndroid Build Coastguard Worker     */
297*5e7646d2SAndroid Build Coastguard Worker 
298*5e7646d2SAndroid Build Coastguard Worker     if (qualifier3)
299*5e7646d2SAndroid Build Coastguard Worker     {
300*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice,
301*5e7646d2SAndroid Build Coastguard Worker 	       qualifier3->choice);
302*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMaxSize", spec);
303*5e7646d2SAndroid Build Coastguard Worker     }
304*5e7646d2SAndroid Build Coastguard Worker     else
305*5e7646d2SAndroid Build Coastguard Worker       attr = NULL;
306*5e7646d2SAndroid Build Coastguard Worker 
307*5e7646d2SAndroid Build Coastguard Worker     if (!attr)
308*5e7646d2SAndroid Build Coastguard Worker     {
309*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice);
310*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMaxSize", spec);
311*5e7646d2SAndroid Build Coastguard Worker     }
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker     if (!attr && qualifier3)
314*5e7646d2SAndroid Build Coastguard Worker     {
315*5e7646d2SAndroid Build Coastguard Worker       snprintf(spec, sizeof(spec), "..%s", qualifier3->choice);
316*5e7646d2SAndroid Build Coastguard Worker       attr = ppdFindAttr(ppd, "cupsMaxSize", spec);
317*5e7646d2SAndroid Build Coastguard Worker     }
318*5e7646d2SAndroid Build Coastguard Worker 
319*5e7646d2SAndroid Build Coastguard Worker     if (!attr ||
320*5e7646d2SAndroid Build Coastguard Worker         (attr->value && sscanf(attr->value, "%f%f", &width, &length) != 2))
321*5e7646d2SAndroid Build Coastguard Worker     {
322*5e7646d2SAndroid Build Coastguard Worker       width  = ppd->custom_max[0];
323*5e7646d2SAndroid Build Coastguard Worker       length = ppd->custom_max[1];
324*5e7646d2SAndroid Build Coastguard Worker     }
325*5e7646d2SAndroid Build Coastguard Worker   }
326*5e7646d2SAndroid Build Coastguard Worker 
327*5e7646d2SAndroid Build Coastguard Worker   maximum->width  = width;
328*5e7646d2SAndroid Build Coastguard Worker   maximum->length = length;
329*5e7646d2SAndroid Build Coastguard Worker   maximum->left   = ppd->custom_margins[0];
330*5e7646d2SAndroid Build Coastguard Worker   maximum->bottom = ppd->custom_margins[1];
331*5e7646d2SAndroid Build Coastguard Worker   maximum->right  = width - ppd->custom_margins[2];
332*5e7646d2SAndroid Build Coastguard Worker   maximum->top    = length - ppd->custom_margins[3];
333*5e7646d2SAndroid Build Coastguard Worker 
334*5e7646d2SAndroid Build Coastguard Worker  /*
335*5e7646d2SAndroid Build Coastguard Worker   * Return the min and max...
336*5e7646d2SAndroid Build Coastguard Worker   */
337*5e7646d2SAndroid Build Coastguard Worker 
338*5e7646d2SAndroid Build Coastguard Worker   cupsArrayRestore(ppd->sorted_attrs);
339*5e7646d2SAndroid Build Coastguard Worker 
340*5e7646d2SAndroid Build Coastguard Worker   return (1);
341*5e7646d2SAndroid Build Coastguard Worker }
342*5e7646d2SAndroid Build Coastguard Worker 
343*5e7646d2SAndroid Build Coastguard Worker 
344*5e7646d2SAndroid Build Coastguard Worker /*
345*5e7646d2SAndroid Build Coastguard Worker  * 'ppdPageWidth()' - Get the page width for the given size.
346*5e7646d2SAndroid Build Coastguard Worker  */
347*5e7646d2SAndroid Build Coastguard Worker 
348*5e7646d2SAndroid Build Coastguard Worker float				/* O - Width of page in points or 0.0 */
ppdPageWidth(ppd_file_t * ppd,const char * name)349*5e7646d2SAndroid Build Coastguard Worker ppdPageWidth(ppd_file_t *ppd,	/* I - PPD file record */
350*5e7646d2SAndroid Build Coastguard Worker              const char *name)	/* I - Size name */
351*5e7646d2SAndroid Build Coastguard Worker {
352*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	*size;		/* Page size */
353*5e7646d2SAndroid Build Coastguard Worker 
354*5e7646d2SAndroid Build Coastguard Worker 
355*5e7646d2SAndroid Build Coastguard Worker   if ((size = ppdPageSize(ppd, name)) == NULL)
356*5e7646d2SAndroid Build Coastguard Worker     return (0.0);
357*5e7646d2SAndroid Build Coastguard Worker   else
358*5e7646d2SAndroid Build Coastguard Worker     return (size->width);
359*5e7646d2SAndroid Build Coastguard Worker }
360*5e7646d2SAndroid Build Coastguard Worker 
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker /*
363*5e7646d2SAndroid Build Coastguard Worker  * 'ppdPageLength()' - Get the page length for the given size.
364*5e7646d2SAndroid Build Coastguard Worker  */
365*5e7646d2SAndroid Build Coastguard Worker 
366*5e7646d2SAndroid Build Coastguard Worker float				/* O - Length of page in points or 0.0 */
ppdPageLength(ppd_file_t * ppd,const char * name)367*5e7646d2SAndroid Build Coastguard Worker ppdPageLength(ppd_file_t *ppd,	/* I - PPD file */
368*5e7646d2SAndroid Build Coastguard Worker               const char *name)	/* I - Size name */
369*5e7646d2SAndroid Build Coastguard Worker {
370*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	*size;		/* Page size */
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker 
373*5e7646d2SAndroid Build Coastguard Worker   if ((size = ppdPageSize(ppd, name)) == NULL)
374*5e7646d2SAndroid Build Coastguard Worker     return (0.0);
375*5e7646d2SAndroid Build Coastguard Worker   else
376*5e7646d2SAndroid Build Coastguard Worker     return (size->length);
377*5e7646d2SAndroid Build Coastguard Worker }
378