• R/O
  • HTTP
  • SSH
  • HTTPS

CharacterManaJ: Commit

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


Commit MetaInfo

Revision85bcb82172e129fbd6185684567d2fd0973632c1 (tree)
Time2018-12-31 13:45:34
Authorseraphy <seraphy@user...>
Commiterseraphy

Log Message

java9以降であればリフレクションによるスケールの確認は不要とする。

Change Summary

Incremental Difference

--- a/src/main/java/charactermanaj/ui/util/ScaleSupport.java
+++ b/src/main/java/charactermanaj/ui/util/ScaleSupport.java
@@ -8,6 +8,9 @@ import java.awt.GraphicsEnvironment;
88 import java.awt.Toolkit;
99 import java.awt.geom.AffineTransform;
1010 import java.lang.reflect.Field;
11+import java.lang.reflect.Method;
12+
13+import charactermanaj.util.JavaVersionUtils;
1114
1215 /**
1316 * スクリーンのスケールを取得する。
@@ -21,6 +24,8 @@ public class ScaleSupport {
2124
2225 private static final float computeScale;
2326
27+ private static final boolean noNeedCheckScaleByReflection;
28+
2429 private double scaleX;
2530
2631 private double scaleY;
@@ -41,6 +46,10 @@ public class ScaleSupport {
4146 // (Retinaの場合はシステム側でスケールされるのでアプリ側でスケールする必要はないため)
4247 float dpi = System.getProperty("os.name").startsWith("Windows") ? 96f : resolution;
4348 computeScale = resolution / dpi;
49+
50+ // Java9以降であればアフィン変換パラメータでスケールを確認できるので
51+ // リフレクションを使ったスケールの確認は不要である。
52+ noNeedCheckScaleByReflection = JavaVersionUtils.getJavaVersion() >= 9;
4453 }
4554
4655 private ScaleSupport(double scaleX, double scaleY) {
@@ -103,26 +112,36 @@ public class ScaleSupport {
103112 double scaleY = trans.getScaleY();
104113
105114 boolean retina = false;
106- if (scaleX == 1 && scaleY == 1) {
115+ if (scaleX == 1 && scaleY == 1 && !noNeedCheckScaleByReflection) {
107116 // Java8まではデフォルトのアフィン変換はスクリーンスケールは設定されていないので
108- // 等倍を返してきた場合は、グラフィクスデバイスがスケーメメソッドをもっているか
109- // リフレクションで確かめる。Mac版のJava8であればスケーメメソッドをもっている。
117+ // 等倍を返してきた場合は、グラフィクスデバイスがスケールメソッドをもっているかリフレクションで確かめる。
118+ // Mac版のJava8であればスケーメメソッドをもっている。
119+ // (Java9以降であれば確認は不要である。)
120+ // http://hg.openjdk.java.net/jdk9/client/jdk/file/1089d8a8a6e1/src/java.desktop/macosx/classes/sun/awt/CGraphicsDevice.java
110121 // https://www.programcreek.com/java-api-examples/?code=SensorsINI/jaer/jaer-master/src/net/sf/jaer/graphics/ChipCanvas.java
111122 final GraphicsDevice device = gconf.getDevice();
123+ Object scaleObj = null;
112124 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- }
125+ // public methodがあれば、そちらを試す。
126+ Method methodGetScaleFactor = device.getClass().getMethod("getScaleFactor");
127+ scaleObj = methodGetScaleFactor.invoke(device);
128+
129+ } catch (Exception ex) {
130+ try {
131+ // sun.awt.CGraphicsDevice固有の内部フィールドを試す
132+ Field field = device.getClass().getDeclaredField("scale");
133+ field.setAccessible(true);
134+ scaleObj = field.get(device);
135+ } catch (Exception ex2) {
136+ // 何もしない
137+ }
138+ }
139+ if (scaleObj instanceof Number) {
140+ int scale = ((Number) scaleObj).intValue();
141+ scaleX = scaleY = scale;
142+ if (scale >= 2) {
143+ retina = true;
123144 }
124- } catch (Exception ignore) {
125- // 何もしない
126145 }
127146 }
128147 ScaleSupport inst = new ScaleSupport(scaleX, scaleY);
Show on old repository browser