Skip to content

Commit 77c5ac1

Browse files
committed
Add tests for drawing scaled image with GC#drawImage()
This adds test cases for the GC#drawImage(ImageIIII) method to draw a scaled version of the given image. With the introduction of the ImageDataAtSizeProvider, an image can be provided at the desired size instead of rescaling the best fitting zoomed image. The added tests cover those use cases and ensure that based on the kind of ImageDataProvider the appropriately scaled data is used. The tests for the ImageDataAtSizeProvider are limited to Windows until the implementation is extended to GTK and Cocoa.
1 parent 4df1e42 commit 77c5ac1

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_graphics_GC.java

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*******************************************************************************/
1515
package org.eclipse.swt.tests.junit;
1616

17+
import static org.eclipse.swt.internal.DPIUtil.pointToPixel;
1718
import static org.eclipse.swt.tests.junit.SwtTestUtil.assertSWTProblem;
1819
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
1920
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -37,6 +38,8 @@
3738
import org.eclipse.swt.graphics.GC;
3839
import org.eclipse.swt.graphics.Image;
3940
import org.eclipse.swt.graphics.ImageData;
41+
import org.eclipse.swt.graphics.ImageDataAtSizeProvider;
42+
import org.eclipse.swt.graphics.ImageDataProvider;
4043
import org.eclipse.swt.graphics.ImageGcDrawer;
4144
import org.eclipse.swt.graphics.LineAttributes;
4245
import org.eclipse.swt.graphics.PaletteData;
@@ -51,6 +54,10 @@
5154
import org.junit.jupiter.api.AfterEach;
5255
import org.junit.jupiter.api.BeforeEach;
5356
import org.junit.jupiter.api.Test;
57+
import org.junit.jupiter.api.condition.EnabledOnOs;
58+
import org.junit.jupiter.api.condition.OS;
59+
import org.junit.jupiter.params.ParameterizedTest;
60+
import org.junit.jupiter.params.provider.ValueSource;
5461

5562
/**
5663
* Automated Test Suite for class org.eclipse.swt.graphics.GC
@@ -390,6 +397,155 @@ public void test_drawImageLorg_eclipse_swt_graphics_ImageIIII() {
390397
images.dispose();
391398
}
392399

400+
@Test
401+
public void test_drawImageLorg_eclipse_swt_graphics_ImageIIII_ImageDataProvider() {
402+
int width = 32;
403+
int height = 48;
404+
Image drawToImage = new Image(display, width, height);
405+
GC gc = new GC(drawToImage);
406+
gc.setAntialias(SWT.OFF);
407+
RGB drawnRgb = new RGB(255, 255, 255);
408+
RGB undrawnRgb = new RGB(0, 0, 0);
409+
ImageDataProvider imageDataProvider = zoom -> {
410+
if (zoom != 100) {
411+
return null;
412+
}
413+
PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF);
414+
ImageData imageData = new ImageData(16, 16, 32, palette);
415+
int drawnPixel = palette.getPixel(drawnRgb);
416+
for (int i = 0; i < 16; i++) {
417+
imageData.setPixel(i, 0, drawnPixel);
418+
imageData.setPixel(i, 15, drawnPixel);
419+
imageData.setPixel(0, i, drawnPixel);
420+
imageData.setPixel(15, i, drawnPixel);
421+
}
422+
return imageData;
423+
};
424+
Image image = new Image(display, imageDataProvider);
425+
try {
426+
gc.drawImage(image, 0, 0, width, height);
427+
int zoom = DPIUtil.getDeviceZoom();
428+
ImageData printedImageData = drawToImage.getImageData(zoom);
429+
PaletteData printedPalette = printedImageData.palette;
430+
// Expect that image is blurry scaled to the desired extents
431+
assertEquals(drawnRgb, printedPalette.getRGB(printedImageData.getPixel(0, 0)));
432+
assertNotEquals(undrawnRgb, printedPalette.getRGB(printedImageData.getPixel(1, 1)));
433+
assertNotEquals(undrawnRgb, printedPalette.getRGB(printedImageData.getPixel(1, 2)));
434+
assertEquals(undrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) / 2, pointToPixel(height, zoom) / 2)));
435+
assertNotEquals(undrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) - 2, pointToPixel(height, zoom) - 3)));
436+
assertNotEquals(undrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) - 2, pointToPixel(height, zoom) - 2)));
437+
assertEquals(drawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) - 1, pointToPixel(height, zoom) - 1)));
438+
} finally {
439+
image.dispose();
440+
drawToImage.dispose();
441+
}
442+
}
443+
444+
@Test
445+
@EnabledOnOs(value = OS.WINDOWS)
446+
public void test_drawImageLorg_eclipse_swt_graphics_ImageIIII_ImageDataAtSizeProvider_invalid() {
447+
ImageDataAtSizeProvider provider = new ImageDataAtSizeProvider() {
448+
@Override
449+
public ImageData getImageData(int zoom) {
450+
return new ImageData(1, 1, 32, new PaletteData(0xFF0000, 0xFF00, 0xFF));
451+
}
452+
453+
@Override
454+
public ImageData getImageData(int width, int height) {
455+
return null;
456+
}
457+
};
458+
Image image = new Image(display, provider);
459+
Image drawToImage = new Image(display, 1, 1);
460+
try {
461+
GC gc = new GC(drawToImage);
462+
Exception e = assertThrows(IllegalArgumentException.class, () -> gc.drawImage(image, 0, 0, 1, 1));
463+
assertSWTProblem("Incorrect exception thrown for provider == null", SWT.ERROR_INVALID_ARGUMENT, e);
464+
} finally {
465+
image.dispose();
466+
drawToImage.dispose();
467+
}
468+
}
469+
470+
@ParameterizedTest
471+
@ValueSource(ints = {SWT.IMAGE_COPY, SWT.IMAGE_DISABLE, SWT.IMAGE_GRAY, -1})
472+
@EnabledOnOs(value = OS.WINDOWS)
473+
public void test_drawImageLorg_eclipse_swt_graphics_ImageIIII_ImageDataAtSizeProvider(int styleFlag) {
474+
int width = 50;
475+
int height = 70;
476+
Image drawToImage = new Image(display, width, height);
477+
GC gc = new GC(drawToImage);
478+
gc.setAntialias(SWT.OFF);
479+
RGB drawnRgb = new RGB(255, 255, 255);
480+
RGB undrawnRgb = new RGB(0, 0, 0);
481+
ImageDataAtSizeProvider imageDataAtSizeProvider = new ImageDataAtSizeProvider() {
482+
@Override
483+
public ImageData getImageData(int width, int height) {
484+
PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF);
485+
int drawnPixel = palette.getPixel(drawnRgb);
486+
ImageData imageData = new ImageData(width, height, 32, palette);
487+
for (int i = 0; i < width; i++) {
488+
imageData.setPixel(i, 0, drawnPixel);
489+
imageData.setPixel(i, height - 1, drawnPixel);
490+
}
491+
for (int i = 0; i < height; i++) {
492+
imageData.setPixel(0, i, drawnPixel);
493+
imageData.setPixel(width - 1, i, drawnPixel);
494+
}
495+
return imageData;
496+
}
497+
@Override
498+
public ImageData getImageData(int zoom) {
499+
return new ImageData(1, 1, 32, new PaletteData(0xFF0000, 0xFF00, 0xFF));
500+
}
501+
};
502+
Image image = styleImage(new Image(display, imageDataAtSizeProvider), styleFlag);
503+
504+
try {
505+
gc.drawImage(image, 0, 0, width, height);
506+
int zoom = DPIUtil.getDeviceZoom();
507+
ImageData printedImageData = drawToImage.getImageData(zoom);
508+
PaletteData printedPalette = printedImageData.palette;
509+
RGB styledDrawnRgb = getStyledRgb(drawnRgb, styleFlag);
510+
RGB styledUndrawnRgb = getStyledRgb(undrawnRgb, styleFlag);
511+
assertEquals(styledDrawnRgb, printedPalette.getRGB(printedImageData.getPixel(0, 0)));
512+
assertEquals(styledUndrawnRgb, printedPalette.getRGB(printedImageData.getPixel(1, 1)));
513+
assertEquals(styledUndrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) / 2, pointToPixel(height, zoom) / 2)));
514+
assertEquals(styledUndrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) - 2, pointToPixel(height, zoom) - 2)));
515+
assertEquals(styledDrawnRgb, printedPalette.getRGB(printedImageData.getPixel(pointToPixel(width, zoom) - 4, pointToPixel(height, zoom) - 1)));
516+
} finally {
517+
image.dispose();
518+
drawToImage.dispose();
519+
}
520+
}
521+
522+
private Image styleImage(Image image, int styleFlag) {
523+
if (styleFlag == -1) {
524+
return image;
525+
}
526+
Image styledImage = new Image(display, image, styleFlag);
527+
image.dispose();
528+
return styledImage;
529+
}
530+
531+
private RGB getStyledRgb(RGB rgb, int styleFlag) {
532+
if (styleFlag == -1) {
533+
return rgb;
534+
}
535+
PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF);
536+
ImageData referenceData = new ImageData(1, 1, 32, palette);
537+
referenceData.setPixel(0, 0, palette.getPixel(rgb));
538+
Image referenceImage = new Image(display, referenceData);
539+
Image styledReferenceImage = new Image(display, referenceImage, styleFlag);
540+
try {
541+
ImageData styledmageData = styledReferenceImage.getImageData();
542+
return styledmageData.palette.getRGB(styledmageData.getPixel(0, 0));
543+
} finally {
544+
styledReferenceImage.dispose();
545+
referenceImage.dispose();
546+
}
547+
}
548+
393549
@Test
394550
public void test_drawLineIIII() {
395551
gc.drawLine(0,0,0,20);

0 commit comments

Comments
 (0)