RFR: 8297191 : [macos] printing page range "page 2 to 2" or "page 2 to 4" on macOS leads to not print
Renjith Kannath Pariyangad
rkannathpari at openjdk.org
Fri Jun 21 14:49:11 UTC 2024
On Mon, 17 Jun 2024 05:54:37 GMT, Renjith Kannath Pariyangad <rkannathpari at openjdk.org> wrote:
> Hi Reviewers,
>
> This fix will resolve page range not printing proper pages if the rage begin from 2 or above on Mac machines.
> I have verified the manual range related tests like PageRanges.java, ClippedImages.java and test.java and confirmed its fixing the issue.
>
> Please review and let me know your suggestions if any.
> I added some traces and ran the test `PageRanges.java` with and without your proposed changes.
>
> The diff:
>
> ```diff
> diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java
> index 416a3ee002b..6ddf46896b2 100644
> --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java
> +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java
> @@ -33,6 +33,7 @@
> import java.net.URI;
> import java.security.AccessController;
> import java.security.PrivilegedAction;
> +import java.util.Arrays;
> import java.util.concurrent.atomic.AtomicReference;
>
> import javax.print.*;
> @@ -325,6 +325,8 @@ public void print(PrintRequestAttributeSet attributes) throws PrinterException {
> lastPage = mDocument.getNumberOfPages() - 1;
> }
> }
> + System.out.println("print: firstPage = " + firstPage + "; "
> + + "lastPage = " + lastPage);
>
> try {
> synchronized (this) {
> @@ -338,7 +340,11 @@ public void print(PrintRequestAttributeSet attributes) throws PrinterException {
> : (PageRanges)attributes.get(PageRanges.class);
> int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers();
> int loopi = 0;
> + System.out.println("pr = " + pr);
> + System.out.println("prMembers = " + Arrays.deepToString(prMembers));
> do {
> + System.out.println("printLoop: firstPage = " + firstPage + "; "
> + + "lastPage = " + lastPage);
> if (EventQueue.isDispatchThread()) {
> // This is an AWT EventQueue, and this print rendering loop needs to block it.
>
> ```
>
> The output:
>
> ```
> 2-3 + 3-5 without Renjith changes
> print: firstPage = 1; lastPage = 2
> pr = 2-3
> prMembers = [[2, 3]]
> printLoop: firstPage = 1; lastPage = 2
> print: firstPage = 2; lastPage = 4
> pr = 3-5
> prMembers = [[3, 5]]
> printLoop: firstPage = 2; lastPage = 4
>
> 2-3 + 3-5 with Renjith changes
> print: firstPage = 0; lastPage = -1
> pr = 2-3
> prMembers = [[2, 3]]
> printLoop: firstPage = 0; lastPage = -1
> print: firstPage = 0; lastPage = -1
> pr = 3-5
> prMembers = [[3, 5]]
> printLoop: firstPage = 0; lastPage = -1
> ```
>
> In the first case, I got page 3 and page 5 printed; with Renjith's changes, I got the correct range printed 2-3 and 3-5.
>
> So it works… kind of. I believe the bug is somewhere in native code.
>
> What would be printed if `PageRanges` contains several ranges? This case should be supported as well.
>
> Since the last page to be printed is -1, `PrinterView->knowsPageRange` sets `aRange->length` to `NSIntegerMax`. This does not look right, even though it works.
>
> https://github.com/openjdk/jdk/blob/08ace27da1d9cd215c77471eabf41417ff6282d2/src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m#L130-L152
Yes, there is some disconnect. For all OS (MAC with above changes) print range is working properly only with following values firstPage =0 and lastPage =-1 at **RasterPrinterJob.java** and highly depend on **pageRangesAttr** . I don't think there is any issue with native code, with this change I have brought MAC same as other OS.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/19740#issuecomment-2182895930
More information about the client-libs-dev
mailing list