jnodebufferedimagegraphics.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 169 行

JAVA
169
字号
/*
 * $Id: JNodeBufferedImageGraphics.java,v 1.2 2003/12/20 10:36:05 epr Exp $
 */
package org.jnode.awt.image;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.SinglePixelPackedSampleModel;
import java.awt.image.WritableRaster;

import org.apache.log4j.Logger;
import org.jnode.awt.util.AbstractSurfaceGraphics;
import org.jnode.awt.util.BitmapGraphics;
import org.jnode.driver.video.Surface;
import org.jnode.driver.video.util.AbstractSurface;

/**
 * @author epr
 */
public class JNodeBufferedImageGraphics extends AbstractSurfaceGraphics {

	private final BufferedImage image;

	/**
	 * @param src
	 */
	public JNodeBufferedImageGraphics(JNodeBufferedImageGraphics src) {
		super(src);
		this.image = src.image;
	}

	/**
	 * @param image
	 */
	public JNodeBufferedImageGraphics(BufferedImage image) {
		super(new BufferedImageSurface(image), image.getWidth(), image.getHeight());
		this.image = image;
	}

	/**
	 * @see java.awt.Graphics#create()
	 * @return The graphics
	 */
	public Graphics create() {
		return new JNodeBufferedImageGraphics(this);
	}

	/**
	 * @see java.awt.Graphics2D#getDeviceConfiguration()
	 * @return The configuration
	 */
	public GraphicsConfiguration getDeviceConfiguration() {
		// TODO Auto-generated method stub
		return null;
	}

	private static class BufferedImageSurface extends AbstractSurface {

		/** My logger */
		private final Logger log = Logger.getLogger(getClass());
		private final BufferedImage sImage;
		private final BitmapGraphics bitmapGraphics;
		private final ColorModel model;

		public BufferedImageSurface(BufferedImage image) {
			super(image.getWidth(), image.getHeight());
			this.model = image.getColorModel();
			this.sImage = image;
			final Raster raster = image.getRaster();
			final DataBuffer dataBuffer = raster.getDataBuffer();
			final SampleModel sampleModel = raster.getSampleModel();
			if (sampleModel instanceof SinglePixelPackedSampleModel) {
				final SinglePixelPackedSampleModel sppSM = (SinglePixelPackedSampleModel) sampleModel;
				final int dataType = dataBuffer.getDataType();
				final int dataTypeSize = DataBuffer.getDataTypeSize(dataType);
				log.debug("dataTypeSize=" + dataTypeSize + ", dataType=" + dataType);
				this.bitmapGraphics = BitmapGraphics.createInstance(dataBuffer, width, height, sppSM.getScanlineStride() * dataTypeSize / 8);
			} else {
				this.bitmapGraphics = null;
			}
		}

		/**
		 * @param color
		 * @return The color value
		 */
		protected int convertColor(Color color) {
			// TODO Make dependent on BufferedImage type
			return color.getRGB();
		}

		/**
		 * Draw a pixel
		 * @param x
		 * @param y
		 * @param color
		 * @param mode
		 */
		protected void drawPixel(int x, int y, int color, int mode) {
			if (bitmapGraphics != null) {
				bitmapGraphics.drawPixels(x, y, 1, color, mode);
			} else {
				if (mode == Surface.PAINT_MODE) {
					sImage.setRGB(x, y, color);
				} else {
					sImage.setRGB(x, y, sImage.getRGB(x, y) ^ color);
				}
			}
		}

		/**
		 * Draw an image to this surface
		 * @param src
		 * @param srcX
		 * @param srcY
		 * @param x The upper left x coordinate 
		 * @param y The upper left y coordinate
		 * @param w
		 * @param h
		 * @param bgColor
		 */
		public void drawCompatibleRaster(Raster src, int srcX, int srcY, int x, int y, int w, int h, Color bgColor) {
			if (bitmapGraphics != null) {
				if (bgColor != null) {
					bitmapGraphics.drawImage(src, srcX, srcY, x, y, w, h, convertColor(bgColor));
				} else {
					bitmapGraphics.drawImage(src, srcX, srcY, x, y, w, h);
				}
			} else {
				final Object pData;
				final WritableRaster r = sImage.getRaster();
				pData = src.getDataElements(srcX, srcY, w, h, null);
				r.setDataElements(x, y, w, h, pData);
			}
		}

		/**
		 * Draw a line
		 * @param x1
		 * @param y1
		 * @param x2
		 * @param y2
		 * @param color
		 * @param mode
		 */
		protected void drawLine(int x1, int y1, int x2, int y2, int color, int mode) {
			if ((y1 == y2) && (bitmapGraphics != null)) {
				bitmapGraphics.drawLine(Math.min(x1, x2), y1, Math.abs(x2 - x1) + 1, color, mode);
			} else {
				super.drawLine(x1, y1, x2, y2, color, mode);
			}
		}

		/**
		 * @see org.jnode.driver.video.Surface#getColorModel()
		 * @return the color model
		 */
		public ColorModel getColorModel() {
			return model;
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?