desktop: improve text rendering

This commit is contained in:
Hannes Janetzek 2013-07-24 01:36:58 +02:00
parent 7ade22d917
commit 440ab0e3cc
3 changed files with 48 additions and 26 deletions

View File

@ -1,6 +1,7 @@
package org.oscim.awt;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.IntBuffer;
@ -18,12 +19,16 @@ public class AwtBitmap implements Bitmap {
int width;
int height;
boolean internal;
public AwtBitmap(int width, int height, int format) {
bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
this.width = width;
this.height = height;
if (!this.bitmap.isAlphaPremultiplied())
this.bitmap.coerceData(true);
internal = true;
// if (!this.bitmap.isAlphaPremultiplied())
// this.bitmap.coerceData(true);
}
AwtBitmap(InputStream inputStream) throws IOException {
@ -31,8 +36,9 @@ public class AwtBitmap implements Bitmap {
this.bitmap = ImageIO.read(inputStream);
this.width = this.bitmap.getWidth();
this.height = this.bitmap.getHeight();
if (!this.bitmap.isAlphaPremultiplied() && this.bitmap.getType() == BufferedImage.TYPE_INT_ARGB)
this.bitmap.coerceData(true);
// if (!this.bitmap.isAlphaPremultiplied()
// && this.bitmap.getType() == BufferedImage.TYPE_INT_ARGB)
// this.bitmap.coerceData(true);
}
@Override
@ -57,6 +63,9 @@ public class AwtBitmap implements Bitmap {
private static IntBuffer tmpBuffer = BufferUtils.newIntBuffer(512 * 256);
private static int[] tmpPixel = new int[512 * 256];
private final static boolean WRITE_TEX = false;
private int dbgCnt;
@Override
public int uploadToTexture(boolean replace) {
int[] pixels;
@ -74,11 +83,30 @@ public class AwtBitmap implements Bitmap {
// FIXME dont convert to argb when there data is greyscale
bitmap.getRGB(0, 0, width, height, pixels, 0, width);
if (WRITE_TEX) {
try {
boolean ok = ImageIO.write(bitmap, "png", new File("texture_" + dbgCnt + ".png"));
System.out.println("write tex " + ok + " " + dbgCnt);
dbgCnt++;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0, n = width * height; i < n; i++) {
int c = pixels[i];
if (internal) {
float alpha = (c >>> 24) / 255f;
int r = (int) ((c & 0x000000ff) * alpha);
int b = (int) (((c & 0x00ff0000) >>> 16) * alpha);
int g = (int) (((c & 0x0000ff00) >>> 8) * alpha);
pixels[i] = (c & 0xff000000) | r << 16 | g << 8 | b;
} else {
// flip blue with red - silly Java
pixels[i] = (c & 0xff00ff00) | (c & 0x00ff0000) >>> 16 | (c & 0x000000ff) << 16;
}
}
buffer.put(pixels, 0, width * height);
buffer.flip();

View File

@ -43,22 +43,17 @@ public class AwtCanvas implements Canvas {
AwtBitmap awtBitamp = (AwtBitmap)bitmap;
canvas = awtBitamp.bitmap.createGraphics();
//awtBitamp.bitmap.
//bitmap.eraseColor();
canvas.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0));
//canvas.setBackground(new Color(1,1,1,1));
canvas.setColor(Color.BLACK);
//Gdx.app.log("set bitmap ", bitmap + " "+ bitmap.getWidth() + " " +bitmap.getHeight());
canvas.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0));
canvas.fillRect(0, 0, bitmap.getWidth(), bitmap.getHeight());
//canvas.clearRect(0, 0, bitmap.getWidth(),bitmap.getHeight());
canvas.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
canvas.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
//canvas.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
//canvas.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//canvas.setRenderingHint(RenderingHints.KEY_KERNING, RenderingHints.VALUE_RENDER_QUALITY);
canvas.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
canvas.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
@ -76,13 +71,12 @@ public class AwtCanvas implements Canvas {
if (awtPaint.stroke == null) {
canvas.setColor(awtPaint.color);
canvas.setFont(awtPaint.font);
canvas.drawString(text, x, y);
canvas.drawString(text, x + 2, y);
} else {
setColorAndStroke(awtPaint);
TextLayout textLayout = new TextLayout(text, awtPaint.font, canvas.getFontRenderContext());
AffineTransform affineTransform = new AffineTransform();
affineTransform.translate(x, y);
affineTransform.translate(x + 2, y);
canvas.draw(textLayout.getOutline(affineTransform));
}
}

View File

@ -47,8 +47,8 @@ public class AwtPaint implements Paint {
static {
Map<Attribute, Object> textAttributes = new HashMap<Attribute, Object>();
textAttributes.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
textAttributes.put(TextAttribute.FAMILY, "SansSerif");
textAttributes.put(TextAttribute.SIZE, 13);
textAttributes.put(TextAttribute.FAMILY, "Arial");
textAttributes.put(TextAttribute.SIZE, 14);
defaultFont = Font.getFont(textAttributes);
}
@ -126,7 +126,7 @@ public class AwtPaint implements Paint {
@Override
public void setTextSize(float textSize) {
font = font.deriveFont(textSize - 4);
font = font.deriveFont(textSize - 2);
}
@ -143,7 +143,7 @@ public class AwtPaint implements Paint {
float w = AwtGraphics.getTextWidth(fm, text);
//Gdx.app.log("text width:", text + " " + w);
return w;
return w + 4;
// return fm.getStringBounds(text, A).getWidth();
// return AwtGraphics.getTextWidth(fm, text);
// return fm.stringWidth(text);
@ -173,6 +173,6 @@ public class AwtPaint implements Paint {
if (strokeWidth <= 0) {
return;
}
stroke = new BasicStroke(strokeWidth, cap, BasicStroke.JOIN_ROUND, 0, null, 0);
stroke = new BasicStroke(strokeWidth, cap, BasicStroke.JOIN_MITER, 1, null, 0);
}
}