• R/O
  • HTTP
  • SSH
  • HTTPS

CharacterManaJ: Commit

キャラクターなんとかJの本体


Commit MetaInfo

Revision0190779fa05322a0d47d4d55414a745ab72c9ad3 (tree)
Time2018-12-31 03:29:57
Authorseraphy <seraphy@user...>
Commiterseraphy

Log Message

Retina/NonRetinaのスクリーンスケールの認識

Change Summary

Incremental Difference

--- a/src/main/java/charactermanaj/ui/AboutBox.java
+++ b/src/main/java/charactermanaj/ui/AboutBox.java
@@ -203,6 +203,22 @@ public class AboutBox {
203203 buf.append("<tr><td>Free Memory:</td><td>" + decimalFmt.format(freeMem) + " KiB</td></tr>");
204204 buf.append("</table>");
205205
206+ // スクリーンスケールの取得
207+ ScaleSupport scaleSupport = ScaleSupport.getInstance(parent);
208+ if (scaleSupport == null) {
209+ scaleSupport = ScaleSupport.getDefault();
210+ }
211+ String strRetina = scaleSupport.isRetina() ? "(Retina)" : "";
212+ buf.append("<h2>Screen Scale</h2>");
213+ buf.append("<table border=\"0\">");
214+ buf.append("<tr><td>system scale x</td><td>" + scaleSupport.getDefaultScaleX() + strRetina + "</td></tr>");
215+ buf.append("<tr><td>system scale y</td><td>" + scaleSupport.getDefaultScaleY() + strRetina + "</td></tr>");
216+ buf.append("<tr><td>calibrate scale x</td><td>" + scaleSupport.getManualScaleX() + "</td></tr>");
217+ buf.append("<tr><td>calibrate scale y</td><td>" + scaleSupport.getManualScaleY() + "</td></tr>");
218+ buf.append("<tr><td>screen resolution</td><td>" + ScaleSupport.getScreenResolution() + "</td></tr>");
219+ buf.append("<tr><td>screen scale</td><td>" + ScaleSupport.getScreenScale() + "</td></tr>");
220+ buf.append("</table>");
221+
206222 // キャラクターデータベースの取得
207223
208224 DirectoryConfig dirConfig = DirectoryConfig.getInstance();
--- a/src/main/java/charactermanaj/ui/util/ScaleSupport.java
+++ b/src/main/java/charactermanaj/ui/util/ScaleSupport.java
@@ -7,6 +7,7 @@ import java.awt.GraphicsDevice;
77 import java.awt.GraphicsEnvironment;
88 import java.awt.Toolkit;
99 import java.awt.geom.AffineTransform;
10+import java.lang.reflect.Field;
1011
1112 /**
1213 * スクリーンのスケールを取得する。
@@ -16,7 +17,9 @@ import java.awt.geom.AffineTransform;
1617 */
1718 public class ScaleSupport {
1819
19- private static final float scale;
20+ private static final int resolution;
21+
22+ private static final float computeScale;
2023
2124 private double scaleX;
2225
@@ -26,19 +29,50 @@ public class ScaleSupport {
2629
2730 private double manualScaleY;
2831
32+ private boolean retina;
33+
2934 static {
35+ // デフォルトのスクリーン解像度を取得する
3036 Toolkit tk = Toolkit.getDefaultToolkit();
31- int resolution = tk.getScreenResolution();
37+ resolution = tk.getScreenResolution();
3238
33- float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : 72f;
34- scale = resolution / dpi;
39+ // スクリーン解像度と標準のDPIから必要とされるスケールを計算する。
40+ // ただし、Windowsでない場合はスケール1の等倍にする。
41+ // (Retinaの場合はシステム側でスケールされるのでアプリ側でスケールする必要はないため)
42+ float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : resolution;
43+ computeScale = resolution / dpi;
3544 }
3645
3746 private ScaleSupport(double scaleX, double scaleY) {
3847 this.scaleX = scaleX;
3948 this.scaleY = scaleY;
40- manualScaleX = scale / scaleX;
41- manualScaleY = scale / scaleX;
49+ if (scaleX > 1 || scaleY > 1 || Boolean.getBoolean("disableScaleCalibrate")) {
50+ // システム側でスケールがかかっていれば、アプリ側ではスケールする必要はない。
51+ // もしくはシステムプロパティでアプリによるスケールを無効にしている場合。
52+ manualScaleX = 1;
53+ manualScaleY = 1;
54+ } else {
55+ // システム側でスケールがかかっていない場合はアプリ側でスケールする
56+ // スクリーン解像度とDPIから必要なスケールを求める
57+ manualScaleX = computeScale;
58+ manualScaleY = computeScale;
59+ }
60+ }
61+
62+ public static int getScreenResolution() {
63+ return resolution;
64+ }
65+
66+ public static float getScreenScale() {
67+ return computeScale;
68+ }
69+
70+ private void setRetina(boolean retina) {
71+ this.retina = retina;
72+ }
73+
74+ public boolean isRetina() {
75+ return retina;
4276 }
4377
4478 /**
@@ -62,10 +96,38 @@ public class ScaleSupport {
6296 }
6397
6498 public static ScaleSupport getInstance(GraphicsConfiguration gconf) {
99+ // java9以降であれば、GraphicsConfigurationのデフォルトのアフィン変換に
100+ // スクリーンのスケールがかけられている。
65101 AffineTransform trans = gconf.getDefaultTransform();
66102 double scaleX = trans.getScaleX();
67103 double scaleY = trans.getScaleY();
68- return new ScaleSupport(scaleX, scaleY);
104+
105+ boolean retina = false;
106+ if (scaleX == 1 && scaleY == 1) {
107+ // Java8まではデフォルトのアフィン変換はスクリーンスケールは設定されていないので
108+ // 等倍を返してきた場合は、グラフィクスデバイスがスケーメメソッドをもっているか
109+ // リフレクションで確かめる。Mac版のJava8であればスケーメメソッドをもっている。
110+ // https://www.programcreek.com/java-api-examples/?code=SensorsINI/jaer/jaer-master/src/net/sf/jaer/graphics/ChipCanvas.java
111+ final GraphicsDevice device = gconf.getDevice();
112+ try {
113+ Field field = device.getClass().getDeclaredField("scale");
114+ field.setAccessible(true);
115+ Object scaleObj = field.get(device);
116+
117+ if (scaleObj instanceof Number) {
118+ int scale = ((Number) scaleObj).intValue();
119+ scaleX = scaleY = scale;
120+ if (scale >= 2) {
121+ retina = true;
122+ }
123+ }
124+ } catch (Exception ignore) {
125+ // 何もしない
126+ }
127+ }
128+ ScaleSupport inst = new ScaleSupport(scaleX, scaleY);
129+ inst.setRetina(retina);
130+ return inst;
69131 }
70132
71133 public double getDefaultScaleX() {
Show on old repository browser