RFR: 8307246 : Printing: banded raster path doesn't account for device offset values

Phil Race prr at openjdk.org
Tue Jan 23 00:45:25 UTC 2024


On Mon, 11 Dec 2023 05:32:20 GMT, vtstydev <duke at openjdk.org> wrote:

> > This is going to require manual verification. Likely we'll need to test all possible page orientations too - did you try that ?
> 
> I printed some documents, that renders with banded-raster printing loop, both orientations on Windows and Linux. They were printed well.

I was hoping (!) you would write a test. In fact there needs to be one.
Comparison of opaque vs translucent in all orientations.
And clearly it needs to be a manual test, that means user instructions are needed.
It should use PassFailJFrame
The test probably also needs to display the print dialog, so the user can agree on which printer to use.

I've not done those last 3 things but here's a test which starts with what you had in the bug report.
It needs to be updated to be a proper jtreg test.




mport java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke;
import java.awt.print.Book;
import java.awt.print.Pageable;
import java.awt.print.PageFormat;
import static java.awt.print.PageFormat.*;
import java.awt.print.Paper;
import java.awt.print.Printable;
import static java.awt.print.Printable.*;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Sides;

public class AlphaPrintingOffsets implements Printable {

    private static final Color OPAQUE_COLOR = Color.black;
    private static final Color ALPHA_COLOR = new Color(0, 0, 0, 200);
    private static AlphaPrintingOffsets opaque = new AlphaPrintingOffsets(OPAQUE_COLOR);
    private static AlphaPrintingOffsets alpha = new AlphaPrintingOffsets(ALPHA_COLOR);

    private Color color;

    public AlphaPrintingOffsets(Color c) {
         color = c;
    }

    private static String getOrientStr(int orient) {
        switch (orient) {
            case PORTRAIT: return "PORTRAIT";
            case LANDSCAPE: return "LANDSCAPE";
            case REVERSE_LANDSCAPE: return "REVERSE_LANDSCAPE";
            default : return "BAD Orientation";
        }
    }

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
                     throws PrinterException {

        Graphics2D g2d = (Graphics2D)graphics;
        g2d.setColor(OPAQUE_COLOR);

        Stroke oldstroke = g2d.getStroke();
        g2d.setStroke(new BasicStroke(10));
        g2d.translate(15, 0);
        g2d.drawLine(0, 0 ,0, 300); //LEFT margin line
        g2d.translate(-15, 0);
        g2d.translate(0, -15);

        Paper paper = pageFormat.getPaper();
        int orient = pageFormat.getOrientation();
        int iw = (int)paper.getImageableWidth();
        int ih = (int)paper.getImageableHeight();
        int bm = orient == PORTRAIT ? ih : iw; //BOTTOM margin line
        g2d.drawLine(0, bm, 300, bm);
        g2d.translate(0, 15);
        g2d.setStroke(oldstroke);

        String msg = "Orient= " + getOrientStr(orient);
        msg += " Color="+ (color.getAlpha() != 255 ? " ALPHA" : " OPAQUE");
        g2d.drawString(msg, 300, 300);
        g2d.setColor(color);
        g2d.fill(new Rectangle(0, 0, 200, 200));

        return PAGE_EXISTS;
    }

    public static void main(String[] argv) {
        test(PORTRAIT);
        test(LANDSCAPE);
        test(REVERSE_LANDSCAPE);
   }

    static void test(int orient) {

        PrinterJob printJob = PrinterJob.getPrinterJob();
        PageFormat pageFormat = printJob.defaultPage();
        Paper paper = pageFormat.getPaper();
        paper.setImageableArea(0,0,paper.getWidth(),paper.getHeight());
        pageFormat.setOrientation(orient);
        pageFormat.setPaper(paper);

        Book book = new Book();
        book.append(opaque, pageFormat);
        book.append(alpha, pageFormat);
        printJob.setPageable(book);

        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(Sides.ONE_SIDED);
        try {
            printJob.print(aset);
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}

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

PR Comment: https://git.openjdk.org/jdk/pull/17030#issuecomment-1905088271


More information about the client-libs-dev mailing list