blob: fc3459b1315330135c7c58ea6225b27339366358 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Red Hat and others. All rights reserved.
* The contents of this file are made available under the terms
* of the GNU Lesser General Public License (LGPL) Version 2.1 that
* accompanies this distribution (lgpl-v21.txt). The LGPL is also
* available at http://www.gnu.org/licenses/lgpl.html. If the version
* of the LGPL at http://www.gnu.org is different to the version of
* the LGPL accompanying this distribution and there is any conflict
* between the two license versions, the terms of the LGPL accompanying
* this distribution shall govern.
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/*
* Title: Bug 164015 - AWT_SWT bridge hangs on g2D.drawImage(bufferedImage) and then segfaults
* How to run: launch snippet, JVM should segfault
* Bug description: JVM segfault
* Expected results: The image is drawn correctly in the window
* GTK Version(s): N/A
*/
public class Bug164015_G2DDrawImage extends JPanel {
private static final long serialVersionUID = -6507131039136726834L;
private static final int TILE_SIZE = 200;
private static final boolean USE_JAI_FOR_IMAGE_IO = true;
private int viewport_x = 0, viewport_y = 0;
/** constructor */
public Bug164015_G2DDrawImage() {
this.setDoubleBuffered(false); // this makes the bug show up faster
}
/** scroll the viewport */
public void scroll(int x, int y) {
viewport_x += x;
viewport_y += y;
this.repaint();
}
public BufferedImage loadTile(int x, int y) {
String file_path = "tile_" + x + "_" + y + ".gif";
BufferedImage bufferedImage = null;
if (USE_JAI_FOR_IMAGE_IO) {
try {
bufferedImage = ImageIO.read(new File(file_path));
} catch (IOException e) {
bufferedImage = null;
}
} else { // use AWT
Image image = new ImageIcon(file_path).getImage();
if (image.getWidth(null) <= 0 || image.getHeight(null) <= 0) {
return null;
}
bufferedImage = new BufferedImage(image.getWidth(null), image
.getHeight(null), BufferedImage.TYPE_INT_ARGB);
bufferedImage.getGraphics().drawImage(image, 0, 0, null);
}
return bufferedImage;
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2D = (Graphics2D) g;
int firsttile_x = viewport_x - viewport_x % TILE_SIZE;
int firsttile_y = viewport_y - viewport_y % TILE_SIZE;
int lasttile_x = firsttile_x
+ (this.getWidth() / TILE_SIZE + 2) * TILE_SIZE;
int lasttile_y = firsttile_y
+ (this.getHeight() / TILE_SIZE + 2) * TILE_SIZE;
for (int currtile_y = firsttile_y; currtile_y < lasttile_y; currtile_y += TILE_SIZE) {
for (int currtile_x = firsttile_x; currtile_x < lasttile_x; currtile_x += TILE_SIZE) {
BufferedImage currentImage = loadTile(currtile_x, currtile_y);
if (currentImage != null) {
System.err.print("drawing graphics.image... ");
g2D.drawImage(currentImage, currtile_x - viewport_x,
currtile_y - viewport_y, null);
System.err.println("done");
}
g2D.setColor(Color.RED); // outline the tiles
g2D.drawRect(currtile_x - viewport_x, currtile_y - viewport_y,
TILE_SIZE, TILE_SIZE);
}
}
}
public static void main(String[] args) {
/** create SWT GUI */
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("AWT_SWT Test");
Composite swtAwtComponent = new Composite(shell, SWT.EMBEDDED);
java.awt.Frame frame = SWT_AWT.new_Frame(swtAwtComponent);
final Bug164015_G2DDrawImage myJPanel = new Bug164015_G2DDrawImage();
frame.add(myJPanel);
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
myJPanel.scroll(20, 0);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
myJPanel.scroll(-20, 0);
}
if (e.getKeyCode() == KeyEvent.VK_UP) {
myJPanel.scroll(0, 20);
}
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
myJPanel.scroll(0, -20);
}
}
});
shell.setLayout(new FillLayout());
shell.pack();
shell.open();
shell.setMaximized(true);
try {
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} finally {
display.dispose();
System.err.println("EXITING NORMALLY!!");
}
}
}