Advertisement
Guest User

Untitled

a guest
Jun 1st, 2011
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.38 KB | None | 0 0
  1. import java.awt.Graphics2D;
  2. import java.awt.Point;
  3. import java.awt.image.BufferedImage;
  4. import java.awt.image.ColorModel;
  5. import java.awt.image.DataBuffer;
  6. import java.awt.image.DataBufferInt;
  7. import java.awt.image.DirectColorModel;
  8. import java.awt.image.IndexColorModel;
  9. import java.awt.image.Raster;
  10. import java.awt.image.WritableRaster;
  11. import java.io.IOException;
  12. import java.nio.ByteBuffer;
  13. import java.nio.ByteOrder;
  14. import java.nio.IntBuffer;
  15.  
  16. import javax.swing.SwingUtilities;
  17.  
  18. import org.eclipse.swt.SWT;
  19. import org.eclipse.swt.graphics.GC;
  20. import org.eclipse.swt.graphics.Image;
  21. import org.eclipse.swt.graphics.ImageData;
  22. import org.eclipse.swt.graphics.ImageLoader;
  23. import org.eclipse.swt.graphics.PaletteData;
  24. import org.eclipse.swt.graphics.RGB;
  25. import org.eclipse.swt.layout.FillLayout;
  26. import org.eclipse.swt.opengl.GLCanvas;
  27. import org.eclipse.swt.opengl.GLData;
  28. import org.eclipse.swt.widgets.Canvas;
  29. import org.eclipse.swt.widgets.Composite;
  30. import org.eclipse.swt.widgets.Display;
  31. import org.eclipse.swt.widgets.Event;
  32. import org.eclipse.swt.widgets.Listener;
  33. import org.eclipse.swt.widgets.Shell;
  34. import org.lwjgl.LWJGLException;
  35. import org.lwjgl.opengl.GL11;
  36. import org.lwjgl.opengl.GLContext;
  37. import org.lwjgl.util.glu.GLU;
  38.  
  39. class ImageCanvas extends GLCanvas {
  40. public ImageCanvas(Composite parent, int style, GLData data) {
  41. super(parent, style, data);
  42. // TODO Auto-generated constructor stub
  43. }
  44.  
  45. private final Point imagePosition = new Point(0, 0);
  46. private ImageData bufferedImage = null;
  47. private IntBuffer buffer = null;
  48.  
  49. public void setBufferedImage(ImageData bi) {
  50. bufferedImage = bi;// ImageHelper.toBufferedImage(bufferedImage);//.getScaledInstance(50, 50, java.awt.Image.SCALE_DEFAULT));
  51.  
  52. int w = bufferedImage.width;
  53. int h = bufferedImage.height;
  54. buffer = ByteBuffer.allocateDirect(w * h * 4).order(ByteOrder.nativeOrder()).asIntBuffer();
  55. updateImageBuffer();
  56. }
  57.  
  58. private void updateImageBuffer() {
  59. // ImageData fullImageData = makeTransparent(bufferedImage, 0);
  60. BufferedImage bi = Snippet.convertToAWT(bufferedImage);
  61. BufferedImage result = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
  62. Graphics2D g = result.createGraphics();
  63. g.scale(1, -1);
  64. g.drawImage(bi, 0, -bi.getHeight(), null);
  65. g.dispose();
  66. WritableRaster wr = result.getData().createCompatibleWritableRaster();
  67. for (int x = 0; x < result.getWidth(); x++) {
  68. for (int y = 0; y < result.getHeight(); y++) {
  69. int arx[] = new int[4];
  70. int zero[] = new int[4];
  71. zero = result.getData().getPixel(x, y, arx);
  72. arx[0] = zero[2];
  73. arx[1] = zero[1];
  74. arx[2] = zero[0];
  75. // arx[3]=255;
  76. wr.setPixel(x, y, arx);
  77. }
  78. }
  79. result = new BufferedImage(result.getColorModel(), wr, result.isAlphaPremultiplied(), null);
  80. Raster r = result.getData();
  81. DataBuffer db = r.getDataBuffer();
  82. DataBufferInt dataBufferInt = (DataBufferInt) db;
  83. buffer.put(dataBufferInt.getData());
  84. buffer.rewind();
  85. }
  86.  
  87. public void setImagePosition(int x, int y) {
  88. imagePosition.x = x;
  89. imagePosition.y = y;
  90. }
  91.  
  92. public void render() {
  93. setCurrent();
  94. try {
  95. GLContext.useContext(this);
  96. } catch (LWJGLException e) {
  97. e.printStackTrace();
  98. }
  99.  
  100.  
  101. GL11.glMatrixMode(GL11.GL_PROJECTION);
  102. GL11.glLoadIdentity();
  103. GL11.glOrtho(0, getBounds().width, 0, getBounds().width, -2, 2);
  104. GL11.glMatrixMode(GL11.GL_MODELVIEW);
  105. GL11.glLoadIdentity();
  106.  
  107. GL11.glClearColor(255, 255, 255, 255);
  108. GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
  109.  
  110. int w = this.bufferedImage.width;
  111. int h = this.bufferedImage.height;
  112. int format = GL11.GL_RGBA;
  113. int type = GL11.GL_UNSIGNED_BYTE;
  114. GL11.glEnable(GL11.GL_BLEND);
  115. GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
  116.  
  117. GL11.glRasterPos4i(imagePosition.x, imagePosition.y, 0, 1);
  118. GL11.glDrawPixels(w, h, format, type, buffer);
  119. swapBuffers();
  120.  
  121. GC g = new GC(this);
  122. g.drawText("XXXXXXXXXXXXXX", 10, 10);
  123. g.dispose();
  124.  
  125. }
  126. }
  127.  
  128. public class Snippet {
  129. public static void main(String[] arguments) {
  130. SwingUtilities.invokeLater(new Runnable() {
  131.  
  132. @Override
  133. public void run() {
  134. try {
  135. new Snippet();
  136. } catch (LWJGLException e) {
  137. e.printStackTrace();
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. });
  143.  
  144. }
  145.  
  146. public Snippet() throws LWJGLException, IOException {
  147. final Display display = new Display();
  148. final Shell shell = new Shell(display);
  149. shell.setLayout(new FillLayout());
  150. shell.setText("OpenGl Test");
  151.  
  152. GLData data = new GLData();
  153. data.doubleBuffer = true;
  154.  
  155. final ImageCanvas canvas = new ImageCanvas(shell, SWT.NONE, data);
  156. final ImageData bufferedImage = loadImage("icons/sample.gif");
  157. final Canvas c1 = new Canvas(shell, SWT.NONE);
  158. c1.addListener(SWT.Paint, new Listener() {
  159.  
  160. @Override
  161. public void handleEvent(Event event) {
  162. GC g = new GC(c1);
  163.  
  164. GC gc = new GC(canvas);
  165. Image image = new Image(canvas.getDisplay(), canvas.getBounds().width, canvas.getBounds().height);
  166. gc.copyArea(image, 0, 0);
  167. gc.dispose();
  168.  
  169. ImageData idata = image.getImageData();
  170.  
  171. image.dispose();
  172. if (idata != null) {
  173. System.out.println("super" + idata.width);
  174. // g.drawImage(new Image(display, canvas.getGLData().shareContext.getBackgroundImage().getImageData()), 0, 0);
  175. g.drawImage(new Image(display, idata), 0, 0);
  176. }
  177. g.dispose();
  178. }
  179. });
  180. canvas.setBufferedImage(bufferedImage);
  181. canvas.addListener(SWT.Resize, new Listener() {
  182. @Override
  183. public void handleEvent(Event event) {
  184. org.eclipse.swt.graphics.Rectangle bounds = canvas.getBounds();
  185. float fAspect = (float) bounds.width / (float) bounds.height;
  186. canvas.setCurrent();
  187. try {
  188. GLContext.useContext(canvas);
  189. } catch (LWJGLException e) {
  190. e.printStackTrace();
  191. }
  192. GL11.glViewport(0, 0, bounds.width, bounds.height);
  193. GL11.glMatrixMode(GL11.GL_PROJECTION);
  194. GL11.glLoadIdentity();
  195. GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f);
  196. GL11.glMatrixMode(GL11.GL_MODELVIEW);
  197. GL11.glLoadIdentity();
  198. }
  199. });
  200. display.asyncExec(new Runnable() {
  201. double a = 0;
  202.  
  203. @Override
  204. public void run() {
  205. if (!canvas.isDisposed()) {
  206. int cx = canvas.getBounds().width / 2 - bufferedImage.width / 2;
  207. int cy = canvas.getBounds().height / 2 - bufferedImage.height / 2;
  208. int d = 50;
  209. double x = cx + d * Math.cos(a);
  210. double y = cy + d * Math.sin(a);
  211. canvas.setImagePosition((int) x, (int) y);
  212. a += 0.1;
  213. // System.out.println("Foo?=");
  214. canvas.render();
  215. try {
  216. Thread.sleep(100);
  217. } catch (InterruptedException e) {
  218. Thread.currentThread().interrupt();
  219. }
  220. display.asyncExec(this);
  221. }
  222. }
  223. });
  224.  
  225. shell.pack();
  226. shell.layout();
  227. shell.open();
  228. while (!shell.isDisposed()) {
  229. if (!display.readAndDispatch())
  230. display.sleep();
  231. }
  232. display.dispose();
  233. }
  234.  
  235. public static ImageData loadImage(String fileName){
  236. final ImageData[] imageDatas = new ImageLoader().load(fileName);
  237. return imageDatas[0];
  238. }
  239. public static BufferedImage convertToAWT(ImageData data) {
  240. ColorModel colorModel = null;
  241. PaletteData palette = data.palette;
  242. if (palette.isDirect) {
  243. colorModel = new DirectColorModel(data.depth, palette.redMask, palette.greenMask, palette.blueMask);
  244. BufferedImage bufferedImage = new BufferedImage(colorModel,
  245. colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
  246. WritableRaster raster = bufferedImage.getRaster();
  247. int[] pixelArray = new int[3];
  248. for (int y = 0; y < data.height; y++) {
  249. for (int x = 0; x < data.width; x++) {
  250. int pixel = data.getPixel(x, y);
  251. RGB rgb = palette.getRGB(pixel);
  252. pixelArray[0] = rgb.red;
  253. pixelArray[1] = rgb.green;
  254. pixelArray[2] = rgb.blue;
  255. raster.setPixels(x, y, 1, 1, pixelArray);
  256. }
  257. }
  258. return bufferedImage;
  259. } else {
  260. RGB[] rgbs = palette.getRGBs();
  261. byte[] red = new byte[rgbs.length];
  262. byte[] green = new byte[rgbs.length];
  263. byte[] blue = new byte[rgbs.length];
  264. for (int i = 0; i < rgbs.length; i++) {
  265. RGB rgb = rgbs[i];
  266. red[i] = (byte) rgb.red;
  267. green[i] = (byte) rgb.green;
  268. blue[i] = (byte) rgb.blue;
  269. }
  270. if (data.transparentPixel != -1) {
  271. colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue, data.transparentPixel);
  272. } else {
  273. colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue);
  274. }
  275. BufferedImage bufferedImage = new BufferedImage(colorModel,
  276. colorModel.createCompatibleWritableRaster(data.width, data.height), false, null);
  277. WritableRaster raster = bufferedImage.getRaster();
  278. int[] pixelArray = new int[1];
  279. for (int y = 0; y < data.height; y++) {
  280. for (int x = 0; x < data.width; x++) {
  281. int pixel = data.getPixel(x, y);
  282. pixelArray[0] = pixel;
  283. raster.setPixel(x, y, pixelArray);
  284. }
  285. }
  286. return bufferedImage;
  287. }
  288. }
  289.  
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement