⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text2d.java

📁 JAVA3D矩陈的相关类
💻 JAVA
字号:
/* * $RCSfile: Text2D.java,v $ * * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistribution of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. * * - Redistribution in binary form must reproduce the above copyright *   notice, this list of conditions and the following disclaimer in *   the documentation and/or other materials provided with the *   distribution. * * Neither the name of Sun Microsystems, Inc. or the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * This software is provided "AS IS," without a warranty of any * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or * intended for use in the design, construction, operation or * maintenance of any nuclear facility. * * $Revision: 1.4 $ * $Date: 2007/02/09 17:20:21 $ * $State: Exp $ */package com.sun.j3d.utils.geometry;import java.awt.image.BufferedImage;import java.awt.image.WritableRaster;import java.awt.image.DataBufferInt;import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Toolkit;import java.util.Hashtable;import javax.media.j3d.*;import javax.vecmath.*;/** * A Text2D object is a representation of a string as a texture mapped * rectangle.  The texture for the rectangle shows the string as rendered in * the specified color with a transparent background.  The appearance of the * characters is specified using the font indicated by the font name, size * and style (see java.awt.Font).  The approximate height of the rendered * string will be the font size times the rectangle scale factor, which has a * default value of 1/256.  For example, a 12 point font will produce * characters that are about 12/256 = 0.047 meters tall. The lower left * corner of the rectangle is located at (0,0,0) with the height * extending along the positive y-axis and the width extending along the * positive x-axis. */public class Text2D extends Shape3D {    // This table caches FontMetrics objects to avoid the huge cost    // of re-retrieving metrics for a font we've already seen.    private static Hashtable metricsTable = new Hashtable();     float rectangleScaleFactor = 1f/256f;    Color3f   color = new Color3f();    String    fontName;    int       fontSize, fontStyle;    String text;    /**     * Creates a Shape3D object which holds a     * rectangle that is texture-mapped with an image that has     * the specified text written with the specified font     * parameters.     *     * @param text The string to be written into the texture map.     * @param color The color of the text string.     * @param fontName The name of the Java font to be used for     *  the text string.     * @param fontSize The size of the Java font to be used.     * @param fontStyle The style of the Java font to be used.     */    public Text2D(String text, Color3f color, String fontName,		  int fontSize, int fontStyle) {        this.color.set(color);        this.fontName = fontName;        this.fontSize = fontSize;        this.fontStyle = fontStyle;	this.text = text;        updateText2D(text, color, fontName, fontSize, fontStyle);    }    /*     * Changes text of this Text2D to 'text'. All other     * parameters (color, fontName, fontSize, fontStyle     * remain the same.     * @param text The string to be set.     */    public void setString(String text){	this.text = text;		Texture tex = getAppearance().getTexture();	int width = tex.getWidth();	int height = tex.getHeight();	        ImageComponent imageComponent = setupImage(text, color, fontName,                                          fontSize, fontStyle);	if ((imageComponent.getWidth() == width) &&	    (imageComponent.getHeight() == height)) {	    tex.setImage(0, imageComponent);	} else {	    Texture2D newTex = setupTexture(imageComponent);	    // Copy texture attributes except those related to	    // mipmap since Texture only set base imageComponent. 	    newTex.setBoundaryModeS(tex.getBoundaryModeS());	    newTex.setBoundaryModeT(tex.getBoundaryModeT());	    newTex.setMinFilter(tex.getMinFilter());	    newTex.setMagFilter(tex.getMagFilter());      	    newTex.setEnable(tex.getEnable());	    newTex.setAnisotropicFilterMode(tex.getAnisotropicFilterMode());	    newTex.setAnisotropicFilterDegree(tex.getAnisotropicFilterDegree());	    int pcount = tex.getFilter4FuncPointsCount();	    if (pcount > 0) {		float weights[] = new float[pcount];		tex.getFilter4Func(weights);		newTex.setFilter4Func(weights);	    }	    Color4f c = new Color4f();	    tex.getBoundaryColor(c);	    newTex.setBoundaryColor(c);      	    newTex.setUserData(tex.getUserData());	    getAppearance().setTexture(newTex);	}    }    private void updateText2D(String text, Color3f color, String fontName,                  int fontSize, int fontStyle) {        ImageComponent imageComponent = setupImage(text, color, fontName,                                          fontSize, fontStyle);        Texture2D t2d = setupTexture(imageComponent);	QuadArray rect = setupGeometry(imageComponent.getWidth(), 		imageComponent.getHeight());	setGeometry(rect);    	Appearance appearance = setupAppearance(t2d);	setAppearance(appearance);    }    /**     * Sets the scale factor used in converting the image width/height     * to width/height values in 3D.     *     * @param newScaleFactor The new scale factor.     */    public void setRectangleScaleFactor(float newScaleFactor) {	rectangleScaleFactor = newScaleFactor;	updateText2D(text, color, fontName, fontSize, fontStyle);    }    /**     * Gets the current scale factor being used in converting the image     * width/height to width/height values in 3D.     *     * @return The current scale factor.     */    public float getRectangleScaleFactor() {	return rectangleScaleFactor;    }        /**     * Create the ImageComponent and Texture object.     */    private Texture2D setupTexture(ImageComponent imageComponent) {	Texture2D t2d = new Texture2D(Texture2D.BASE_LEVEL,				      Texture.RGBA,				      imageComponent.getWidth(),				      imageComponent.getHeight());	t2d.setMinFilter(t2d.BASE_LEVEL_LINEAR);	t2d.setMagFilter(t2d.BASE_LEVEL_LINEAR);	t2d.setImage(0, imageComponent);	t2d.setEnable(true);	t2d.setCapability(Texture.ALLOW_IMAGE_WRITE);	t2d.setCapability(Texture.ALLOW_SIZE_READ);	t2d.setCapability(Texture.ALLOW_ENABLE_READ);	t2d.setCapability(Texture.ALLOW_BOUNDARY_MODE_READ);	t2d.setCapability(Texture.ALLOW_FILTER_READ); 	t2d.setCapability(Texture.ALLOW_BOUNDARY_COLOR_READ); 	t2d.setCapability(Texture.ALLOW_ANISOTROPIC_FILTER_READ); 	t2d.setCapability(Texture.ALLOW_FILTER4_READ);	return t2d;    }    /**     * Creates a ImageComponent2D of the correct dimensions for the     * given font attributes.  Draw the given text into the image in     * the given color.  The background of the image is transparent     * (alpha = 0).     */    private ImageComponent setupImage(String text, Color3f color,				     String fontName,				     int fontSize, int fontStyle) {	Toolkit toolkit = Toolkit.getDefaultToolkit();	Font font = new java.awt.Font(fontName, fontStyle, fontSize);	FontMetrics metrics;	if ((metrics = (FontMetrics)metricsTable.get(font)) == null) {	    metrics = toolkit.getFontMetrics(font);	    metricsTable.put(font, metrics);	}	int width = metrics.stringWidth(text);	int descent = metrics.getMaxDescent();	int ascent = metrics.getMaxAscent();	int leading = metrics.getLeading();	int height = descent + ascent;	// Need to make width/height powers of 2 because of Java3d texture	// size restrictions	int pow = 1;	for (int i = 1; i < 32; ++i) {	    pow *= 2;	    if (width <= pow)		break;	}	width = Math.max (width, pow);	pow = 1;	for (int i = 1; i < 32; ++i) {	    pow *= 2;	    if (height <= pow)		break;	}	height = Math.max (height, pow);	// For now, jdk 1.2 only handles ARGB format, not the RGBA we want	BufferedImage bImage = new BufferedImage(width, height,						 BufferedImage.TYPE_INT_ARGB);	Graphics offscreenGraphics = bImage.createGraphics();	// First, erase the background to the text panel - set alpha to 0	Color myFill = new Color(0f, 0f, 0f, 0f);	offscreenGraphics.setColor(myFill);	offscreenGraphics.fillRect(0, 0, width, height);	// Next, set desired text properties (font, color) and draw String	offscreenGraphics.setFont(font);	Color myTextColor = new Color(color.x, color.y, color.z, 1f);	offscreenGraphics.setColor(myTextColor);	offscreenGraphics.drawString(text, 0, height - descent);	ImageComponent imageComponent =	    new ImageComponent2D(ImageComponent.FORMAT_RGBA, 				 bImage);	imageComponent.setCapability(ImageComponent.ALLOW_SIZE_READ);	return imageComponent;    }    /**     * Creates a rectangle of the given width and height and sets up     * texture coordinates to map the text image onto the whole surface     * of the rectangle (the rectangle is the same size as the text image)     */    private QuadArray setupGeometry(int width, int height) {	float zPosition = 0f;	float rectWidth = (float)width * rectangleScaleFactor;	float rectHeight = (float)height * rectangleScaleFactor;	float[] verts1 = {	    rectWidth, 0f, zPosition,	    rectWidth, rectHeight, zPosition,	    0f, rectHeight, zPosition,	    0f, 0f, zPosition	};	float[] texCoords = {	    0f, -1f,	    0f, 0f,	    (-1f), 0f,	    (-1f), -1f	};		QuadArray rect = new QuadArray(4, QuadArray.COORDINATES |				       QuadArray.TEXTURE_COORDINATE_2);	rect.setCoordinates(0, verts1);	rect.setTextureCoordinates(0, 0, texCoords);		return rect;    }    /**     * Creates Appearance for this Shape3D.  This sets transparency     * for the object (we want the text to be "floating" in space,     * so only the text itself should be non-transparent.  Also, the     * appearance disables lighting for the object; the text will     * simply be colored, not lit.     */    private Appearance setupAppearance(Texture2D t2d) {	TransparencyAttributes transp = new TransparencyAttributes();	transp.setTransparencyMode(TransparencyAttributes.BLENDED);	transp.setTransparency(0f);	Appearance appearance = new Appearance();	appearance.setTransparencyAttributes(transp);	appearance.setTexture(t2d);	Material m = new Material();	m.setLightingEnable(false);	appearance.setMaterial(m);		return appearance;    }    /**     * Returns the text string     *     * @since Java 3D 1.2.1     */    public String getString() {	return text;    }    /**     * Returns the color of the text     *     * @since Java 3D 1.2.1     */    public Color3f getColor() {	return color;    }    /**     * Returns the font     *     * @since Java 3D 1.2.1     */    public String getFontName() {	return fontName;    }    /**     * Returns the font size     *     * @since Java 3D 1.2.1     */    public int getFontSize() {	return fontSize;    }        /**     * Returns the font style     *     * @since Java 3D 1.2.1     */    public int getFontStyle() {	return fontStyle;    }    }

⌨️ 快捷键说明

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