Reputation: 3
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