package org.anddev.andengine.opengl.vertex; import org.anddev.andengine.opengl.font.Font; import org.anddev.andengine.opengl.font.Letter; import org.anddev.andengine.opengl.util.FastFloatBuffer; import org.anddev.andengine.util.HorizontalAlign; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 18:05:08 - 07.04.2010 */ public class TextVertexBuffer extends VertexBuffer { // =========================================================== // Constants // =========================================================== public static final int VERTICES_PER_CHARACTER = 6; // =========================================================== // Fields // =========================================================== private final HorizontalAlign mHorizontalAlign; // =========================================================== // Constructors // =========================================================== public TextVertexBuffer(final int pCharacterCount, final HorizontalAlign pHorizontalAlign, final int pDrawType, final boolean pManaged) { super(2 * VERTICES_PER_CHARACTER * pCharacterCount, pDrawType, pManaged); this.mHorizontalAlign = pHorizontalAlign; } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== public synchronized void update(final Font font, final int pMaximumLineWidth, final int[] pWidths, final String[] pLines) { final int[] bufferData = this.mBufferData; int i = 0; final int lineHeight = font.getLineHeight(); final int lineCount = pLines.length; for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) { final String line = pLines[lineIndex]; int lineX; switch(this.mHorizontalAlign) { case RIGHT: lineX = pMaximumLineWidth - pWidths[lineIndex]; break; case CENTER: lineX = (pMaximumLineWidth - pWidths[lineIndex]) >> 1; break; case LEFT: default: lineX = 0; } final int lineY = lineIndex * (font.getLineHeight() + font.getLineGap()); final int lineYBits = Float.floatToRawIntBits(lineY); final int lineLength = line.length(); for (int letterIndex = 0; letterIndex < lineLength; letterIndex++) { final Letter letter = font.getLetter(line.charAt(letterIndex)); final int lineY2 = lineY + lineHeight; final int lineX2 = lineX + letter.mWidth; final int lineXBits = Float.floatToRawIntBits(lineX); final int lineX2Bits = Float.floatToRawIntBits(lineX2); final int lineY2Bits = Float.floatToRawIntBits(lineY2); bufferData[i++] = lineXBits; bufferData[i++] = lineYBits; bufferData[i++] = lineXBits; bufferData[i++] = lineY2Bits; bufferData[i++] = lineX2Bits; bufferData[i++] = lineY2Bits; bufferData[i++] = lineX2Bits; bufferData[i++] = lineY2Bits; bufferData[i++] = lineX2Bits; bufferData[i++] = lineYBits; bufferData[i++] = lineXBits; bufferData[i++] = lineYBits; lineX += letter.mAdvance; } } final FastFloatBuffer vertexFloatBuffer = this.mFloatBuffer; vertexFloatBuffer.position(0); vertexFloatBuffer.put(bufferData); vertexFloatBuffer.position(0); super.setHardwareBufferNeedsUpdate(); } // =========================================================== // Inner and Anonymous Classes // =========================================================== }