1 /*
2  * Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.print;
27 
28 import java.awt.GraphicsConfiguration;
29 import java.awt.GraphicsDevice;
30 import java.awt.Rectangle;
31 import java.awt.Transparency;
32 import java.awt.geom.AffineTransform;
33 import java.awt.image.BufferedImage;
34 import java.awt.image.ColorModel;
35 import java.awt.image.DirectColorModel;
36 
37 public final class PrinterGraphicsConfig extends GraphicsConfiguration {
38 
39     static ColorModel theModel;
40 
41     private final GraphicsDevice device;
42     private final int pageWidth;
43     private final int pageHeight;
44     private final AffineTransform deviceTransform;
45 
PrinterGraphicsConfig(String printerID, AffineTransform deviceTx, int pageWid, int pageHgt)46     public PrinterGraphicsConfig(String printerID, AffineTransform deviceTx,
47                                  int pageWid, int pageHgt) {
48         this.pageWidth = pageWid;
49         this.pageHeight = pageHgt;
50         this.deviceTransform = deviceTx;
51         this.device = new PrinterGraphicsDevice(this, printerID);
52     }
53 
54     /**
55      * Return the graphics device associated with this configuration.
56      */
57     @Override
getDevice()58     public GraphicsDevice getDevice() {
59         return device;
60     }
61 
62     /**
63      * Returns the color model associated with this configuration.
64      */
65     @Override
getColorModel()66     public ColorModel getColorModel() {
67         if (theModel == null) {
68             BufferedImage bufImg =
69                 new BufferedImage(1,1, BufferedImage.TYPE_3BYTE_BGR);
70             theModel = bufImg.getColorModel();
71         }
72 
73         return theModel;
74     }
75 
76     /**
77      * Returns the color model associated with this configuration that
78      * supports the specified transparency.
79      */
80     @Override
getColorModel(int transparency)81     public ColorModel getColorModel(int transparency) {
82         switch (transparency) {
83         case Transparency.OPAQUE:
84             return getColorModel();
85         case Transparency.BITMASK:
86             return new DirectColorModel(25, 0xff0000, 0xff00, 0xff, 0x1000000);
87         case Transparency.TRANSLUCENT:
88             return ColorModel.getRGBdefault();
89         default:
90             return null;
91         }
92     }
93 
94     /**
95      * Returns the default Transform for this configuration.  This
96      * Transform is typically the Identity transform for most normal
97      * screens.  Device coordinates for screen and printer devices will
98      * have the origin in the upper left-hand corner of the target region of
99      * the device, with X coordinates
100      * increasing to the right and Y coordinates increasing downwards.
101      * For image buffers, this Transform will be the Identity transform.
102      */
103     @Override
getDefaultTransform()104     public AffineTransform getDefaultTransform() {
105         return new AffineTransform(deviceTransform);
106     }
107 
108     /**
109      *
110      * Returns a Transform that can be composed with the default Transform
111      * of a Graphics2D so that 72 units in user space will equal 1 inch
112      * in device space.
113      * Given a Graphics2D, g, one can reset the transformation to create
114      * such a mapping by using the following pseudocode:
115      * <pre>
116      *      GraphicsConfiguration gc = g.getGraphicsConfiguration();
117      *
118      *      g.setTransform(gc.getDefaultTransform());
119      *      g.transform(gc.getNormalizingTransform());
120      * </pre>
121      * Note that sometimes this Transform will be identity (e.g. for
122      * printers or metafile output) and that this Transform is only
123      * as accurate as the information supplied by the underlying system.
124      * For image buffers, this Transform will be the Identity transform,
125      * since there is no valid distance measurement.
126      */
127     @Override
getNormalizingTransform()128     public AffineTransform getNormalizingTransform() {
129         return new AffineTransform();
130     }
131 
132     @Override
getBounds()133     public Rectangle getBounds() {
134         return new Rectangle(0, 0, pageWidth, pageHeight);
135     }
136 }
137