Skip to content

Commit 45fafea

Browse files
akoch-yattaHeikoKlare
authored andcommitted
Adapt double buffering use cases for multi-zoom
This commit replaces three use cases where GC together with Images where used to draw double buffered images. With new multi-zoom-setting in Windows this leads to desctructive scaling and fragments caused by the double buffering of Images/GCs created with different zoom. The changes utilize the newly added ImageGcDrawer to provide a dynamic callback to draw on a correctly initialized GC on demand.
1 parent ed03d05 commit 45fafea

File tree

3 files changed

+93
-30
lines changed

3 files changed

+93
-30
lines changed

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/AnnotationRulerColumn.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.eclipse.swt.graphics.Font;
3636
import org.eclipse.swt.graphics.GC;
3737
import org.eclipse.swt.graphics.Image;
38+
import org.eclipse.swt.graphics.ImageGcDrawer;
3839
import org.eclipse.swt.graphics.Point;
3940
import org.eclipse.swt.graphics.Rectangle;
4041
import org.eclipse.swt.widgets.Canvas;
@@ -266,6 +267,13 @@ public Control createControl(CompositeRuler parentRuler, Composite parentControl
266267
fCachedTextWidget= null;
267268
});
268269

270+
fCanvas.addListener(SWT.ZoomChanged, e -> {
271+
if (fBuffer != null) {
272+
fBuffer.dispose();
273+
fBuffer= null;
274+
}
275+
});
276+
269277
fMouseListener= new MouseListener() {
270278
@Override
271279
public void mouseUp(MouseEvent event) {
@@ -517,10 +525,21 @@ private void doubleBufferPaint(GC dest) {
517525
fBuffer= null;
518526
}
519527
}
520-
if (fBuffer == null)
521-
fBuffer= new Image(fCanvas.getDisplay(), size.x, size.y);
528+
if (fBuffer == null) {
529+
ImageGcDrawer imageGcDrawer = new ImageGcDrawer() {
530+
@Override
531+
public void drawOn(GC gc, int imageWidth, int imageHeight) {
532+
doPaint(gc, new Point(imageWidth, imageHeight));
533+
}
534+
};
535+
fBuffer= new Image(fCanvas.getDisplay(), imageGcDrawer, size.x, size.y);
536+
} else {
537+
doPaint(new GC(fBuffer), size);
538+
}
539+
dest.drawImage(fBuffer, 0, 0);
540+
}
522541

523-
GC gc= new GC(fBuffer);
542+
private void doPaint(GC gc, Point size) {
524543
gc.setFont(fCachedTextWidget.getFont());
525544
try {
526545
gc.setBackground(fCanvas.getBackground());
@@ -533,8 +552,6 @@ private void doubleBufferPaint(GC dest) {
533552
} finally {
534553
gc.dispose();
535554
}
536-
537-
dest.drawImage(fBuffer, 0, 0);
538555
}
539556

540557
/**

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/ChangeRulerColumn.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.swt.graphics.Font;
2323
import org.eclipse.swt.graphics.GC;
2424
import org.eclipse.swt.graphics.Image;
25+
import org.eclipse.swt.graphics.ImageGcDrawer;
2526
import org.eclipse.swt.graphics.Point;
2627
import org.eclipse.swt.graphics.Rectangle;
2728
import org.eclipse.swt.widgets.Canvas;
@@ -199,6 +200,13 @@ public Control createControl(CompositeRuler parentRuler, Composite parentControl
199200
fCachedTextWidget= null;
200201
});
201202

203+
fCanvas.addListener(SWT.ZoomChanged, e -> {
204+
if (fBuffer != null) {
205+
fBuffer.dispose();
206+
fBuffer= null;
207+
}
208+
});
209+
202210
fCanvas.addMouseListener(fMouseHandler);
203211
fCanvas.addMouseMoveListener(fMouseHandler);
204212

@@ -249,19 +257,16 @@ private void doubleBufferPaint(GC dest) {
249257
fBuffer= null;
250258
}
251259
}
252-
if (fBuffer == null)
253-
fBuffer= new Image(fCanvas.getDisplay(), size.x, size.y);
254-
255-
GC gc= new GC(fBuffer);
256-
gc.setFont(fCanvas.getFont());
257-
258-
try {
259-
gc.setBackground(getBackground());
260-
gc.fillRectangle(0, 0, size.x, size.y);
261-
262-
doPaint(gc);
263-
} finally {
264-
gc.dispose();
260+
if (fBuffer == null) {
261+
ImageGcDrawer imageGcDrawer= new ImageGcDrawer() {
262+
@Override
263+
public void drawOn(GC gc, int imageWidth, int imageHeight) {
264+
doPaint(gc, new Point(imageWidth, imageHeight));
265+
}
266+
};
267+
fBuffer= new Image(fCanvas.getDisplay(), imageGcDrawer, size.x, size.y);
268+
} else {
269+
doPaint(new GC(fBuffer), size);
265270
}
266271

267272
dest.drawImage(fBuffer, 0, 0);
@@ -291,6 +296,19 @@ protected final boolean isViewerCompletelyShown() {
291296
return JFaceTextUtil.isShowingEntireContents(fCachedTextWidget);
292297
}
293298

299+
private void doPaint(GC gc, Point size) {
300+
gc.setFont(fCanvas.getFont());
301+
302+
try {
303+
gc.setBackground(getBackground());
304+
gc.fillRectangle(0, 0, size.x, size.y);
305+
306+
doPaint(gc);
307+
} finally {
308+
gc.dispose();
309+
}
310+
}
311+
294312
/**
295313
* Draws the ruler column.
296314
*

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/source/LineNumberRulerColumn.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.eclipse.swt.graphics.FontMetrics;
3535
import org.eclipse.swt.graphics.GC;
3636
import org.eclipse.swt.graphics.Image;
37+
import org.eclipse.swt.graphics.ImageGcDrawer;
3738
import org.eclipse.swt.graphics.Point;
3839
import org.eclipse.swt.graphics.Rectangle;
3940
import org.eclipse.swt.widgets.Canvas;
@@ -616,7 +617,13 @@ public void addMouseListener(MouseListener listener) {
616617
fCachedTextWidget= null;
617618
});
618619

619-
fCanvas.addListener(SWT.ZoomChanged, e -> computeIndentations());
620+
fCanvas.addListener(SWT.ZoomChanged, e -> {
621+
computeIndentations();
622+
if (fBuffer != null) {
623+
fBuffer.dispose();
624+
fBuffer= null;
625+
}
626+
});
620627

621628
fMouseHandler= new MouseHandler();
622629
fCanvas.addMouseListener(fMouseHandler);
@@ -681,8 +688,20 @@ private void doubleBufferPaint(GC dest) {
681688

682689
boolean bufferStillValid = fBuffer != null;
683690
if (fBuffer == null) {
684-
fBuffer= new Image(fCanvas.getDisplay(), size.x, size.y);
691+
ImageGcDrawer idp= new ImageGcDrawer() {
692+
@Override
693+
public void drawOn(GC gc, int imageWidth, int imageHeight) {
694+
ILineRange lines= JFaceTextUtil.getVisibleModelLines(fCachedTextViewer);
695+
if (lines == null) {
696+
return;
697+
}
698+
// We redraw everything; paint directly into the buffer
699+
initializeGC(gc, 0, 0, imageWidth, imageHeight);
700+
doPaint(gc, lines);
685701
}
702+
};
703+
fBuffer= new Image(fCanvas.getDisplay(), idp, size.x, size.y);
704+
} else {
686705
GC bufferGC= new GC(fBuffer);
687706
Image newBuffer= null;
688707
try {
@@ -745,16 +764,7 @@ private void doubleBufferPaint(GC dest) {
745764
fLastBottomModelLine= bottomModelLine;
746765
fLastHeight= height;
747766
if (dy != 0) {
748-
// Some rulers may paint outside the line region. Let them paint in a new image,
749-
// the copy the wanted bits.
750-
newBuffer= new Image(fCanvas.getDisplay(), size.x, size.y);
751-
GC localGC= new GC(newBuffer);
752-
try {
753-
initializeGC(localGC, 0, bufferY, size.x, bufferH);
754-
doPaint(localGC, visibleLines);
755-
} finally {
756-
localGC.dispose();
757-
}
767+
newBuffer= newBufferImage(size, bufferY, bufferH, visibleLines);
758768
bufferGC.drawImage(newBuffer, 0, bufferY, size.x, bufferH, 0, bufferY, size.x, bufferH);
759769
if (dy > 0 && bufferY + bufferH < size.y) {
760770
// Scrolled down in the text, but didn't use the full height of the Canvas: clear
@@ -774,9 +784,27 @@ private void doubleBufferPaint(GC dest) {
774784
newBuffer.dispose();
775785
}
776786
}
787+
}
777788
dest.drawImage(fBuffer, 0, 0);
778789
}
779790

791+
private Image newBufferImage(Point size, int bufferY, int bufferH, final ILineRange visibleLines) {
792+
ImageGcDrawer imageGcDrawer= new ImageGcDrawer() {
793+
@Override
794+
public void drawOn(GC localGC, int imageWidth, int imageHeight) {
795+
// Some rulers may paint outside the line region. Let them paint in a new image,
796+
// the copy the wanted bits.
797+
try {
798+
initializeGC(localGC, 0, bufferY, imageWidth, bufferH);
799+
doPaint(localGC, visibleLines);
800+
} finally {
801+
localGC.dispose();
802+
}
803+
}
804+
};
805+
return new Image(fCanvas.getDisplay(), imageGcDrawer, size.x, size.y);
806+
}
807+
780808
private void initializeGC(GC gc, int x, int y, int width, int height) {
781809
gc.setFont(fCanvas.getFont());
782810
if (fForeground != null) {

0 commit comments

Comments
 (0)