-
Notifications
You must be signed in to change notification settings - Fork 192
Description
This is transferred from https://bugs.eclipse.org/bugs/show_bug.cgi?id=568864
Linux HiDPI GC.fillGradientRectangle changes device scale when drawing an image.
Linux Mint or Ubuntu latest versions
Hi-res display (200% scaling)
I am creating an SWT Image to a GC instance using GC.fillGradientRectangle() and drawing text to the same GC instance.
However, GC.fillGradientRectangle() changes the scale so any further drawing is not at the original scaling.
- Run the attached snippet and look at the generated image
- drawText() is called first and draws correctly
- fillGradientRectangle() is then called
- drawText() is then called again, but this time scaling is at 2x and so the text is double size
- If fillGradientRectangle() is commented out, then drawing is at the correct scale
It seems that once GC#fillGradientRectangle() is called any drawing after that is at double scale.
Note these lines in GC#fillGradientRectangle():
eclipse.platform.swt/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java
Lines 1595 to 1599 in 75beb1e
| long surface = Cairo.cairo_get_target(cairo); | |
| if (surface != 0) { | |
| float scaleFactor = DPIUtil.getDeviceZoom() / 100f; | |
| Cairo.cairo_surface_set_device_scale(surface, scaleFactor, scaleFactor); | |
| } |
Perhaps the scale should be set back to its original setting after drawing the gradient?
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class GraphicsSnippet {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
Image image = createImage(display);
shell.addListener(SWT.Paint, event -> {
GC gc = event.gc;
gc.drawImage(image, 0, 0);
});
shell.setSize(400, 400);
shell.open();
while(!shell.isDisposed()) {
if(!display.readAndDispatch()) display.sleep();
}
display.dispose();
image.dispose();
}
private static Image createImage(Display display) {
Image image = new Image(display, 400, 400);
GC gc = new GC(image);
// Draw some text
gc.drawText("Hello World", 10, 0);
// If this line is commented out, scaling is correct
gc.fillGradientRectangle(10, 20, 20, 20, true);
// Draw some more text, but now it is at 2x scale
gc.drawText("Hello World", 10, 50);
gc.dispose();
return image;
}
}On Linux:
On WIndows:
