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