diff options
author | Sven Gothel <[email protected]> | 2023-03-05 04:42:56 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-03-05 04:42:56 +0100 |
commit | d87f510194ad2eead2a42b41a3cbe1077f65a695 (patch) | |
tree | 80ab2b5bcfd55674e6310ed2ba5b96cf53d71daf /src/newt | |
parent | 8d4e039dfd490d3f2290523ea75c9f51460bae41 (diff) |
NEWT Screen: Allow injection of global (single) monitor size in [mm] via newt.ws.mmwidth and newt.ws.mmheight property
This is essential on bare-metal devices where the screen DRM/GBM driver does not provide the screen-size (in mm).
Otherwise we would have resolution/(size_mm=0) infinity density and none of our graph font demos would work,
as we compute pixel-em-size based using dpi and pixel-pt-size.
Diffstat (limited to 'src/newt')
8 files changed, 68 insertions, 26 deletions
diff --git a/src/newt/classes/jogamp/newt/ScreenImpl.java b/src/newt/classes/jogamp/newt/ScreenImpl.java index 17265a6a7..b41c28e27 100644 --- a/src/newt/classes/jogamp/newt/ScreenImpl.java +++ b/src/newt/classes/jogamp/newt/ScreenImpl.java @@ -84,8 +84,9 @@ public abstract class ScreenImpl extends Screen implements MonitorModeListener { protected int refCount; // number of Screen references by Window protected Rectangle virtViewportPU = new Rectangle(0, 0, 0, 0); // virtual rotated viewport in pixel units protected Rectangle virtViewportWU = new Rectangle(0, 0, 0, 0); // virtual rotated viewport in window units - protected static Dimension usrSize = null; // property values: newt.ws.swidth and newt.ws.sheight - protected static volatile boolean usrSizeQueried = false; + protected static Dimension usrScreenPixelSize = null; // property values: newt.ws.swidth and newt.ws.sheight + protected static Dimension usrMonitorMMSize = null; // property values: newt.ws.mmwidth and newt.ws.mmheight + protected static volatile boolean usrValuesQueried = false; private final ArrayList<MonitorModeListener> refMonitorModeListener = new ArrayList<MonitorModeListener>(); private long tCreated; // creationTime @@ -97,15 +98,21 @@ public abstract class ScreenImpl extends Screen implements MonitorModeListener { public static Screen create(final Display display, int idx) { try { - if(!usrSizeQueried) { + if(!usrValuesQueried) { synchronized (Screen.class) { - if(!usrSizeQueried) { - usrSizeQueried = true; - final int w = PropertyAccess.getIntProperty("newt.ws.swidth", true, 0); - final int h = PropertyAccess.getIntProperty("newt.ws.sheight", true, 0); - if(w>0 && h>0) { - usrSize = new Dimension(w, h); - System.err.println("User screen size "+usrSize); + if(!usrValuesQueried) { + usrValuesQueried = true; + final int px_w = PropertyAccess.getIntProperty("newt.ws.swidth", true, 0); + final int px_h = PropertyAccess.getIntProperty("newt.ws.sheight", true, 0); + if(px_w>0 && px_h>0) { + usrScreenPixelSize = new Dimension(px_w, px_h); + System.err.println("User screen size "+usrScreenPixelSize+" [pixel]"); + } + final int mm_w = PropertyAccess.getIntProperty("newt.ws.mmwidth", true, 0); + final int mm_h = PropertyAccess.getIntProperty("newt.ws.mmheight", true, 0); + if(mm_w>0 && mm_h>0) { + usrMonitorMMSize = new Dimension(mm_w, mm_h); + System.err.println("User monitor size "+usrMonitorMMSize+" [mm]"); } } } @@ -292,9 +299,9 @@ public abstract class ScreenImpl extends Screen implements MonitorModeListener { * Updates the <b>rotated</b> virtual viewport, may use native impl. */ protected void updateVirtualScreenOriginAndSize() { - if(null != usrSize ) { - virtViewportPU.set(0, 0, usrSize.getWidth(), usrSize.getHeight()); - virtViewportWU.set(0, 0, usrSize.getWidth(), usrSize.getHeight()); + if(null != usrScreenPixelSize ) { + virtViewportPU.set(0, 0, usrScreenPixelSize.getWidth(), usrScreenPixelSize.getHeight()); + virtViewportWU.set(0, 0, usrScreenPixelSize.getWidth(), usrScreenPixelSize.getHeight()); if(DEBUG) { System.err.println("Update user virtual screen viewport @ "+Thread.currentThread().getName()+": "+virtViewportPU); } diff --git a/src/newt/classes/jogamp/newt/driver/android/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/android/ScreenDriver.java index fbad10c8c..99609b56f 100644 --- a/src/newt/classes/jogamp/newt/driver/android/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/android/ScreenDriver.java @@ -107,7 +107,12 @@ public class ScreenDriver extends jogamp.newt.ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - i = getScreenSizeMM(outMetrics, props, i); // sizeMM + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + i = getScreenSizeMM(outMetrics, props, i); // sizeMM + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = outMetrics.widthPixels; // rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/awt/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/awt/ScreenDriver.java index 18c60ea84..69fde6736 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/awt/ScreenDriver.java @@ -112,8 +112,13 @@ public class ScreenDriver extends ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = ScreenImpl.default_sm_widthmm; // FIXME - props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = ScreenImpl.default_sm_widthmm; // FIXME + props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = currentMode.getRotatedWidth(); // rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/bcm/egl/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/bcm/egl/ScreenDriver.java index 3d2e8fc3a..3a07d38ab 100644 --- a/src/newt/classes/jogamp/newt/driver/bcm/egl/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/bcm/egl/ScreenDriver.java @@ -87,8 +87,13 @@ public class ScreenDriver extends jogamp.newt.ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = ScreenImpl.default_sm_widthmm; // FIXME - props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = ScreenImpl.default_sm_widthmm; // FIXME + props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = fixedWidth; // FIXME rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/ScreenDriver.java index 6b4d97baa..a48b768c9 100644 --- a/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/ScreenDriver.java @@ -80,8 +80,13 @@ public class ScreenDriver extends ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = ScreenImpl.default_sm_widthmm; // FIXME - props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = ScreenImpl.default_sm_widthmm; // FIXME + props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = cachedWidth; // rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java index e25a0eb22..e5ba4a960 100644 --- a/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java @@ -119,8 +119,13 @@ public class ScreenDriver extends ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = connectors[scridx].getMmWidth(); - props[i++] = connectors[scridx].getMmHeight(); + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = connectors[scridx].getMmWidth(); + props[i++] = connectors[scridx].getMmHeight(); + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = mode[scridx].getHdisplay(); // rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/intel/gdl/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/intel/gdl/ScreenDriver.java index 456545430..2b5e672ed 100644 --- a/src/newt/classes/jogamp/newt/driver/intel/gdl/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/intel/gdl/ScreenDriver.java @@ -89,8 +89,13 @@ public class ScreenDriver extends jogamp.newt.ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = ScreenImpl.default_sm_widthmm; // FIXME - props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = ScreenImpl.default_sm_widthmm; // FIXME + props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = cachedWidth; // rotated viewport width pixel-units diff --git a/src/newt/classes/jogamp/newt/driver/kd/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/kd/ScreenDriver.java index 0b70737ac..011bfaf6e 100644 --- a/src/newt/classes/jogamp/newt/driver/kd/ScreenDriver.java +++ b/src/newt/classes/jogamp/newt/driver/kd/ScreenDriver.java @@ -85,8 +85,13 @@ public class ScreenDriver extends ScreenImpl { props[i++] = crt_id; props[i++] = 0; // is-clone props[i++] = 1; // is-primary - props[i++] = ScreenImpl.default_sm_widthmm; // FIXME - props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + if( null != usrMonitorMMSize ) { + props[i++] = usrMonitorMMSize.getWidth(); + props[i++] = usrMonitorMMSize.getHeight(); + } else { + props[i++] = ScreenImpl.default_sm_widthmm; // FIXME + props[i++] = ScreenImpl.default_sm_heightmm; // FIXME + } props[i++] = 0; // rotated viewport x pixel-units props[i++] = 0; // rotated viewport y pixel-units props[i++] = cachedWidth; // rotated viewport width pixel-units |