RFR: 8344119: CUPSPrinter does not respect PostScript printer definition specification in case of reading ImageableArea values from PPD files

GennadiyKrivoshein duke at openjdk.org
Thu Dec 12 13:24:37 UTC 2024


On Tue, 10 Dec 2024 10:05:18 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

>> **Description:**
>> The PR updates sun.print.CUPSPrinter's behavior in terms of reading media imageable area values according to the PostScript Printer Description File Format Specification.
>> The actual implementation reads X and Y coordinates of the upper right corner of the imageable area as width and height of the imageable area. https://bugs.openjdk.org/browse/JDK-8344119
>> 
>> **Updates:** 
>> Added subtraction of the X and Y coordinates of the lower left corner to fix the width and height values of the imageable area.
>> 
>> **Tests:**
>> Tested with `test/jdk/javax/print/DialogMargins.java` using Brother DCP-T720DW, the test draws a black line along the borders of the imageable area.
>> The test was run with the minimum possible margins.
>> _Before the fix_: the right and bottom lines are not printed (the right and bottom lines are outside the printable area).
>> _After the fix_: all lines are printed.
>
> I can see the spec https://web.mit.edu/PostScript/Adobe/Documents/5003.PPD_Spec_v4.3.pdf
> indeed say that that 
> 
>> "The bounding box value of *ImageableArea is given as four real numbers, repre-
>> senting the x and y coordinates of the lower left and upper right corners of the
>> region, respectively, in the PostScript language default user space coordinate
>> system."
>> 
> 
> but I believe it will be better if we do the correction in CUPSfuncs.c#getPageSizes() which reads the "PageSize" and store the value so that it stores the correct value in native..
> 
> Also, it will be better to add a manual test similar to what is mentioned in the description above..

@prsadhuk, thanks for your review. Let me explain my decision before I move the changes to the native code.
CUPS uses ppd_size_t structure to store a page size, and I suggested that we should return values from the native code as much closer to the CUPS's ppd_size_t structure. The structure contains 6 float values: width, length, left, bottom, right, and top; thus we should return from the native function the same 6 float values. 


typedef struct ppd_size_s		// Page Sizes @deprecated@
{
  int		marked;			// Page size selected?
  char		name[PPD_MAX_NAME];	// Media size option
  float		width;			// Width of media in points
  float		length;			// Length of media in points
  float		left;			// Left printable margin in points
  float		bottom;			// Bottom printable margin in points
  float		right;			// Right printable margin in points
  float		top;			// Top printable margin in points
} ppd_size_t;

https://github.com/OpenPrinting/cups/blob/c76b026e54a3f95d56d20c36d42c8bb4d4e23029/cups/ppd.h#L195

-------------

PR Comment: https://git.openjdk.org/jdk/pull/22110#issuecomment-2538903474


More information about the client-libs-dev mailing list