/*********************************************************************** * mt4j Copyright (c) 2008 - 2009 C.Ruff, Fraunhofer-Gesellschaft All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * ***********************************************************************/ package org.mt4j.components.visibleComponents.font; import javax.media.opengl.GL; import org.mt4j.components.bounds.IBoundingShape; import org.mt4j.components.visibleComponents.shapes.MTRectangle; import org.mt4j.util.MT4jSettings; import org.mt4j.util.math.Vertex; import org.mt4j.util.opengl.GLTexture; import org.mt4j.util.opengl.GLTexture.EXPANSION_FILTER; import org.mt4j.util.opengl.GLTexture.SHRINKAGE_FILTER; import org.mt4j.util.opengl.GLTexture.WRAP_MODE; import processing.core.PApplet; import processing.core.PImage; /** * The Class BitmapFontCharacter. * @author Christopher Ruff */ public class BitmapFontCharacter extends MTRectangle implements IFontCharacter { /** The unicode. */ private String unicode; /** The horizontal dist. */ private int horizontalDist; /** The left offset. */ private int leftOffset; /** * Instantiates a new bitmap font character. * * @param texture the texture * @param applet the applet * @param unicode the unicode * @param leftOffset the left offset * @param topOffset the top offset * @param horizontalAdvance the horizontal advance */ public BitmapFontCharacter(PImage texture, PApplet applet, String unicode, int leftOffset, int topOffset, int horizontalAdvance) { super(new Vertex(leftOffset, topOffset,0), texture.width, texture.height, applet); //hm..this is for the card loading, because //when we init gl texture in other thread it breaks.. // this.setUseDirectGL(false); // this.setUseDirectGL(true); this.setTexture(texture); this.setTextureEnabled(true); this.leftOffset = leftOffset; this.horizontalDist = horizontalAdvance; this.unicode = unicode; this.setNoStroke(true); this.setPickable(false); // this.setFillDrawMode(GL.GL_QUADS);//FIXME TEST if (MT4jSettings.getInstance().isOpenGlMode()){ //Set the texture to be non-repeating but clamping to the border to avoid artefacts PImage tex = this.getTexture(); if (tex instanceof GLTexture) { GLTexture glTex = (GLTexture) tex; // glTex.setWrap(GL.GL_CLAMP, GL.GL_CLAMP); // glTex.setWrap(GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); glTex.setWrapMode(WRAP_MODE.CLAMP_TO_EDGE, WRAP_MODE.CLAMP_TO_EDGE); // glTex.setFilter(SHRINKAGE_FILTER.Trilinear, EXPANSION_FILTER.Bilinear); glTex.setFilter(SHRINKAGE_FILTER.BilinearNoMipMaps, EXPANSION_FILTER.Bilinear); // glTex.setFilter(SHRINKAGE_FILTER.NearestNeighborNoMipMaps, EXPANSION_FILTER.NearestNeighbor); // glTex.setFilter(SHRINKAGE_FILTER.BilinearNoMipMaps, EXPANSION_FILTER.NearestNeighbor); } } } /* (non-Javadoc) * @see org.mt4j.components.visibleComponents.font.IFontCharacter#drawComponent(javax.media.opengl.GL) */ //@Override public void drawComponent(GL gl) { //FIXME // this.drawPureGl(gl); // /* if (MT4jSettings.getInstance().isOpenGlMode()){ if (this.isUseDisplayList() && this.getGeometryInfo().getDisplayListIDs()[0] != -1){ gl.glCallList(this.getGeometryInfo().getDisplayListIDs()[0]); // gl.glCallList(this.getGeometryInfo().getDisplayListIDs()[1]); //Outline rectangle }else{ this.drawPureGl(gl); } } // */ } @Override protected void setDefaultGestureActions() { //no gestures } /* (non-Javadoc) * @see org.mt4j.components.visibleComponents.shapes.MTRectangle#computeDefaultBounds() */ //@Override protected IBoundingShape computeDefaultBounds() { //We assume that font characters never get picked or anything //and hope the creation speeds up by not calculating a bounding shape return null; } /* (non-Javadoc) * @see org.mt4j.components.visibleComponents.font.IFontCharacter#getHorizontalDist() */ //@Override public int getHorizontalDist() { return this.horizontalDist; } /** * Sets the horizontal dist. * * @param horizontalDist the new horizontal dist */ public void setHorizontalDist(int horizontalDist) { this.horizontalDist = horizontalDist; } /* (non-Javadoc) * @see org.mt4j.components.visibleComponents.font.IFontCharacter#getUnicode() */ //@Override public String getUnicode() { return this.unicode; } /** * Sets the unicode. * * @param unicode the new unicode */ public void setUnicode(String unicode) { this.unicode = unicode; } public int getLeftOffset() { return this.leftOffset; } //FIXME TEST public void setTextureFiltered(boolean scalable) { if (MT4jSettings.getInstance().isOpenGlMode()){ PImage tex = this.getTexture(); if (tex instanceof GLTexture) { GLTexture glTex = (GLTexture) tex; //FIXME normally we would use GL_LINEAR as magnification filter but sometimes //small text is too filtered and smudged so we use NEAREST -> but this makes //scaled text very ugly and pixelated.. if (scalable){ // glTex.setFilter(GL.GL_LINEAR, GL.GL_LINEAR); glTex.setFilter(SHRINKAGE_FILTER.BilinearNoMipMaps, EXPANSION_FILTER.Bilinear); }else{ // glTex.setFilter(GL.GL_LINEAR, GL.GL_NEAREST); glTex.setFilter(SHRINKAGE_FILTER.BilinearNoMipMaps, EXPANSION_FILTER.NearestNeighbor); } } } } }