toni@1111: /** toni@1111: * Back 2 Browser Bytecode Translator Copyright (C) 2012 Jaroslav Tulach toni@1111: * toni@1111: * toni@1111: * This program is free software: you can redistribute it and/or modify it under toni@1111: * the terms of the GNU General Public License as published by the Free Software toni@1111: * Foundation, version 2 of the License. toni@1111: * toni@1111: * This program is distributed in the hope that it will be useful, but WITHOUT toni@1111: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS toni@1111: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more toni@1111: * details. toni@1111: * toni@1111: * You should have received a copy of the GNU General Public License along with toni@1111: * this program. Look for COPYING file in the top folder. If not, see toni@1111: * http://opensource.org/licenses/GPL-2.0. toni@521: */ toni@1135: package org.apidesign.bck2brwsr.htmlpage; toni@521: toni@1134: import java.util.HashMap; toni@1134: import java.util.Set; toni@1138: import net.java.html.canvas.Dimension; toni@1145: import net.java.html.canvas.Image; toni@1145: import net.java.html.canvas.ImageData; toni@1134: import net.java.html.canvas.Style; toni@1151: import net.java.html.canvas.Style.Color; toni@1151: import net.java.html.canvas.Style.LinearGradient; toni@1151: import net.java.html.canvas.Style.Pattern; toni@1151: import net.java.html.canvas.Style.RadialGradient; toni@1138: import net.java.html.canvas.spi.GraphicsEnvironment; toni@521: import org.apidesign.bck2brwsr.core.JavaScriptBody; toni@1135: import org.apidesign.bck2brwsr.htmlpage.api.Canvas; toni@1296: import org.openide.util.lookup.ServiceProvider; toni@521: toni@521: /** toni@521: * toni@1112: * @author Anton Epple toni@521: */ toni@1296: @ServiceProvider(service = GraphicsEnvironment.class) toni@1134: public class HTML5GraphicsEnvironment implements GraphicsEnvironment { toni@521: toni@1112: Object context; toni@1134: Canvas canvas; toni@1142: toni@1296: public HTML5GraphicsEnvironment() { toni@1296: } toni@1296: toni@1296: toni@1296: toni@1142: public HTML5GraphicsEnvironment(Object contextImpl, Canvas canvas) { toni@1112: this.context = contextImpl; toni@1134: this.canvas = canvas; toni@1112: } toni@1112: toni@1112: @JavaScriptBody(args = {"centerx", "centery", "radius", "startangle", "endangle", "ccw"}, toni@1112: body = "this._context().arc(centerx,centery, radius, startangle, endangle,ccw);") toni@1112: @Override toni@1112: public native void arc(double centerX, toni@1111: double centerY, toni@1111: double startAngle, toni@1111: double radius, toni@1111: double endAngle, toni@1111: boolean ccw); toni@521: toni@1112: @JavaScriptBody(args = {"x1", "y1", "x2", "y2", "r"}, toni@1112: body = "this._context().arcTo(x1,y1,x2,y2,r);") toni@1112: @Override toni@1112: public native void arcTo(double x1, toni@1111: double y1, toni@1111: double x2, toni@1111: double y2, toni@1111: double r); toni@521: toni@1112: @JavaScriptBody(args = {"x", "y"}, toni@1112: body = "return this._context().isPointInPath(x,y);") toni@1112: @Override toni@1112: public native boolean isPointInPath(double x, double y); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "this._context().fill();") toni@1112: @Override toni@1112: public native void fill(); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "this._context().stroke();") toni@1112: @Override toni@1112: public native void stroke(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "this._context().beginPath();") toni@1112: @Override toni@1112: public native void beginPath(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "this._context().closePath();") toni@1112: @Override toni@1112: public native void closePath(); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "this._context().clip();") toni@1112: @Override toni@1112: public native void clip(); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y"}, body = "this._context().moveTo(x,y);") toni@1112: @Override toni@1112: public native void moveTo(double x, double y); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y"}, body = "this._context().lineTo(x,y);") toni@1112: @Override toni@1112: public native void lineTo(double x, double y); toni@1109: toni@1112: @JavaScriptBody(args = {"cpx", "cpy", "x", "y"}, body = "this._context().quadraticCurveTo(cpx,cpy,x,y);") toni@1112: @Override toni@1112: public native void quadraticCurveTo(double cpx, double cpy, double x, double y); toni@1109: toni@1112: @JavaScriptBody(args = {"cp1x", "cp1y", "cp2x", "cp2y", "x", "y"}, toni@1112: body = "this._context().bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);") toni@1112: @Override toni@1112: public native void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().fillRect(x,y,width,height);") toni@1112: @Override toni@1112: public native void fillRect(double x, double y, double width, double height); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().strokeRect(x,y,width,height);") toni@1112: @Override toni@1112: public native void strokeRect(double x, double y, double width, double height); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().clearRect(x,y,width,height);") toni@1112: @Override toni@1112: public native void clearRect(double x, double y, double width, double height); toni@1109: toni@1145: @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().rect(x,y,width,height);") toni@1112: @Override toni@1112: public native void rect(double x, double y, double width, double height); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "this._context().save();") toni@1112: @Override toni@1112: public native void save(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "this._context().restore();") toni@1112: @Override toni@1112: public native void restore(); toni@1109: toni@1112: @JavaScriptBody(args = {"angle"}, body = "this._context().rotate(angle);") toni@1112: @Override toni@1112: public native void rotate(double angle); toni@1109: toni@1112: @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().transform(a,b,c,d,e,f);") toni@1112: @Override toni@1112: public native void transform(double a, double b, double c, double d, double e, double f); toni@1109: toni@1112: @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().setTransform(a,b,c,d,e,f);") toni@1112: @Override toni@1112: public native void setTransform(double a, double b, double c, double d, double e, double f); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y"}, body = "this._context().translate(x,y);") toni@1112: @Override toni@1112: public native void translate(double x, double y); toni@1109: toni@1112: @JavaScriptBody(args = {"x", "y"}, body = "this._context().scale(x,y);") toni@1112: @Override toni@1112: public native void scale(double x, double y); toni@1109: toni@1145: @Override toni@1145: public Object drawImage(Image image, double x, double y, Object nativeImage) { toni@1145: if (nativeImage == null) { toni@1145: nativeImage = createImage(image.getSrc()); toni@1145: } toni@1145: return drawImageImpl(context, nativeImage, x, y); toni@1145: } toni@1145: toni@1145: @Override toni@1145: public Object drawImage(Image image, double x, double y, double width, double height, Object nativeImage) { toni@1145: if (nativeImage == null) { toni@1145: nativeImage = createImage(image.getSrc()); toni@1145: } toni@1145: return drawImageImpl(context, nativeImage, x, y, width, height); toni@1145: } toni@1145: toni@1145: @Override toni@1145: public Object drawImage(Image image, double sx, double sy, double sWidth, double sHeight, double x, double y, double width, double height, Object nativeImage) { toni@1145: if (nativeImage == null) { toni@1145: nativeImage = createImage(image.getSrc()); toni@1145: } toni@1145: return drawImageImpl(context, nativeImage, sx, sy, sWidth, sHeight, x, y, width, height); toni@1145: } toni@1145: toni@1158: @JavaScriptBody(args = {"ctx", "img", "x", "y", "width", "height"}, body = "img.onload=function(){ctx.drawImage(img,x,y,width,height);};ctx.drawImage(img,x,y,width,height); return img;") toni@1145: private native static Object drawImageImpl(Object ctx, Object img, double x, double y, double width, double height); toni@1145: toni@1158: @JavaScriptBody(args = {"ctx", "img", "sx", "sy", "swidth", "sheight", "x", "y", "width", "height"}, body = "img.onload=function(){ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);}; ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height); return img;") toni@1145: private native static Object drawImageImpl(Object ctx, Object img, double sx, double sy, double sWidth, double sHeight, double x, double y, double width, double height); toni@1145: toni@1158: @JavaScriptBody(args = {"ctx", "img", "x", "y"}, body = "img.onload=function(){ctx.drawImage(img,x,y);}; ctx.drawImage(img,x,y); return img;") toni@1145: private native static Object drawImageImpl(Object ctx, Object img, double x, double y); toni@1145: toni@1142: public Object setFillStyle(Style style, Object nativeStyle) { toni@1142: if (nativeStyle == null) { toni@1142: nativeStyle = createNativeStyle(style); toni@1142: } toni@1142: setFillStyleImpl(context, nativeStyle); toni@1142: return nativeStyle; toni@1112: } toni@1109: toni@1142: private Object createNativeStyle(Style style) { toni@1134: if (style instanceof RadialGradient) { toni@1134: RadialGradientWrapper gradient = createRadialGradientWrapper( toni@1134: ((RadialGradient) style).getX0(), toni@1134: ((RadialGradient) style).getY0(), toni@1134: ((RadialGradient) style).getR0(), toni@1134: ((RadialGradient) style).getX1(), toni@1134: ((RadialGradient) style).getY1(), toni@1134: ((RadialGradient) style).getR1()); toni@1134: HashMap stops = ((LinearGradient) style).getStops(); toni@1134: Set keySet = stops.keySet(); toni@1134: for (Double double1 : keySet) { toni@1134: addColorStopImpl(style, double1, stops.get(double1)); toni@1134: } toni@1134: return gradient; toni@1134: toni@1134: toni@1134: } else if (style instanceof LinearGradient) { toni@1134: LinearGradientWrapper gradient = createLinearGradientWrapper( toni@1134: ((LinearGradient) style).getX0(), toni@1134: ((LinearGradient) style).getY0(), toni@1134: ((LinearGradient) style).getX1(), toni@1134: ((LinearGradient) style).getY1()); toni@1134: HashMap stops = ((LinearGradient) style).getStops(); toni@1134: Set keySet = stops.keySet(); toni@1134: for (Double double1 : keySet) { toni@1134: addColorStopImpl(style, double1, stops.get(double1)); toni@1134: } toni@1134: return gradient; toni@1142: } else if (style instanceof Pattern) { toni@1149: return createPatternWrapper(((Pattern) style).getImageResource(), ((Pattern) style).getRepeat()); toni@1149: } else if (style instanceof Color) { toni@1149: return ((Color) style) toni@1149: .getAsString(); toni@1134: } toni@1134: return null; toni@1112: } toni@1109: toni@1134: @JavaScriptBody(args = {"gradient", "position", "color"}, body = toni@1134: "gradient.addColorStop(position,color)") toni@1134: private static native void addColorStopImpl(Object gradient, double position, String color); toni@1109: toni@1296: @JavaScriptBody(args = {"context", "obj"}, body = "context.fillStyle=obj;") toni@1112: private native void setFillStyleImpl(Object context, Object obj); toni@1109: toni@1112: @JavaScriptBody(args = {"style"}, body = "this._context().strokeStyle=style.valueOf();") toni@1112: public native void setStrokeStyle(String style); toni@1109: toni@1112: @Override toni@1142: public Object setStrokeStyle(Style style, Object nativeStyle) { toni@1145: if (nativeStyle == null) { toni@1142: nativeStyle = createNativeStyle(style); toni@1142: } toni@1142: setStrokeStyleImpl(context, nativeStyle); toni@1142: return nativeStyle; toni@1112: } toni@1109: toni@1112: @JavaScriptBody(args = {"context", "obj"}, body = "context.strokeStyle=obj;") toni@1112: private native void setStrokeStyleImpl(Object context, Object obj); toni@1109: toni@1112: @JavaScriptBody(args = {"color"}, body = "this._context().shadowColor=color.valueOf();") toni@1112: @Override toni@1112: public native void setShadowColor(String color); toni@1109: toni@1112: @JavaScriptBody(args = {"blur"}, body = "this._context().shadowBlur=blur;") toni@1112: @Override toni@1112: public native void setShadowBlur(double blur); toni@1109: toni@1112: @JavaScriptBody(args = {"x"}, body = "this._context().shadowOffsetX=x;") toni@1112: @Override toni@1112: public native void setShadowOffsetX(double x); toni@1109: toni@1112: @JavaScriptBody(args = {"y"}, body = "this._context().shadowOffsetY=y;") toni@1112: @Override toni@1112: public native void setShadowOffsetY(double y); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().strokeStyle;") toni@1112: public native String getStrokeStyle(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().shadowColor;") toni@1112: @Override toni@1112: public native String getShadowColor(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().shadowBlur;") toni@1112: @Override toni@1112: public native double getShadowBlur(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetX;") toni@1112: @Override toni@1112: public native double getShadowOffsetX(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetY;") toni@1112: @Override toni@1112: public native double getShadowOffsetY(); toni@1109: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().lineCap;") toni@1112: @Override toni@1112: public native String getLineCap(); toni@1109: toni@1112: @JavaScriptBody(args = {"style"}, body = "this._context().lineCap=style.valueOf();") toni@1112: @Override toni@1112: public native void setLineCap(String style); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().lineJoin;") toni@1112: @Override toni@1112: public native String getLineJoin(); toni@521: toni@1112: @JavaScriptBody(args = {"style"}, body = "this._context().lineJoin=style.valueOf();") toni@1112: @Override toni@1112: public native void setLineJoin(String style); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().lineWidth;") toni@1112: @Override toni@1112: public native double getLineWidth(); toni@521: toni@1112: @JavaScriptBody(args = {"width"}, body = "this._context().lineWidth=width;") toni@1112: @Override toni@1112: public native void setLineWidth(double width); toni@521: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().miterLimit;") toni@1112: @Override toni@1112: public native double getMiterLimit(); toni@521: toni@1112: @JavaScriptBody(args = {"limit"}, body = "this._context().miterLimit=limit;") toni@1112: @Override toni@1112: public native void setMiterLimit(double limit); toni@1111: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().font;") toni@1112: @Override toni@1112: public native String getFont(); toni@1111: toni@1112: @JavaScriptBody(args = {"font"}, body = "this._context().font=font.valueOf();") toni@1112: @Override toni@1112: public native void setFont(String font); toni@1111: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().textAlign;") toni@1112: @Override toni@1112: public native String getTextAlign(); toni@1111: toni@1112: @JavaScriptBody(args = {"textalign"}, body = "this._context().textAlign=textalign.valueOf();") toni@1112: @Override toni@1112: public native void setTextAlign(String textAlign); toni@1111: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().textBaseline;") toni@1112: @Override toni@1112: public native String getTextBaseline(); toni@1111: toni@1112: @JavaScriptBody(args = {"textbaseline"}, body = "this._context().textBaseline=textbaseline.valueOf();") toni@1112: @Override toni@1112: public native void setTextBaseline(String textbaseline); toni@1111: toni@1112: @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().fillText(text,x,y);") toni@1138: // @JavaScriptBody(args = {"text", "x", "y"}, body = "console.log(text);") toni@1112: @Override toni@1112: public native void fillText(String text, double x, double y); toni@1111: toni@1112: @JavaScriptBody(args = {"text", "x", "y", "maxwidth"}, body = "this._context().fillText(text,x,y,maxwidth);") toni@1112: @Override toni@1112: public void fillText(String text, double x, double y, double maxWidth) { toni@1112: } toni@1111: toni@1112: @Override toni@1134: public Dimension measureText(String text) { toni@1138: measureTextImpl(text); toni@1142: return new Dimension(1, 1); toni@1112: } toni@1111: toni@1112: @JavaScriptBody(args = {"text"}, toni@1112: body = "return this._context().measureText(text);") toni@1112: private native Object measureTextImpl(String text); toni@1111: toni@1112: @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().strokeText(text,x,y);") toni@1112: @Override toni@1112: public native void strokeText(String text, double x, double y); toni@1111: toni@1112: @JavaScriptBody(args = {"text", "x", "y", "maxWidth"}, body = "this._context().strokeText(text,x,y,maxWidth);") toni@1112: @Override toni@1112: public native void strokeText(String text, double x, double y, double maxWidth); toni@1111: toni@1145: @Override toni@1145: public ImageData createPixelMap(double x, double y) { toni@1145: return new ImageDataWrapper(createPixelMapImpl(x, y)); toni@1145: } toni@1145: toni@1145: @JavaScriptBody(args = {"x", "y"}, toni@1145: body = "return this._context().createImageData(x,y);") toni@1145: private native Object createPixelMapImpl(double x, double y); toni@1145: toni@1145: @Override toni@1145: public ImageData createPixelMap(ImageData imageData) { toni@1145: return new ImageDataWrapper(createPixelMapImpl(imageData.getWidth(), imageData.getHeight())); toni@1145: } toni@1145: toni@1145: @Override toni@1145: public ImageData getPixelMap(double x, double y, double width, double height) { toni@1145: return new ImageDataWrapper(getPixelMapImpl(x, y, width, height)); toni@1145: } toni@1145: toni@1145: @JavaScriptBody(args = {"x", "y", "width", "height"}, toni@1145: body = "return this._context().getImageData(x,y,width,height);") toni@1145: private native Object getPixelMapImpl(double x, double y, double width, double height); toni@1145: toni@1145: @Override toni@1145: public void putPixelMap(ImageData imageData, double x, double y) { toni@1145: putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y); toni@1145: } toni@1145: toni@1145: @JavaScriptBody(args = {"imageData", "x", "y"}, toni@1145: body = "this._context().putImageData(imageData,x,y);") toni@1145: private native void putPixelMapImpl(Object imageData, double x, double y); toni@1145: toni@1145: @Override toni@1145: public void putPixelMap(ImageData imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight) { toni@1145: putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y, dirtyx, dirtyy, dirtywidth, dirtyheight); toni@1145: } toni@1145: toni@1112: @JavaScriptBody(args = {"imageData", "x", "y", "dirtyx", "dirtyy", "dirtywidth", "dirtyheight"}, toni@1112: body = "this._context().putImageData(imageData,x,y, dirtyx, dirtyy, dirtywidth,dirtyheight);") toni@1145: private native void putPixelMapImpl(Object imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight); toni@1112: toni@1112: @JavaScriptBody(args = {"alpha"}, body = "this._context().globalAlpha=alpha;") toni@1112: @Override toni@1112: public native void setGlobalAlpha(double alpha); toni@1112: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().globalAlpha;") toni@1112: @Override toni@1112: public native double getGlobalAlpha(); toni@1112: toni@1112: @JavaScriptBody(args = {"operation"}, body = "this._context().globalCompositeOperation=operation.valueOf();") toni@1112: @Override toni@1112: public native void setGlobalCompositeOperation(String operation); toni@1112: toni@1112: @JavaScriptBody(args = {}, body = "return this._context().globalCompositeOperation;") toni@1112: @Override toni@1112: public native String getGlobalCompositeOperation(); toni@1112: toni@1134: public LinearGradientWrapper createLinearGradientWrapper(double x0, double y0, double x1, double y1) { toni@1134: return new LinearGradientWrapper(createLinearGradientImpl(context, x0, y0, x1, y1)); toni@1112: } toni@1112: toni@1112: @JavaScriptBody(args = {"context", "x0", "y0", "x1", "y1"}, body = "return context.createLinearGradient(x0,y0,x1,y1);") toni@1112: private native Object createLinearGradientImpl(Object context, double x0, double y0, double x1, double y1); toni@1112: toni@1145: public PatternWrapper createPatternWrapper(Image image, String repeat) { toni@1145: return new PatternWrapper(createPatternImpl(context, image, repeat)); toni@1145: } toni@1145: toni@1145: @JavaScriptBody(args = {"context", "image", "repeat"}, body = "return context.createPattern(image, repeat);") toni@1145: private static native Object createPatternImpl(Object context, Image image, String repeat); toni@1145: toni@1134: public RadialGradientWrapper createRadialGradientWrapper(double x0, double y0, double r0, double x1, double y1, double r1) { toni@1134: return new RadialGradientWrapper(createRadialGradientImpl(context, x0, y0, r0, x1, y1, r1)); toni@1112: } toni@1112: toni@1112: @JavaScriptBody(args = {"context", "x0", "y0", "r0", "x1", "y1", "r1"}, body = "return context.createRadialGradient(x0,y0,r0,x1,y1,r1);") toni@1112: private static native Object createRadialGradientImpl(Object context, double x0, double y0, double r0, double x1, double y1, double r1); toni@1121: toni@1158: // @JavaScriptBody(args = {"path"}, body = "var b = new Image(); b.src=path; return b;") toni@1158: // public native Image getImageForPathImpl(String path); toni@1121: @Override toni@1134: public int getHeight() { toni@1142: return canvas.getHeight(); toni@1121: } toni@1134: toni@1134: @Override toni@1134: public int getWidth() { toni@1142: return canvas.getWidth(); toni@1134: } toni@1134: toni@1134: @Override toni@1134: public void setHeight(int height) { toni@1142: canvas.setHeight(height); toni@1134: } toni@1134: toni@1134: @Override toni@1134: public void setWidth(int width) { toni@1142: canvas.setWidth(width); toni@1134: } toni@1145: toni@1296: // @JavaScriptBody(args = {"src"}, body = "var image = new Image();console.log('image complete '+image.complete);image.src = './'+ src; return image;") toni@1296: @JavaScriptBody(args = {"src"}, body = "console.log ('looking up image by id '+src);return document.getElementById(src);") toni@1145: private static native Object createImage(String src); toni@1267: toni@1267: @Override toni@1267: public int getWidth(Image image, Object nativeImage) { toni@1296: toni@1267: if (nativeImage == null) { toni@1267: nativeImage = createImage(image.getSrc()); toni@1296: toni@1267: } toni@1267: return getWidth(nativeImage); toni@1267: } toni@1267: toni@1267: @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalWidth;") toni@1267: private static native int getWidth(Object nativeImage); toni@1267: toni@1267: @Override toni@1267: public int getHeight(Image image, Object nativeImage) { toni@1267: if (nativeImage == null) { toni@1267: nativeImage = createImage(image.getSrc()); toni@1267: } toni@1267: return getHeight(nativeImage); toni@1267: } toni@1267: toni@1267: @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalHeight;") toni@1267: private static native int getHeight(Object nativeImage); toni@1267: toni@1267: @Override toni@1267: public Object mergeImages(Image a, Image b, Object cachedA, Object cachedB) { toni@1267: return mergeImages(cachedA, cachedB); toni@1267: } toni@1267: toni@1267: @JavaScriptBody(args = {"img1", "img2"}, body = "var canvas = document.createElement('img');\n" toni@1267: + "var context = canvas.getContext(\"2d\");\n" toni@1267: + "var width = img1.width;\n" toni@1267: + "var height = img1.height;\n" toni@1267: + "canvas.width = width;\n" toni@1267: + "canvas.height = height;\n" toni@1267: + "context.drawImage(img1, 0, 0);\n" toni@1267: + "context.drawImage(img2, 0, 0);\n" toni@1267: + "url = canvas.toDataURL();\n" toni@1267: + "var resultImage = document.createElement('img');\n" toni@1267: + "resultImage.src=url;\n" toni@1267: + "return resultImage;") toni@1267: public static native Object mergeImages(Object img1, Object img2); toni@521: }