know
know

Reputation: 3

How to draw image with device zoom set over 175%?

I want to display preview of a model before print on Windows10. My dialog window:

protected Control createDialogArea( Composite parent )
  {
    // some code

    preview = new PrintPreview( previewComp, SWT.NONE );

    GridData previewLayoutData = new GridData( GridData.FILL, GridData.FILL, true, true );
    previewLayoutData.widthHint = 450;
    previewLayoutData.heightHint = 600;

    preview.setLayoutData( previewLayoutData );

    // some code
    refreshPreview( true );
    setMessage( DialogMessage, IMessageProvider.INFORMATION );

    return parent;
  }

creating image buffer:

public void renderModelViewIntoImage(final ModelViewDataItem modelView, final boolean showOutlines, final boolean showGeometry, 
                                   final int width, final int height, boolean is3DHTMLImage, boolean fireCallback)
{
//some code

addAction(new RenderActionTask() {
  @Override
  public boolean doTask(GL gl)
  {
    // some code
    // Set width and height for camera.
    renderParams.getCamera().setWidth( width );
    renderParams.getCamera().setHeight( height );
    
    // Prepare PRINT scene - set bounds.
    Scene scene = scenes.get( SceneType.PRINT );
    scene.setBounds(width, height);

    // some code
    // Add PRINT scene to render parameters.
    renderParams.addScene(SceneType.PRINT, scene);

    // Get image (in ByteBuffer format) from PRINT scene.
    ByteBuffer imgBuffer = getModelViewImageData( gl, width, height );
    
    // some code
    
    // Notify viewerCallback about that model view was rendered.
    if(fireCallback)
      viewerCallback.mvRendered(modelView, imgBuffer, width, height, is3DHTMLImage);
      
    // Return - in false case, no refresh is required.
    return false;
  }
});
}

and creating ImageData:

public void mvRendered(ModelViewDataItem modelView, ByteBuffer imgBuffer, int width, int height, boolean is3DHTMLImage)
{
TreeDataItem mvTreeDataItem = modelView.getItem();
if(mvTreeDataItem == null)
  return;

if(something)
{
  // some code
} else
{
  ImageData swtImage = toSWTImage(imgBuffer, width, height);
  mvImageData.put(mvTreeDataItem, swtImage);
}

view.getParent().getDisplay().syncExec(new Runnable()
{
  @Override
  public void run()
  {
    view.mvRendered(modelView);
  }
});
}

While monitor zoom is set up to 150%, org.eclipse.swt.internal.DPIUtil.getDeviceZoom() returns 100 and everything works fine. But if zoom is set to 175% or higher, org.eclipse.swt.graphics.GC.drawImage(Image, int, int, int, int, int, int, int, int) throws SWT.ERROR_INVALID_ARGUMENT. There is condition int errX = src.x + src.width - b.width; and src.width is always double of b.width, if device zoom = 200.

I really have no idea how to deal with this. Thanks for any idea!!

Update 5.4.2023, console error:

java.lang.IllegalArgumentException: Argument not valid
        at org.eclipse.swt.SWT.error(SWT.java:4576)
        at org.eclipse.swt.SWT.error(SWT.java:4510)
        at org.eclipse.swt.SWT.error(SWT.java:4481)
        at org.eclipse.swt.graphics.GC.drawImage(GC.java:939)
        at org.eclipse.nebula.paperclips.core.ImagePiece.paint(ImagePrint.java:246)
        at org.eclipse.nebula.paperclips.core.ScalePiece.paint(ScalePrint.java:246)
        at org.eclipse.nebula.paperclips.core.CompositePiece.paint(CompositePiece.java:116)
        at org.eclipse.nebula.paperclips.core.CompositePiece.paint(CompositePiece.java:116)
        at org.eclipse.nebula.paperclips.core.CompositePiece.paint(CompositePiece.java:116)
        at org.eclipse.nebula.paperclips.core.CompositePiece.paint(CompositePiece.java:116)
        at org.eclipse.nebula.paperclips.core.CompositePiece.paint(CompositePiece.java:116)
        at org.eclipse.nebula.paperclips.widgets.PrintPreview.paintPage(PrintPreview.java:460)
        at org.eclipse.nebula.paperclips.widgets.PrintPreview.paint(PrintPreview.java:426)
        at org.eclipse.nebula.paperclips.widgets.PrintPreview.access$0(PrintPreview.java:404)
        at org.eclipse.nebula.paperclips.widgets.PrintPreview$1.handleEvent(PrintPreview.java:87)
        at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
        at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4131)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1055)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
        at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1064)
        at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1564)
        at org.eclipse.swt.widgets.Control.windowProc(Control.java:4825)
        at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:348)
        at org.eclipse.swt.widgets.Display.windowProc(Display.java:4778)
        at org.eclipse.swt.internal.win32.OS.DispatchMessage(Native Method)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3545)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1173)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
        at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1062)
        at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
        at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:636)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:563)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:151)
        at com.transcat.tca3dn.viewer.rcp.Application.start(Unknown Source)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:595)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1501)

I did try scale image before drawing but did not help. There is some answer which might be helpful, but I am not probably understand, how to implement it. I know there is Property to override high DPI scaling behavior by system, but that is not what I want.

Upvotes: 0

Views: 58

Answers (0)

Related Questions