OSDN Git Service

Java8環境における、高解像度スクリーンのスケール対応
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / util / ScaleSupport.java
1 package charactermanaj.ui.util;
2
3 import java.awt.Component;
4 import java.awt.Dimension;
5 import java.awt.GraphicsConfiguration;
6 import java.awt.GraphicsDevice;
7 import java.awt.GraphicsEnvironment;
8 import java.awt.Toolkit;
9 import java.awt.geom.AffineTransform;
10
11 /**
12  * スクリーンのスケールを取得する。
13  *
14  * Java8であれば自動スケールがかかっていないので、マニュアルでスケール倍して座標を補正する。
15  * Java11であれば自動スケールがかかっている。
16  */
17 public class ScaleSupport {
18
19         private static final float scale;
20
21         private double scaleX;
22
23         private double scaleY;
24
25         private double manualScaleX;
26
27         private double manualScaleY;
28
29         static {
30                 Toolkit tk = Toolkit.getDefaultToolkit();
31                 int resolution = tk.getScreenResolution();
32
33                 float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : 72f;
34                 scale = resolution / dpi;
35         }
36
37         private ScaleSupport(double scaleX, double scaleY) {
38                 this.scaleX = scaleX;
39                 this.scaleY = scaleY;
40                 manualScaleX = scale / scaleX;
41                 manualScaleY = scale / scaleX;
42         }
43
44         /**
45          * コンポーネントのグラフィクス設定からスケールを取得する。
46          * まだ画面に関連付けられていない場合はnullを返す。
47          * @param comp
48          * @return
49          */
50         public static ScaleSupport getInstance(Component comp) {
51                 GraphicsConfiguration gconf = comp.getGraphicsConfiguration();
52                 if (gconf == null) {
53                         return null;
54                 }
55                 return getInstance(gconf);
56         }
57
58         public static ScaleSupport getDefault() {
59                 GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
60                 GraphicsDevice gdev = genv.getDefaultScreenDevice();
61                 return getInstance(gdev.getDefaultConfiguration());
62         }
63
64         public static ScaleSupport getInstance(GraphicsConfiguration gconf) {
65                 AffineTransform trans = gconf.getDefaultTransform();
66                 double scaleX = trans.getScaleX();
67                 double scaleY = trans.getScaleY();
68                 return new ScaleSupport(scaleX, scaleY);
69         }
70
71         public double getDefaultScaleX() {
72                 return scaleX;
73         }
74
75         public double getDefaultScaleY() {
76                 return scaleY;
77         }
78
79         public double getManualScaleX() {
80                 return manualScaleX;
81         }
82
83         public double getManualScaleY() {
84                 return manualScaleY;
85         }
86
87         public Dimension manualScaled(Dimension dim) {
88                 return new Dimension((int) (dim.getWidth() * manualScaleX), (int) (dim.getHeight() * manualScaleY));
89         }
90 }