All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.chaostocosmos.chaosgraph.swt2d.Graphics2DRenderer Maven / Gradle / Ivy

Go to download

This library contributes to making charts on AWT/Swing/SWT components. It can be used for AWT/Swing applications and Eclipse SWT (Standard Widget Toolkit) applications. If you would try to build a service of RAP dashboard web application, this library will provide great UX experience and excellent interactive functionality to the service for users.

The newest version!
package org.chaostocosmos.chaosgraph.swt2d;
/*
 * -----------------------------------------------------------------------------
 * (c) Copyright IBM Corp. 2004 All rights reserved.
 * 
 * The sample program(s) is/are owned by International Business Machines
 * Corporation or one of its subsidiaries ("IBM") and is/are copyrighted and
 * licensed, not sold.
 * 
 * You may copy, modify, and distribute this/these sample program(s) in any form
 * without payment to IBM, for any purpose including developing, using,
 * marketing or distributing programs that include or are derivative works of
 * the sample program(s).
 * 
 * The sample program(s) is/are provided to you on an "AS IS" basis, without
 * warranty of any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, EITHER
 * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some jurisdictions do
 * not allow for the exclusion or limitation of implied warranties, so the above
 * limitations or exclusions may not apply to you. IBM shall not be liable for
 * any damages you suffer as a result of using, modifying or distributing the
 * sample program(s) or its/their derivatives.
 * 
 * Each copy of any portion of this/these sample program(s) or any derivative
 * work, must include the above copyright notice and disclaimer of warranty.
 * 
 * -----------------------------------------------------------------------------
 */

/**
 * Helper class allowing the use of Java2D on SWT or Draw2D graphical context.
 * 
 * @author Yannick Saillet
 */
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;

/**
 * 
 * Graphics2DRenderer
 * 
 * This class contribute that AWT graph image can be rendered on SWT component
 *
 * @author Kooin-Shin
 * 2020. 9. 15.
 */
public class Graphics2DRenderer {
	private static final PaletteData PALETTE_DATA = new PaletteData(0xFF0000, 0xFF00, 0xFF);
	private BufferedImage awtImage;
	private Image swtImage;
	private ImageData swtImageData;
	private int[] awtPixels;
	/** RGB value to use as transparent color */
	private static final int TRANSPARENT_COLOR = 0x123456;
	Canvas canvas;
	
	public Graphics2DRenderer(Canvas canvas) {
		this.canvas = canvas;
	}

	/**
	 * Prepare to render on a SWT graphics context.
	 */
	public void prepareRendering(GC gc) {
		org.eclipse.swt.graphics.Rectangle clip = gc.getClipping();
		//System.out.println(clip.toString());
		prepareRendering(clip.x, clip.y, clip.width, clip.height);
	}

	/**
	 * Prepare to render on a Draw2D graphics context.
	 */
	public void prepareRendering(org.eclipse.draw2d.Graphics graphics) {
		//org.eclipse.draw2d.geometry.Rectangle clip = graphics.getClip(new org.eclipse.draw2d.geometry.Rectangle());
		int x = this.canvas.getClientArea().x;
		int y = this.canvas.getClientArea().y;
		int w = this.canvas.getClientArea().width;
		int h = this.canvas.getClientArea().height;
		prepareRendering(x, y, w, h);
	} 

	/**
	 * Prepare the AWT offscreen image for the rendering of the rectangular
	 * region given as parameter.
	 */
	private void prepareRendering(int clipX, int clipY, int clipW, int clipH) {
		if(clipW > 0 && clipH > 0) {
			checkOffScreenImages(clipW, clipH);
			java.awt.Graphics awtGraphics = awtImage.getGraphics();
			awtGraphics.setColor(new java.awt.Color(TRANSPARENT_COLOR));
			awtGraphics.fillRect(clipX, clipY, clipW, clipH);
		}
	}

	/**
	 * Returns the Graphics2D context to use.
	 */
	public Graphics2D getGraphics2D() {
		if (awtImage == null) {
			return null;
		}
		return (Graphics2D) awtImage.getGraphics();
	}

	/**
	 * Complete the rendering by flushing the 2D renderer on a SWT graphical
	 * context.
	 */
	public void render(GC gc) {
		if (awtImage == null) {
			return;
		}
		///org.eclipse.swt.graphics.Rectangle clip = gc.getClipping();
		int x = this.canvas.getClientArea().x;
		int y = this.canvas.getClientArea().y;
		int width = this.canvas.getClientArea().width;
		int height = this.canvas.getClientArea().height;
		transferPixels(x, y, width, height);
		gc.drawImage(swtImage, x, y, width, height, x, y, width, height);
	}

	/**
	 * Complete the rendering by flushing the 2D renderer on a Draw2D graphical
	 * context.
	 */
	public void render(org.eclipse.draw2d.Graphics graphics) {
		if (awtImage == null) {
			return;
		}
		/*
		org.eclipse.draw2d.geometry.Rectangle clip = graphics.getClip(new org.eclipse.draw2d.geometry.Rectangle());		
		transferPixels(clip.x, clip.y, clip.width, clip.height);
		graphics.drawImage(swtImage, clip.x, clip.y, clip.width, clip.height, clip.x, clip.y, clip.width, clip.height);
		*/
		///org.eclipse.swt.graphics.Rectangle clip = gc.getClipping();
		int x = this.canvas.getClientArea().x;
		int y = this.canvas.getClientArea().y;
		int width = this.canvas.getClientArea().width;
		int height = this.canvas.getClientArea().height;
		transferPixels(x, y, width, height);
		graphics.drawImage(swtImage, x, y, width, height, x, y, width, height);
	}

	/**
	 * Transfer a rectangular region from the AWT image to the SWT image.
	 */
	private void transferPixels(int clipX, int clipY, int clipW, int clipH) {
		//System.out.println(clipX+"   "+clipY+"   "+clipW+"   "+clipH);
		//System.out.println("IMAGE: "+awtImage.getWidth()+"   "+awtImage.getHeight());
		int step = swtImageData.depth / 8;
		byte[] data = swtImageData.data;
		awtImage.getRGB(clipX, clipY, clipW, clipH, awtPixels, 0, clipW);
		for (int i = 0; i < clipH; i++) {
			int idx = (clipY + i) * swtImageData.bytesPerLine + clipX * step;
			for (int j = 0; j < clipW; j++) {
				int rgb = awtPixels[j + i * clipW];
				for (int k = swtImageData.depth - 8; k >= 0; k -= 8) {
					data[idx++] = (byte) ((rgb >> k) & 0xFF);
				}	
			}
		}
		if (swtImage != null) {
			swtImage.dispose();
		}
		swtImage = new Image(Display.getDefault(), swtImageData);
	}

	/**
	 * Dispose the resources attached to this 2D renderer.
	 */
	public void dispose() {
		if (awtImage != null)
			awtImage.flush();
		if (swtImage != null)
			swtImage.dispose();
		awtImage = null;
		swtImageData = null;
		awtPixels = null;
	}

	/**
	 * Ensure that the offscreen images are initialized and are at least as
	 * large as the size given as parameter.
	 */
	private void checkOffScreenImages(int width, int height) {
		int currentImageWidth = 0;
		int currentImageHeight = 0;
		if (swtImage != null) {
			currentImageWidth = swtImage.getImageData().width;
			currentImageHeight = swtImage.getImageData().height;
		}
		if (width > currentImageWidth || height > currentImageHeight) {
			dispose();
			width = Math.max(width, currentImageWidth);
			height = Math.max(height, currentImageHeight);
			awtImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			swtImageData = new ImageData(width, height, 24, PALETTE_DATA);
			swtImageData.transparentPixel = TRANSPARENT_COLOR;
			awtPixels = new int[width * height];
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy