@@ -209,7 +209,7 @@ _cupsConvertOptions(
209209
210210 media_source = _ppdCacheGetSource (pc , cupsGetOption ("InputSlot" , num_options , options ));
211211 media_type = _ppdCacheGetType (pc , cupsGetOption ("MediaType" , num_options , options ));
212- size = _ppdCacheGetSize (pc , keyword );
212+ size = _ppdCacheGetSize (pc , keyword , /*ppd_size*/ NULL );
213213
214214 if (media_col_sup && (size || media_source || media_type ))
215215 {
@@ -2760,7 +2760,8 @@ _ppdCacheGetPageSize(
27602760pwg_size_t * /* O - PWG size or NULL */
27612761_ppdCacheGetSize (
27622762 _ppd_cache_t * pc , /* I - PPD cache and mapping data */
2763- const char * page_size ) /* I - PPD PageSize */
2763+ const char * page_size , /* I - PPD PageSize */
2764+ ppd_size_t * ppd_size ) /* I - PPD page size information */
27642765{
27652766 int i ; /* Looping var */
27662767 pwg_media_t * media ; /* Media */
@@ -2774,7 +2775,7 @@ _ppdCacheGetSize(
27742775 if (!pc || !page_size )
27752776 return (NULL );
27762777
2777- if (!_cups_strncasecmp (page_size , "Custom." , 7 ))
2778+ if (!_cups_strcasecmp ( page_size , "Custom" ) || ! _cups_strncasecmp (page_size , "Custom." , 7 ))
27782779 {
27792780 /*
27802781 * Custom size; size name can be one of the following:
@@ -2791,48 +2792,65 @@ _ppdCacheGetSize(
27912792 char * ptr ; /* Pointer into PageSize */
27922793 struct lconv * loc ; /* Locale data */
27932794
2794- loc = localeconv ();
2795- w = (float )_cupsStrScand (page_size + 7 , & ptr , loc );
2796- if (!ptr || * ptr != 'x' )
2797- return (NULL );
2795+ if (page_size [6 ])
2796+ {
2797+ loc = localeconv ();
2798+ w = (float )_cupsStrScand (page_size + 7 , & ptr , loc );
2799+ if (!ptr || * ptr != 'x' )
2800+ return (NULL );
27982801
2799- l = (float )_cupsStrScand (ptr + 1 , & ptr , loc );
2800- if (!ptr )
2801- return (NULL );
2802+ l = (float )_cupsStrScand (ptr + 1 , & ptr , loc );
2803+ if (!ptr )
2804+ return (NULL );
28022805
2803- if (!_cups_strcasecmp (ptr , "in" ))
2804- {
2805- w *= 2540.0 ;
2806- l *= 2540.0 ;
2807- }
2808- else if (!_cups_strcasecmp (ptr , "ft" ))
2809- {
2810- w *= 12.0 * 2540.0 ;
2811- l *= 12.0 * 2540.0 ;
2812- }
2813- else if (!_cups_strcasecmp (ptr , "mm" ))
2814- {
2815- w *= 100.0 ;
2816- l *= 100.0 ;
2817- }
2818- else if (!_cups_strcasecmp (ptr , "cm" ))
2819- {
2820- w *= 1000.0 ;
2821- l *= 1000.0 ;
2806+ if (!_cups_strcasecmp (ptr , "in" ))
2807+ {
2808+ w *= 2540.0 ;
2809+ l *= 2540.0 ;
2810+ }
2811+ else if (!_cups_strcasecmp (ptr , "ft" ))
2812+ {
2813+ w *= 12.0 * 2540.0 ;
2814+ l *= 12.0 * 2540.0 ;
2815+ }
2816+ else if (!_cups_strcasecmp (ptr , "mm" ))
2817+ {
2818+ w *= 100.0 ;
2819+ l *= 100.0 ;
2820+ }
2821+ else if (!_cups_strcasecmp (ptr , "cm" ))
2822+ {
2823+ w *= 1000.0 ;
2824+ l *= 1000.0 ;
2825+ }
2826+ else if (!_cups_strcasecmp (ptr , "m" ))
2827+ {
2828+ w *= 100000.0 ;
2829+ l *= 100000.0 ;
2830+ }
2831+ else
2832+ {
2833+ w *= 2540.0 / 72.0 ;
2834+ l *= 2540.0 / 72.0 ;
2835+ }
28222836 }
2823- else if (! _cups_strcasecmp ( ptr , "m" ) )
2837+ else if (ppd_size )
28242838 {
2825- w *= 100000 .0 ;
2826- l *= 100000 .0 ;
2839+ w = ppd_size -> width * 2540.0 / 72 .0 ;
2840+ l = ppd_size -> length * 2540.0 / 72 .0 ;
28272841 }
28282842 else
28292843 {
2830- w *= 2540.0 / 72.0 ;
2831- l *= 2540.0 / 72.0 ;
2844+ // No custom size information...
2845+ return ( NULL ) ;
28322846 }
28332847
2834- pc -> custom_size .width = (int )w ;
2835- pc -> custom_size .length = (int )l ;
2848+ pc -> custom_size .map .ppd = (char * )page_size ;
2849+ pc -> custom_size .width = (int )w ;
2850+ pc -> custom_size .length = (int )l ;
2851+
2852+ if ((media = pwgMediaForSize ((int )w , (int )l )) != NULL )
2853+ pc -> custom_size .map .pwg = (char * )media -> pwg ;
28362854
28372855 return (& (pc -> custom_size ));
28382856 }
@@ -2842,22 +2860,28 @@ _ppdCacheGetSize(
28422860 */
28432861
28442862 for (i = pc -> num_sizes , size = pc -> sizes ; i > 0 ; i -- , size ++ )
2863+ {
28452864 if (!_cups_strcasecmp (page_size , size -> map .ppd ) ||
28462865 !_cups_strcasecmp (page_size , size -> map .pwg ))
28472866 return (size );
2867+ }
28482868
28492869 /*
28502870 * Look up standard sizes...
28512871 */
28522872
28532873 if ((media = pwgMediaForPPD (page_size )) == NULL )
2874+ {
28542875 if ((media = pwgMediaForLegacy (page_size )) == NULL )
28552876 media = pwgMediaForPWG (page_size );
2877+ }
28562878
28572879 if (media )
28582880 {
2859- pc -> custom_size .width = media -> width ;
2860- pc -> custom_size .length = media -> length ;
2881+ pc -> custom_size .map .ppd = (char * )page_size ;
2882+ pc -> custom_size .map .pwg = (char * )media -> pwg ;
2883+ pc -> custom_size .width = media -> width ;
2884+ pc -> custom_size .length = media -> length ;
28612885
28622886 return (& (pc -> custom_size ));
28632887 }
0 commit comments