vgasurface.java

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

JAVA
124
字号
/*
 * $Id: VGASurface.java,v 1.3 2004/01/04 15:40:00 epr Exp $
 */
package org.jnode.driver.video.vga;

import java.awt.Color;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.Raster;

import org.jnode.awt.util.AwtUtils;
import org.jnode.awt.util.BitmapGraphics;
import org.jnode.driver.video.FrameBufferConfiguration;
import org.jnode.driver.video.Surface;
import org.jnode.driver.video.util.AbstractSurface;
import org.jnode.driver.video.vgahw.*;
import org.jnode.system.ResourceNotFreeException;

/**
 * @author epr
 */
public class VGASurface extends AbstractSurface implements Surface, VgaConstants {

	private final VGADriver driver;
	private final StandardVGA vga;
	private final StandardVGAIO vgaIO;
	private final IndexColorModel model;
	private final BitmapGraphics bitmapGraphics;

	public VGASurface(VGADriver driver) throws ResourceNotFreeException {
		super(640, 480);
		this.vga = new StandardVGA(driver.getDevice(), VGADriver.COLOR_MODEL);
		this.vgaIO = new StandardVGAIO(driver.getDevice(), vga.getVgaMem());
		this.driver = driver;
		this.model = VGADriver.COLOR_MODEL;
		this.bitmapGraphics = new VGABitmapGraphics(vga, vgaIO, width, height, 0, width / 8);
	}

	/**
	 * Open the given configuration
	 * @param config
	 */
	public synchronized void open(FrameBufferConfiguration config) {
		vga.startService(vgaIO);
	}

	/**
	 * Close the VGA surface
	 */
	public synchronized void close() {
		vgaIO.setGRAF(3, LOGOP_NONE);
		vga.stopService(vgaIO);
		vga.release();
		vgaIO.release();
		driver.close(this);
	}

	/**
	 * Draw the given shape
	 * @param shape
	 * @param color
	 * @param mode
	 */
	public synchronized void draw(Shape shape, Shape clip, AffineTransform tx, Color color, int mode) {
		vgaIO.setGRAF(0, convertColor(color));
		vgaIO.setGRAF(3, (mode == PAINT_MODE) ? LOGOP_NONE : LOGOP_XOR);
		draw(shape, clip, tx, 0, mode);
	}

	/**
	 * 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 (bgColor != null) {
			bitmapGraphics.drawImage(src, srcX, srcY, x, y, w, h, convertColor(bgColor));
		} else {
			bitmapGraphics.drawImage(src, srcX, srcY, x, y, w, h);
		}
	}

	/**
	 * Unused in this class
	 * @see org.jnode.driver.video.util.AbstractSurface#convertColor(java.awt.Color)
	 */
	protected final int convertColor(Color color) {
		return AwtUtils.getClosestColorIndex(model, color.getRGB());
	}

	/**
	 * @see org.jnode.driver.video.util.AbstractSurface#drawPixel(int, int, int, int)
	 */
	protected void drawPixel(int x, int y, int color, int mode) {
		bitmapGraphics.drawPixels(x, y, 1, color, mode);
	}
	/**
	 * @see org.jnode.driver.video.util.AbstractSurface#drawLine(int, int, int, int, int, int)
	 */
	protected void drawLine(int x1, int y1, int x2, int y2, int color, int mode) {
		if (y1 == y2) {
			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()
	 */
	public ColorModel getColorModel() {
		return model;
	}

}

⌨️ 快捷键说明

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