diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java index 021ed748..c4fd57cf 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtBitmap.java @@ -1,8 +1,10 @@ package org.oscim.gdx.client; +import org.oscim.backend.Log; import org.oscim.backend.canvas.Bitmap; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Pixmap; import com.google.gwt.dom.client.ImageElement; @@ -10,28 +12,39 @@ import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; public class GwtBitmap implements Bitmap { - Pixmap bitmap; + Pixmap pixmap; Image image; - + boolean disposable; public GwtBitmap(Image data) { ImageElement imageElement = ImageElement.as(data.getElement()); - bitmap = new Pixmap(imageElement); + pixmap = new Pixmap(imageElement); image = data; } + /** always argb8888 */ + public GwtBitmap(int width, int height, int format) { + pixmap = new Pixmap(width, height, null); + } + + public GwtBitmap(String fileName) { + FileHandle handle = Gdx.files.internal(fileName); + pixmap = new Pixmap(handle); + disposable = true; + } + @Override public int getWidth() { - return bitmap.getWidth(); + return pixmap.getWidth(); } @Override public int getHeight() { - return bitmap.getHeight(); + return pixmap.getHeight(); } @Override public void recycle() { - bitmap.dispose(); + pixmap.dispose(); } @Override @@ -46,14 +59,18 @@ public class GwtBitmap implements Bitmap { @Override public int uploadToTexture(boolean replace) { - Gdx.gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, bitmap.getGLInternalFormat(), bitmap.getWidth(), - bitmap.getHeight(), 0, - bitmap.getGLFormat(), bitmap.getGLType(), bitmap.getPixels()); + Gdx.gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, pixmap.getGLInternalFormat(), pixmap.getWidth(), + pixmap.getHeight(), 0, + pixmap.getGLFormat(), pixmap.getGLType(), pixmap.getPixels()); - bitmap.dispose(); - if (image != null) - RootPanel.get().remove(image); + if (disposable || image != null){ + Log.d("", "dispose pixmap " +getWidth() +"/" + getHeight()); + pixmap.dispose(); + + if (image != null) + RootPanel.get().remove(image); + } return 1; } diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvas.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvas.java new file mode 100644 index 00000000..395f6bd3 --- /dev/null +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvas.java @@ -0,0 +1,49 @@ +package org.oscim.gdx.client; + +import org.oscim.backend.Log; +import org.oscim.backend.canvas.Bitmap; +import org.oscim.backend.canvas.Paint; + +import com.google.gwt.canvas.dom.client.Context2d; + +public class GwtCanvas implements org.oscim.backend.canvas.Canvas { + GwtBitmap bitmap; + public GwtCanvas() { + // canvas comes with gdx pixmap + } + + @Override + public void setBitmap(Bitmap bitmap) { + this.bitmap = (GwtBitmap) bitmap; + this.bitmap.pixmap.setColor(0); + this.bitmap.pixmap.getContext().clearRect(0, 0, this.bitmap.getWidth(), this.bitmap.getHeight()); + } + + @Override + public void drawText(String string, float x, float y, Paint paint) { + if (bitmap == null){ + Log.d("", "no bitmap set on canvas"); + } + + GwtPaint p = (GwtPaint) paint; + Context2d ctx = bitmap.pixmap.getContext(); + ctx.setFont(p.font); + + if (p.stroke){ + Log.d("", "stroke " + p.stroke + " " + p.color + " " + p.font + " "+ string); + ctx.setStrokeStyle(p.color); + ctx.strokeText(string, x, y); + } else{ + Log.d("", "fill " + p.stroke + " " + p.color + " " + p.font + " "+ string); + ctx.setFillStyle(p.color); + ctx.fillText(string, x, y); + } + } + + @Override + public void drawBitmap(Bitmap bitmap, float x, float y) { + // TODO Auto-generated method stub + + } + +} diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvasAdapter.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvasAdapter.java index a7732b72..7913d450 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvasAdapter.java +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtCanvasAdapter.java @@ -4,17 +4,40 @@ import java.io.InputStream; import org.oscim.backend.CanvasAdapter; import org.oscim.backend.canvas.Bitmap; -import org.oscim.backend.canvas.Canvas; import org.oscim.backend.canvas.Paint; +import com.google.gwt.canvas.client.Canvas; +import com.google.gwt.canvas.dom.client.Context2d; +import com.google.gwt.canvas.dom.client.TextMetrics; + public class GwtCanvasAdapter extends CanvasAdapter { + public static final GwtCanvasAdapter INSTANCE = new GwtCanvasAdapter(); + static final Context2d ctx; + static { + Canvas canvas = Canvas.createIfSupported(); + canvas.setCoordinateSpaceWidth(1); + canvas.setCoordinateSpaceHeight(1); + ctx = canvas.getContext2d(); + } + + static synchronized float getTextWidth(String text, String font) { + ctx.setFont(font); + TextMetrics tm = ctx.measureText(text); + return (float)tm.getWidth(); + } + @Override public Bitmap decodeBitmap(InputStream in) { - + //ImageData data = new ImageData(); return null; } + @Override + public Bitmap loadBitmapAsset(String fileName) { + return new GwtBitmap(fileName); + } + @Override public int getColor(Color color) { // TODO Auto-generated method stub @@ -23,8 +46,7 @@ public class GwtCanvasAdapter extends CanvasAdapter { @Override public Paint getPaint() { - // TODO Auto-generated method stub - return null; + return new GwtPaint(); } @Override @@ -35,14 +57,12 @@ public class GwtCanvasAdapter extends CanvasAdapter { @Override public Bitmap getBitmap(int width, int height, int format) { - // TODO Auto-generated method stub - return null; + return new GwtBitmap(width, height, format); } @Override - public Canvas getCanvas() { - // TODO Auto-generated method stub - return null; + public org.oscim.backend.canvas.Canvas getCanvas() { + return new GwtCanvas(); } } diff --git a/vtm-gdx-html/src/org/oscim/gdx/client/GwtPaint.java b/vtm-gdx-html/src/org/oscim/gdx/client/GwtPaint.java new file mode 100644 index 00000000..7e4896e1 --- /dev/null +++ b/vtm-gdx-html/src/org/oscim/gdx/client/GwtPaint.java @@ -0,0 +1,100 @@ +package org.oscim.gdx.client; + +import org.oscim.backend.canvas.Bitmap; +import org.oscim.backend.canvas.Paint; + +import com.badlogic.gdx.graphics.Pixmap; + +public class GwtPaint implements Paint { + + String color; + boolean stroke; + + float strokeWidth; + float fontSize; + Align mAlign; + + String font = "15px sans-serif"; + + //private int cap; + + @Override + public int getColor() { + return 0; + } + + @Override + public int getTextHeight(String text) { + return 0; + } + + @Override + public int getTextWidth(String text) { + return 0; + } + + @Override + public void setBitmapShader(Bitmap bitmap) { + } + + @Override + public void setColor(int color) { + float a = ((color >>> 24) & 0xff) / 255f; + int r = (color >>> 16) & 0xff; + int g = (color >>> 8) & 0xff; + int b = (color & 0xff) ; + + this.color = Pixmap.make(r, g, b, a); + } + + @Override + public void setDashPathEffect(float[] strokeDasharray) { + } + + @Override + public void setStrokeCap(Cap cap) { + stroke = true; + // TODO + } + + @Override + public void setStrokeWidth(float width) { + stroke = true; + strokeWidth = width; + } + + @Override + public void setStyle(Style style) { + } + + @Override + public void setTextAlign(Align align) { + mAlign = align; + } + + @Override + public void setTextSize(float size) { + fontSize = size; + } + + @Override + public void setTypeface(FontFamily fontFamily, FontStyle fontStyle) { + + } + + @Override + public float measureText(String text) { + return GwtCanvasAdapter.getTextWidth(text, font); + } + + @Override + public float getFontHeight() { + return 16; + } + + @Override + public float getFontDescent() { + return 4; + } + +}