--- old/src/solaris/classes/sun/print/CUPSPrinter.java 2014-07-10 14:45:22.724232210 -0700 +++ new/src/solaris/classes/sun/print/CUPSPrinter.java 2014-07-10 14:45:22.620232214 -0700 @@ -140,6 +140,9 @@ return cupsCustomMediaSNames; } + public int getDefaultMediaIndex() { + return ((pageSizes.length >1) ? (int)(pageSizes[pageSizes.length -1]) : 0); + } /** * Returns array of MediaPrintableArea derived from PPD. @@ -201,8 +204,15 @@ // add this new custom msn to MediaSize array if ((width > 0.0) && (length > 0.0)) { + try { new MediaSize(width, length, Size2DSyntax.INCH, msn); + } catch (IllegalArgumentException e) { + /* PDF printer in Linux for Ledger paper causes + "IllegalArgumentException: X dimension > Y dimension". + We rotate based on IPP spec. */ + new MediaSize(length, width, Size2DSyntax.INCH, msn); + } } } --- old/src/solaris/classes/sun/print/IPPPrintService.java 2014-07-10 14:45:23.032232198 -0700 +++ new/src/solaris/classes/sun/print/IPPPrintService.java 2014-07-10 14:45:22.928232202 -0700 @@ -414,6 +414,7 @@ mediaSizeNames = cps.getMediaSizeNames(); mediaTrays = cps.getMediaTrays(); customMediaSizeNames = cps.getCustomMediaSizeNames(); + defaultMediaIndex = cps.getDefaultMediaIndex(); urlConnection.disconnect(); init = true; return; @@ -1432,7 +1433,9 @@ return JobSheets.STANDARD; } } else if (category == Media.class) { - defaultMediaIndex = 0; + if (defaultMediaIndex == -1) { + defaultMediaIndex = 0; + } if (mediaSizeNames.length == 0) { String defaultCountry = Locale.getDefault().getCountry(); if (defaultCountry != null && @@ -1448,17 +1451,7 @@ if (attribClass != null) { String name = attribClass.getStringValue(); if (isCupsPrinter) { - for (int i=0; i< customMediaSizeNames.length; i++) { - //REMIND: get default from PPD. In native _getMedia, - // move default (ppd_option_t->defchoice) to index 0. - // In the meantime, use indexOf because PPD name - // may be different from the IPP attribute name. - if (customMediaSizeNames[i].toString().indexOf(name) - != -1) { - defaultMediaIndex = i; - return mediaSizeNames[defaultMediaIndex]; - } - } + return mediaSizeNames[defaultMediaIndex]; } else { for (int i=0; i< mediaSizeNames.length; i++) { if (mediaSizeNames[i].toString().indexOf(name) != -1) { --- old/src/solaris/native/sun/awt/CUPSfuncs.c 2014-07-10 14:45:23.380232185 -0700 +++ new/src/solaris/native/sun/awt/CUPSfuncs.c 2014-07-10 14:45:23.272232189 -0700 @@ -349,7 +349,8 @@ // create array of dimensions - (num_choices * 6) //to cover length & height DPRINTF( "CUPSfuncs::option->num_choices %d\n", option->num_choices) - sizeArray = (*env)->NewFloatArray(env, option->num_choices*6); + // +1 is for storing the default media index + sizeArray = (*env)->NewFloatArray(env, option->num_choices*6+1); if (sizeArray == NULL) { unlink(filename); j2d_ppdClose(ppd); @@ -369,6 +370,10 @@ } for (i = 0; inum_choices; i++) { choice = (option->choices)+i; + // get the index of the default page + if (!strcmp(choice->choice, option->defchoice)) { + dims[option->num_choices*6] = (float)i; + } size = j2d_ppdPageSize(ppd, choice->choice); if (size != NULL) { // paper width and height