jzy3d / jzy3d-api

A Java API for 3d and 2d charts
BSD 3-Clause "New" or "Revised" License
281 stars 145 forks source link

2D overlay : EmulGL and native should have the same code when dealing with HiDPI #304

Open jzy3d opened 1 year ago

jzy3d commented 1 year ago

Currently, some specific code is required when handling 2D overlays with JOGL (native) and EmulGL charts.

IViewOverlay impl JOGL : AWTNativeViewOverlay) EmulGL : EmulGLViewOverlay
Similar Applies pixel scale to G2D Applies pixel scale to G2D
Different canvas.getRendererHeight() is pixel scaled canvas.getRendererHeight() is not pixel scaled

This result in lot of code area where we use canvas.isNative() to apply different formulae for the layout in EmulGL or Native (e.g. View2DLayout).

Code would be simpler and more readable if EmulGLCanvas could return a scaled renderer height/width.

jzy3d commented 1 year ago

Another way of dealing with HiDPI for Windows would be

      setLayout(new BorderLayout() {
          @Override
          public void layoutContainer(Container target) {
              synchronized (target.getTreeLock()) {
                  Insets insets = target.getInsets();
                  int top = insets.top;
                  int bottom = target.getHeight() - insets.bottom;
                  int left = insets.left;
                  int right = target.getWidth() - insets.right;

                  Graphics graphics = getGraphics();
                  AffineTransform transform = ((Graphics2D) graphics).getTransform();
                  double scaleX = transform.getScaleX();
                  double scaleY = transform.getScaleY();

                  int width = right - left;
                  int height = bottom - top;
                  width *= scaleX;
                  height *= scaleY;

                  renWin.setBounds(left, top, width, height);
              }
          }
      });