Skip to content

Commit d924abc

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 d884e6b commit d924abc

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
@@ -37,6 +37,8 @@
3737
import org.eclipse.swt.graphics.GC;
3838
import org.eclipse.swt.graphics.Image;
3939
import org.eclipse.swt.graphics.ImageData;
40+
import org.eclipse.swt.graphics.ImageDataAtSizeProvider;
41+
import org.eclipse.swt.graphics.ImageDataProvider;
4042
import org.eclipse.swt.graphics.ImageGcDrawer;
4143
import org.eclipse.swt.graphics.LineAttributes;
4244
import org.eclipse.swt.graphics.PaletteData;
@@ -51,6 +53,10 @@
5153
import org.junit.jupiter.api.AfterEach;
5254
import org.junit.jupiter.api.BeforeEach;
5355
import org.junit.jupiter.api.Test;
56+
import org.junit.jupiter.api.condition.EnabledOnOs;
57+
import org.junit.jupiter.api.condition.OS;
58+
import org.junit.jupiter.params.ParameterizedTest;
59+
import org.junit.jupiter.params.provider.ValueSource;
5460

5561
/**
5662
* Automated Test Suite for class org.eclipse.swt.graphics.GC
@@ -390,6 +396,156 @@ public void test_drawImageLorg_eclipse_swt_graphics_ImageIIII() {
390396
images.dispose();
391397
}
392398

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

0 commit comments

Comments
 (0)