javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/HTML5GraphicsEnvironment.java
2 * Back 2 Browser Bytecode Translator Copyright (C) 2012 Jaroslav Tulach
3 * <jaroslav.tulach@apidesign.org>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, version 2 of the License.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14 * You should have received a copy of the GNU General Public License along with
15 * this program. Look for COPYING file in the top folder. If not, see
16 * http://opensource.org/licenses/GPL-2.0.
18 package org.apidesign.bck2brwsr.htmlpage;
20 import java.util.HashMap;
22 import net.java.html.canvas.Dimension;
23 import net.java.html.canvas.Image;
24 import net.java.html.canvas.ImageData;
25 import net.java.html.canvas.Style;
26 import net.java.html.canvas.Style.Color;
27 import net.java.html.canvas.Style.LinearGradient;
28 import net.java.html.canvas.Style.Pattern;
29 import net.java.html.canvas.Style.RadialGradient;
30 import net.java.html.canvas.spi.GraphicsEnvironment;
31 import org.apidesign.bck2brwsr.core.JavaScriptBody;
32 import org.apidesign.bck2brwsr.htmlpage.api.Canvas;
33 import org.openide.util.lookup.ServiceProvider;
37 * @author Anton Epple <toni.epple@eppleton.de>
39 @ServiceProvider(service = GraphicsEnvironment.class)
40 public class HTML5GraphicsEnvironment implements GraphicsEnvironment {
45 public HTML5GraphicsEnvironment() {
50 public HTML5GraphicsEnvironment(Object contextImpl, Canvas canvas) {
51 this.context = contextImpl;
55 @JavaScriptBody(args = {"centerx", "centery", "radius", "startangle", "endangle", "ccw"},
56 body = "this._context().arc(centerx,centery, radius, startangle, endangle,ccw);")
58 public native void arc(double centerX,
65 @JavaScriptBody(args = {"x1", "y1", "x2", "y2", "r"},
66 body = "this._context().arcTo(x1,y1,x2,y2,r);")
68 public native void arcTo(double x1,
74 @JavaScriptBody(args = {"x", "y"},
75 body = "return this._context().isPointInPath(x,y);")
77 public native boolean isPointInPath(double x, double y);
79 @JavaScriptBody(args = {}, body = "this._context().fill();")
81 public native void fill();
83 @JavaScriptBody(args = {}, body = "this._context().stroke();")
85 public native void stroke();
87 @JavaScriptBody(args = {}, body = "this._context().beginPath();")
89 public native void beginPath();
91 @JavaScriptBody(args = {}, body = "this._context().closePath();")
93 public native void closePath();
95 @JavaScriptBody(args = {}, body = "this._context().clip();")
97 public native void clip();
99 @JavaScriptBody(args = {"x", "y"}, body = "this._context().moveTo(x,y);")
101 public native void moveTo(double x, double y);
103 @JavaScriptBody(args = {"x", "y"}, body = "this._context().lineTo(x,y);")
105 public native void lineTo(double x, double y);
107 @JavaScriptBody(args = {"cpx", "cpy", "x", "y"}, body = "this._context().quadraticCurveTo(cpx,cpy,x,y);")
109 public native void quadraticCurveTo(double cpx, double cpy, double x, double y);
111 @JavaScriptBody(args = {"cp1x", "cp1y", "cp2x", "cp2y", "x", "y"},
112 body = "this._context().bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);")
114 public native void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y);
116 @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().fillRect(x,y,width,height);")
118 public native void fillRect(double x, double y, double width, double height);
120 @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().strokeRect(x,y,width,height);")
122 public native void strokeRect(double x, double y, double width, double height);
124 @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().clearRect(x,y,width,height);")
126 public native void clearRect(double x, double y, double width, double height);
128 @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().rect(x,y,width,height);")
130 public native void rect(double x, double y, double width, double height);
132 @JavaScriptBody(args = {}, body = "this._context().save();")
134 public native void save();
136 @JavaScriptBody(args = {}, body = "this._context().restore();")
138 public native void restore();
140 @JavaScriptBody(args = {"angle"}, body = "this._context().rotate(angle);")
142 public native void rotate(double angle);
144 @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().transform(a,b,c,d,e,f);")
146 public native void transform(double a, double b, double c, double d, double e, double f);
148 @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().setTransform(a,b,c,d,e,f);")
150 public native void setTransform(double a, double b, double c, double d, double e, double f);
152 @JavaScriptBody(args = {"x", "y"}, body = "this._context().translate(x,y);")
154 public native void translate(double x, double y);
156 @JavaScriptBody(args = {"x", "y"}, body = "this._context().scale(x,y);")
158 public native void scale(double x, double y);
161 public Object drawImage(Image image, double x, double y, Object nativeImage) {
162 if (nativeImage == null) {
163 nativeImage = createImage(image.getSrc());
165 return drawImageImpl(context, nativeImage, x, y);
169 public Object drawImage(Image image, double x, double y, double width, double height, Object nativeImage) {
170 if (nativeImage == null) {
171 nativeImage = createImage(image.getSrc());
173 return drawImageImpl(context, nativeImage, x, y, width, height);
177 public Object drawImage(Image image, double sx, double sy, double sWidth, double sHeight, double x, double y, double width, double height, Object nativeImage) {
178 if (nativeImage == null) {
179 nativeImage = createImage(image.getSrc());
181 return drawImageImpl(context, nativeImage, sx, sy, sWidth, sHeight, x, y, width, height);
184 @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;")
185 private native static Object drawImageImpl(Object ctx, Object img, double x, double y, double width, double height);
187 @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;")
188 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);
190 @JavaScriptBody(args = {"ctx", "img", "x", "y"}, body = "img.onload=function(){ctx.drawImage(img,x,y);}; ctx.drawImage(img,x,y); return img;")
191 private native static Object drawImageImpl(Object ctx, Object img, double x, double y);
193 public Object setFillStyle(Style style, Object nativeStyle) {
194 if (nativeStyle == null) {
195 nativeStyle = createNativeStyle(style);
197 setFillStyleImpl(context, nativeStyle);
201 private Object createNativeStyle(Style style) {
202 if (style instanceof RadialGradient) {
203 RadialGradientWrapper gradient = createRadialGradientWrapper(
204 ((RadialGradient) style).getX0(),
205 ((RadialGradient) style).getY0(),
206 ((RadialGradient) style).getR0(),
207 ((RadialGradient) style).getX1(),
208 ((RadialGradient) style).getY1(),
209 ((RadialGradient) style).getR1());
210 HashMap<Double, String> stops = ((LinearGradient) style).getStops();
211 Set<Double> keySet = stops.keySet();
212 for (Double double1 : keySet) {
213 addColorStopImpl(style, double1, stops.get(double1));
218 } else if (style instanceof LinearGradient) {
219 LinearGradientWrapper gradient = createLinearGradientWrapper(
220 ((LinearGradient) style).getX0(),
221 ((LinearGradient) style).getY0(),
222 ((LinearGradient) style).getX1(),
223 ((LinearGradient) style).getY1());
224 HashMap<Double, String> stops = ((LinearGradient) style).getStops();
225 Set<Double> keySet = stops.keySet();
226 for (Double double1 : keySet) {
227 addColorStopImpl(style, double1, stops.get(double1));
230 } else if (style instanceof Pattern) {
231 return createPatternWrapper(((Pattern) style).getImageResource(), ((Pattern) style).getRepeat());
232 } else if (style instanceof Color) {
233 return ((Color) style)
239 @JavaScriptBody(args = {"gradient", "position", "color"}, body =
240 "gradient.addColorStop(position,color)")
241 private static native void addColorStopImpl(Object gradient, double position, String color);
243 @JavaScriptBody(args = {"context", "obj"}, body = "context.fillStyle=obj;")
244 private native void setFillStyleImpl(Object context, Object obj);
246 @JavaScriptBody(args = {"style"}, body = "this._context().strokeStyle=style.valueOf();")
247 public native void setStrokeStyle(String style);
250 public Object setStrokeStyle(Style style, Object nativeStyle) {
251 if (nativeStyle == null) {
252 nativeStyle = createNativeStyle(style);
254 setStrokeStyleImpl(context, nativeStyle);
258 @JavaScriptBody(args = {"context", "obj"}, body = "context.strokeStyle=obj;")
259 private native void setStrokeStyleImpl(Object context, Object obj);
261 @JavaScriptBody(args = {"color"}, body = "this._context().shadowColor=color.valueOf();")
263 public native void setShadowColor(String color);
265 @JavaScriptBody(args = {"blur"}, body = "this._context().shadowBlur=blur;")
267 public native void setShadowBlur(double blur);
269 @JavaScriptBody(args = {"x"}, body = "this._context().shadowOffsetX=x;")
271 public native void setShadowOffsetX(double x);
273 @JavaScriptBody(args = {"y"}, body = "this._context().shadowOffsetY=y;")
275 public native void setShadowOffsetY(double y);
277 @JavaScriptBody(args = {}, body = "return this._context().strokeStyle;")
278 public native String getStrokeStyle();
280 @JavaScriptBody(args = {}, body = "return this._context().shadowColor;")
282 public native String getShadowColor();
284 @JavaScriptBody(args = {}, body = "return this._context().shadowBlur;")
286 public native double getShadowBlur();
288 @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetX;")
290 public native double getShadowOffsetX();
292 @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetY;")
294 public native double getShadowOffsetY();
296 @JavaScriptBody(args = {}, body = "return this._context().lineCap;")
298 public native String getLineCap();
300 @JavaScriptBody(args = {"style"}, body = "this._context().lineCap=style.valueOf();")
302 public native void setLineCap(String style);
304 @JavaScriptBody(args = {}, body = "return this._context().lineJoin;")
306 public native String getLineJoin();
308 @JavaScriptBody(args = {"style"}, body = "this._context().lineJoin=style.valueOf();")
310 public native void setLineJoin(String style);
312 @JavaScriptBody(args = {}, body = "return this._context().lineWidth;")
314 public native double getLineWidth();
316 @JavaScriptBody(args = {"width"}, body = "this._context().lineWidth=width;")
318 public native void setLineWidth(double width);
320 @JavaScriptBody(args = {}, body = "return this._context().miterLimit;")
322 public native double getMiterLimit();
324 @JavaScriptBody(args = {"limit"}, body = "this._context().miterLimit=limit;")
326 public native void setMiterLimit(double limit);
328 @JavaScriptBody(args = {}, body = "return this._context().font;")
330 public native String getFont();
332 @JavaScriptBody(args = {"font"}, body = "this._context().font=font.valueOf();")
334 public native void setFont(String font);
336 @JavaScriptBody(args = {}, body = "return this._context().textAlign;")
338 public native String getTextAlign();
340 @JavaScriptBody(args = {"textalign"}, body = "this._context().textAlign=textalign.valueOf();")
342 public native void setTextAlign(String textAlign);
344 @JavaScriptBody(args = {}, body = "return this._context().textBaseline;")
346 public native String getTextBaseline();
348 @JavaScriptBody(args = {"textbaseline"}, body = "this._context().textBaseline=textbaseline.valueOf();")
350 public native void setTextBaseline(String textbaseline);
352 @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().fillText(text,x,y);")
353 // @JavaScriptBody(args = {"text", "x", "y"}, body = "console.log(text);")
355 public native void fillText(String text, double x, double y);
357 @JavaScriptBody(args = {"text", "x", "y", "maxwidth"}, body = "this._context().fillText(text,x,y,maxwidth);")
359 public void fillText(String text, double x, double y, double maxWidth) {
363 public Dimension measureText(String text) {
364 measureTextImpl(text);
365 return new Dimension(1, 1);
368 @JavaScriptBody(args = {"text"},
369 body = "return this._context().measureText(text);")
370 private native Object measureTextImpl(String text);
372 @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().strokeText(text,x,y);")
374 public native void strokeText(String text, double x, double y);
376 @JavaScriptBody(args = {"text", "x", "y", "maxWidth"}, body = "this._context().strokeText(text,x,y,maxWidth);")
378 public native void strokeText(String text, double x, double y, double maxWidth);
381 public ImageData createPixelMap(double x, double y) {
382 return new ImageDataWrapper(createPixelMapImpl(x, y));
385 @JavaScriptBody(args = {"x", "y"},
386 body = "return this._context().createImageData(x,y);")
387 private native Object createPixelMapImpl(double x, double y);
390 public ImageData createPixelMap(ImageData imageData) {
391 return new ImageDataWrapper(createPixelMapImpl(imageData.getWidth(), imageData.getHeight()));
395 public ImageData getPixelMap(double x, double y, double width, double height) {
396 return new ImageDataWrapper(getPixelMapImpl(x, y, width, height));
399 @JavaScriptBody(args = {"x", "y", "width", "height"},
400 body = "return this._context().getImageData(x,y,width,height);")
401 private native Object getPixelMapImpl(double x, double y, double width, double height);
404 public void putPixelMap(ImageData imageData, double x, double y) {
405 putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y);
408 @JavaScriptBody(args = {"imageData", "x", "y"},
409 body = "this._context().putImageData(imageData,x,y);")
410 private native void putPixelMapImpl(Object imageData, double x, double y);
413 public void putPixelMap(ImageData imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight) {
414 putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y, dirtyx, dirtyy, dirtywidth, dirtyheight);
417 @JavaScriptBody(args = {"imageData", "x", "y", "dirtyx", "dirtyy", "dirtywidth", "dirtyheight"},
418 body = "this._context().putImageData(imageData,x,y, dirtyx, dirtyy, dirtywidth,dirtyheight);")
419 private native void putPixelMapImpl(Object imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight);
421 @JavaScriptBody(args = {"alpha"}, body = "this._context().globalAlpha=alpha;")
423 public native void setGlobalAlpha(double alpha);
425 @JavaScriptBody(args = {}, body = "return this._context().globalAlpha;")
427 public native double getGlobalAlpha();
429 @JavaScriptBody(args = {"operation"}, body = "this._context().globalCompositeOperation=operation.valueOf();")
431 public native void setGlobalCompositeOperation(String operation);
433 @JavaScriptBody(args = {}, body = "return this._context().globalCompositeOperation;")
435 public native String getGlobalCompositeOperation();
437 public LinearGradientWrapper createLinearGradientWrapper(double x0, double y0, double x1, double y1) {
438 return new LinearGradientWrapper(createLinearGradientImpl(context, x0, y0, x1, y1));
441 @JavaScriptBody(args = {"context", "x0", "y0", "x1", "y1"}, body = "return context.createLinearGradient(x0,y0,x1,y1);")
442 private native Object createLinearGradientImpl(Object context, double x0, double y0, double x1, double y1);
444 public PatternWrapper createPatternWrapper(Image image, String repeat) {
445 return new PatternWrapper(createPatternImpl(context, image, repeat));
448 @JavaScriptBody(args = {"context", "image", "repeat"}, body = "return context.createPattern(image, repeat);")
449 private static native Object createPatternImpl(Object context, Image image, String repeat);
451 public RadialGradientWrapper createRadialGradientWrapper(double x0, double y0, double r0, double x1, double y1, double r1) {
452 return new RadialGradientWrapper(createRadialGradientImpl(context, x0, y0, r0, x1, y1, r1));
455 @JavaScriptBody(args = {"context", "x0", "y0", "r0", "x1", "y1", "r1"}, body = "return context.createRadialGradient(x0,y0,r0,x1,y1,r1);")
456 private static native Object createRadialGradientImpl(Object context, double x0, double y0, double r0, double x1, double y1, double r1);
458 // @JavaScriptBody(args = {"path"}, body = "var b = new Image(); b.src=path; return b;")
459 // public native Image getImageForPathImpl(String path);
461 public int getHeight() {
462 return canvas.getHeight();
466 public int getWidth() {
467 return canvas.getWidth();
471 public void setHeight(int height) {
472 canvas.setHeight(height);
476 public void setWidth(int width) {
477 canvas.setWidth(width);
480 // @JavaScriptBody(args = {"src"}, body = "var image = new Image();console.log('image complete '+image.complete);image.src = './'+ src; return image;")
481 @JavaScriptBody(args = {"src"}, body = "console.log ('looking up image by id '+src);return document.getElementById(src);")
482 private static native Object createImage(String src);
485 public int getWidth(Image image, Object nativeImage) {
487 if (nativeImage == null) {
488 nativeImage = createImage(image.getSrc());
491 return getWidth(nativeImage);
494 @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalWidth;")
495 private static native int getWidth(Object nativeImage);
498 public int getHeight(Image image, Object nativeImage) {
499 if (nativeImage == null) {
500 nativeImage = createImage(image.getSrc());
502 return getHeight(nativeImage);
505 @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalHeight;")
506 private static native int getHeight(Object nativeImage);
509 public Object mergeImages(Image a, Image b, Object cachedA, Object cachedB) {
510 return mergeImages(cachedA, cachedB);
513 @JavaScriptBody(args = {"img1", "img2"}, body = "var canvas = document.createElement('img');\n"
514 + "var context = canvas.getContext(\"2d\");\n"
515 + "var width = img1.width;\n"
516 + "var height = img1.height;\n"
517 + "canvas.width = width;\n"
518 + "canvas.height = height;\n"
519 + "context.drawImage(img1, 0, 0);\n"
520 + "context.drawImage(img2, 0, 0);\n"
521 + "url = canvas.toDataURL();\n"
522 + "var resultImage = document.createElement('img');\n"
523 + "resultImage.src=url;\n"
524 + "return resultImage;")
525 public static native Object mergeImages(Object img1, Object img2);