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