javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/HTML5GraphicsEnvironment.java
author Anton Epple <toni.epple@eppleton.de>
Wed, 12 Feb 2014 16:12:15 +0100
branchcanvas
changeset 1452 716529430700
parent 1306 304e6ee67862
permissions -rw-r--r--
fixed to match updated API
     1 /**
     2  * Back 2 Browser Bytecode Translator Copyright (C) 2012 Jaroslav Tulach
     3  * <jaroslav.tulach@apidesign.org>
     4  *
     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.
     8  *
     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
    12  * details.
    13  *
    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.
    17  */
    18 package org.apidesign.bck2brwsr.htmlpage;
    19 
    20 import java.util.HashMap;
    21 import java.util.Map;
    22 import java.util.Set;
    23 import net.java.html.canvas.Dimension;
    24 import net.java.html.canvas.Image;
    25 import net.java.html.canvas.ImageData;
    26 import net.java.html.canvas.Style;
    27 import net.java.html.canvas.Style.Color;
    28 import net.java.html.canvas.Style.LinearGradient;
    29 import net.java.html.canvas.Style.Pattern;
    30 import net.java.html.canvas.Style.RadialGradient;
    31 import net.java.html.canvas.spi.GraphicsEnvironment;
    32 import org.apidesign.bck2brwsr.core.JavaScriptBody;
    33 import org.apidesign.bck2brwsr.htmlpage.api.Canvas;
    34 import org.openide.util.lookup.ServiceProvider;
    35 
    36 /**
    37  *
    38  * @author Anton Epple <toni.epple@eppleton.de>
    39  */
    40 @ServiceProvider(service = GraphicsEnvironment.class)
    41 public class HTML5GraphicsEnvironment implements GraphicsEnvironment {
    42 
    43     Object context;
    44     Canvas canvas;
    45 
    46     public HTML5GraphicsEnvironment() {
    47     }
    48 
    49     
    50     
    51     public HTML5GraphicsEnvironment(Object contextImpl, Canvas canvas) {
    52         this.context = contextImpl;
    53         this.canvas = canvas;
    54     }
    55 
    56     @JavaScriptBody(args = {"centerx", "centery", "radius", "startangle", "endangle", "ccw"},
    57             body = "this._context().arc(centerx,centery, radius, startangle, endangle,ccw);")
    58     @Override
    59     public native void arc(double centerX,
    60             double centerY,
    61             double startAngle,
    62             double radius,
    63             double endAngle,
    64             boolean ccw);
    65 
    66     @JavaScriptBody(args = {"x1", "y1", "x2", "y2", "r"},
    67             body = "this._context().arcTo(x1,y1,x2,y2,r);")
    68     @Override
    69     public native void arcTo(double x1,
    70             double y1,
    71             double x2,
    72             double y2,
    73             double r);
    74 
    75     @JavaScriptBody(args = {"x", "y"},
    76             body = "return this._context().isPointInPath(x,y);")
    77     @Override
    78     public native boolean isPointInPath(double x, double y);
    79 
    80     @JavaScriptBody(args = {}, body = "this._context().fill();")
    81     @Override
    82     public native void fill();
    83 
    84     @JavaScriptBody(args = {}, body = "this._context().stroke();")
    85     @Override
    86     public native void stroke();
    87 
    88     @JavaScriptBody(args = {}, body = "this._context().beginPath();")
    89     @Override
    90     public native void beginPath();
    91 
    92     @JavaScriptBody(args = {}, body = "this._context().closePath();")
    93     @Override
    94     public native void closePath();
    95 
    96     @JavaScriptBody(args = {}, body = "this._context().clip();")
    97     @Override
    98     public native void clip();
    99 
   100     @JavaScriptBody(args = {"x", "y"}, body = "this._context().moveTo(x,y);")
   101     @Override
   102     public native void moveTo(double x, double y);
   103 
   104     @JavaScriptBody(args = {"x", "y"}, body = "this._context().lineTo(x,y);")
   105     @Override
   106     public native void lineTo(double x, double y);
   107 
   108     @JavaScriptBody(args = {"cpx", "cpy", "x", "y"}, body = "this._context().quadraticCurveTo(cpx,cpy,x,y);")
   109     @Override
   110     public native void quadraticCurveTo(double cpx, double cpy, double x, double y);
   111 
   112     @JavaScriptBody(args = {"cp1x", "cp1y", "cp2x", "cp2y", "x", "y"},
   113             body = "this._context().bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);")
   114     @Override
   115     public native void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y);
   116 
   117     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().fillRect(x,y,width,height);")
   118     @Override
   119     public native void fillRect(double x, double y, double width, double height);
   120 
   121     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().strokeRect(x,y,width,height);")
   122     @Override
   123     public native void strokeRect(double x, double y, double width, double height);
   124 
   125     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().clearRect(x,y,width,height);")
   126     @Override
   127     public native void clearRect(double x, double y, double width, double height);
   128 
   129     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().rect(x,y,width,height);")
   130     @Override
   131     public native void rect(double x, double y, double width, double height);
   132 
   133     @JavaScriptBody(args = {}, body = "this._context().save();")
   134     @Override
   135     public native void save();
   136 
   137     @JavaScriptBody(args = {}, body = "this._context().restore();")
   138     @Override
   139     public native void restore();
   140 
   141     @JavaScriptBody(args = {"angle"}, body = "this._context().rotate(angle);")
   142     @Override
   143     public native void rotate(double angle);
   144 
   145     @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().transform(a,b,c,d,e,f);")
   146     @Override
   147     public native void transform(double a, double b, double c, double d, double e, double f);
   148 
   149     @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().setTransform(a,b,c,d,e,f);")
   150     @Override
   151     public native void setTransform(double a, double b, double c, double d, double e, double f);
   152 
   153     @JavaScriptBody(args = {"x", "y"}, body = "this._context().translate(x,y);")
   154     @Override
   155     public native void translate(double x, double y);
   156 
   157     @JavaScriptBody(args = {"x", "y"}, body = "this._context().scale(x,y);")
   158     @Override
   159     public native void scale(double x, double y);
   160 
   161     @Override
   162     public Object drawImage(Image image, double x, double y, Object nativeImage) {
   163         if (nativeImage == null) {
   164             nativeImage = createImage(image.getSrc());
   165         }
   166         return drawImageImpl(context, nativeImage, x, y);
   167     }
   168 
   169     @Override
   170     public Object drawImage(Image image, double x, double y, double width, double height, Object nativeImage) {
   171         if (nativeImage == null) {
   172             nativeImage = createImage(image.getSrc());
   173         }
   174         return drawImageImpl(context, nativeImage, x, y, width, height);
   175     }
   176 
   177     @Override
   178     public Object drawImage(Image image, double sx, double sy, double sWidth, double sHeight, double x, double y, double width, double height, Object nativeImage) {
   179         if (nativeImage == null) {
   180             nativeImage = createImage(image.getSrc());
   181         }
   182         return drawImageImpl(context, nativeImage, sx, sy, sWidth, sHeight, x, y, width, height);
   183     }
   184 
   185     @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;")
   186     private native static Object drawImageImpl(Object ctx, Object img, double x, double y, double width, double height);
   187 
   188     @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;")
   189     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 
   191     @JavaScriptBody(args = {"ctx", "img", "x", "y"}, body = "img.onload=function(){ctx.drawImage(img,x,y);}; ctx.drawImage(img,x,y); return img;")
   192     private native static Object drawImageImpl(Object ctx, Object img, double x, double y);
   193 
   194     public Object setFillStyle(Style style, Object nativeStyle) {
   195         if (nativeStyle == null) {
   196             nativeStyle = createNativeStyle(style);
   197         }
   198         setFillStyleImpl(context, nativeStyle);
   199         return nativeStyle;
   200     }
   201 
   202     private Object createNativeStyle(Style style) {
   203         if (style instanceof RadialGradient) {
   204             RadialGradientWrapper gradient = createRadialGradientWrapper(
   205                     ((RadialGradient) style).getX0(),
   206                     ((RadialGradient) style).getY0(),
   207                     ((RadialGradient) style).getR0(),
   208                     ((RadialGradient) style).getX1(),
   209                     ((RadialGradient) style).getY1(),
   210                     ((RadialGradient) style).getR1());
   211             Map<Double, String> stops = ((LinearGradient) style).getStops();
   212             Set<Double> keySet = stops.keySet();
   213             for (Double double1 : keySet) {
   214                 addColorStopImpl(style, double1, stops.get(double1));
   215             }
   216             return gradient;
   217 
   218 
   219         } else if (style instanceof LinearGradient) {
   220             LinearGradientWrapper gradient = createLinearGradientWrapper(
   221                     ((LinearGradient) style).getX0(),
   222                     ((LinearGradient) style).getY0(),
   223                     ((LinearGradient) style).getX1(),
   224                     ((LinearGradient) style).getY1());
   225             Map<Double, String> stops = ((LinearGradient) style).getStops();
   226             Set<Double> keySet = stops.keySet();
   227             for (Double double1 : keySet) {
   228                 addColorStopImpl(style, double1, stops.get(double1));
   229             }
   230             return gradient;
   231         } else if (style instanceof Pattern) {
   232             return createPatternWrapper(((Pattern) style).getImageResource(), ((Pattern) style).getRepeat());
   233         } else if (style instanceof Color) {
   234             return ((Color) style)
   235                     .getAsString();
   236         }
   237         return null;
   238     }
   239 
   240     @JavaScriptBody(args = {"gradient", "position", "color"}, body =
   241             "gradient.addColorStop(position,color)")
   242     private static native void addColorStopImpl(Object gradient, double position, String color);
   243 
   244     @JavaScriptBody(args = {"context", "obj"}, body = "context.fillStyle=obj;")
   245     private native void setFillStyleImpl(Object context, Object obj);
   246 
   247     @JavaScriptBody(args = {"style"}, body = "this._context().strokeStyle=style.valueOf();")
   248     public native void setStrokeStyle(String style);
   249 
   250     @Override
   251     public Object setStrokeStyle(Style style, Object nativeStyle) {
   252         if (nativeStyle == null) {
   253             nativeStyle = createNativeStyle(style);
   254         }
   255         setStrokeStyleImpl(context, nativeStyle);
   256         return nativeStyle;
   257     }
   258 
   259     @JavaScriptBody(args = {"context", "obj"}, body = "context.strokeStyle=obj;")
   260     private native void setStrokeStyleImpl(Object context, Object obj);
   261 /*
   262     @JavaScriptBody(args = {"color"}, body = "this._context().shadowColor=color.valueOf();")
   263     @Override
   264     public native void setShadowColor(String color);
   265 
   266     @JavaScriptBody(args = {"blur"}, body = "this._context().shadowBlur=blur;")
   267     @Override
   268     public native void setShadowBlur(double blur);
   269 
   270     @JavaScriptBody(args = {"x"}, body = "this._context().shadowOffsetX=x;")
   271     @Override
   272     public native void setShadowOffsetX(double x);
   273 
   274     @JavaScriptBody(args = {"y"}, body = "this._context().shadowOffsetY=y;")
   275     @Override
   276     public native void setShadowOffsetY(double y);
   277 
   278     @JavaScriptBody(args = {}, body = "return this._context().strokeStyle;")
   279     public native String getStrokeStyle();
   280 
   281     @JavaScriptBody(args = {}, body = "return this._context().shadowColor;")
   282     @Override
   283     public native String getShadowColor();
   284 
   285     @JavaScriptBody(args = {}, body = "return this._context().shadowBlur;")
   286     @Override
   287     public native double getShadowBlur();
   288 
   289     @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetX;")
   290     @Override
   291     public native double getShadowOffsetX();
   292 
   293     @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetY;")
   294     @Override
   295     public native double getShadowOffsetY();
   296 */
   297     @JavaScriptBody(args = {}, body = "return this._context().lineCap;")
   298     @Override
   299     public native String getLineCap();
   300 
   301     @JavaScriptBody(args = {"style"}, body = "this._context().lineCap=style.valueOf();")
   302     @Override
   303     public native void setLineCap(String style);
   304 
   305     @JavaScriptBody(args = {}, body = "return this._context().lineJoin;")
   306     @Override
   307     public native String getLineJoin();
   308 
   309     @JavaScriptBody(args = {"style"}, body = "this._context().lineJoin=style.valueOf();")
   310     @Override
   311     public native void setLineJoin(String style);
   312 
   313     @JavaScriptBody(args = {}, body = "return this._context().lineWidth;")
   314     @Override
   315     public native double getLineWidth();
   316 
   317     @JavaScriptBody(args = {"width"}, body = "this._context().lineWidth=width;")
   318     @Override
   319     public native void setLineWidth(double width);
   320 
   321     @JavaScriptBody(args = {}, body = "return this._context().miterLimit;")
   322     @Override
   323     public native double getMiterLimit();
   324 
   325     @JavaScriptBody(args = {"limit"}, body = "this._context().miterLimit=limit;")
   326     @Override
   327     public native void setMiterLimit(double limit);
   328 
   329     @JavaScriptBody(args = {}, body = "return this._context().font;")
   330     @Override
   331     public native String getFont();
   332 
   333     @JavaScriptBody(args = {"font"}, body = "this._context().font=font.valueOf();")
   334     @Override
   335     public native void setFont(String font);
   336 
   337     @JavaScriptBody(args = {}, body = "return this._context().textAlign;")
   338     @Override
   339     public native String getTextAlign();
   340 
   341     @JavaScriptBody(args = {"textalign"}, body = "this._context().textAlign=textalign.valueOf();")
   342     @Override
   343     public native void setTextAlign(String textAlign);
   344 
   345     @JavaScriptBody(args = {}, body = "return this._context().textBaseline;")
   346     @Override
   347     public native String getTextBaseline();
   348 
   349     @JavaScriptBody(args = {"textbaseline"}, body = "this._context().textBaseline=textbaseline.valueOf();")
   350     @Override
   351     public native void setTextBaseline(String textbaseline);
   352 
   353     @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().fillText(text,x,y);")
   354 //    @JavaScriptBody(args = {"text", "x", "y"}, body = "console.log(text);")
   355     @Override
   356     public native void fillText(String text, double x, double y);
   357 
   358     @JavaScriptBody(args = {"text", "x", "y", "maxwidth"}, body = "this._context().fillText(text,x,y,maxwidth);")
   359     @Override
   360     public void fillText(String text, double x, double y, double maxWidth) {
   361     }
   362 
   363     @Override
   364     public Dimension measureText(String text) {
   365         measureTextImpl(text);
   366         return new Dimension(1, 1);
   367     }
   368 
   369     @JavaScriptBody(args = {"text"},
   370             body = "return this._context().measureText(text);")
   371     private native Object measureTextImpl(String text);
   372 
   373     @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().strokeText(text,x,y);")
   374     @Override
   375     public native void strokeText(String text, double x, double y);
   376 
   377     @JavaScriptBody(args = {"text", "x", "y", "maxWidth"}, body = "this._context().strokeText(text,x,y,maxWidth);")
   378     @Override
   379     public native void strokeText(String text, double x, double y, double maxWidth);
   380 
   381     @Override
   382     public ImageData createPixelMap(double x, double y) {
   383         return new ImageDataWrapper(createPixelMapImpl(x, y));
   384     }
   385 
   386     @JavaScriptBody(args = {"x", "y"},
   387             body = "return this._context().createImageData(x,y);")
   388     private native Object createPixelMapImpl(double x, double y);
   389 
   390     @Override
   391     public ImageData createPixelMap(ImageData imageData) {
   392         return new ImageDataWrapper(createPixelMapImpl(imageData.getWidth(), imageData.getHeight()));
   393     }
   394 
   395     @Override
   396     public ImageData getPixelMap(double x, double y, double width, double height) {
   397         return new ImageDataWrapper(getPixelMapImpl(x, y, width, height));
   398     }
   399     
   400     @JavaScriptBody(args = {"x", "y", "width", "height"},
   401             body = "return this._context().getImageData(x,y,width,height);")
   402     private native Object getPixelMapImpl(double x, double y, double width, double height);
   403 
   404     @Override
   405     public void putPixelMap(ImageData imageData, double x, double y) {
   406         putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y);
   407     }
   408 
   409     @JavaScriptBody(args = {"imageData", "x", "y"},
   410             body = "this._context().putImageData(imageData,x,y);")
   411     private native void putPixelMapImpl(Object imageData, double x, double y);
   412 
   413     @Override
   414     public void putPixelMap(ImageData imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight) {
   415         putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y, dirtyx, dirtyy, dirtywidth, dirtyheight);
   416     }
   417 
   418     @JavaScriptBody(args = {"imageData", "x", "y", "dirtyx", "dirtyy", "dirtywidth", "dirtyheight"},
   419             body = "this._context().putImageData(imageData,x,y, dirtyx, dirtyy, dirtywidth,dirtyheight);")
   420     private native void putPixelMapImpl(Object imageData, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight);
   421 
   422     @JavaScriptBody(args = {"alpha"}, body = "this._context().globalAlpha=alpha;")
   423     @Override
   424     public native void setGlobalAlpha(double alpha);
   425 
   426     @JavaScriptBody(args = {}, body = "return this._context().globalAlpha;")
   427     @Override
   428     public native double getGlobalAlpha();
   429 
   430     @JavaScriptBody(args = {"operation"}, body = "this._context().globalCompositeOperation=operation.valueOf();")
   431     @Override
   432     public native void setGlobalCompositeOperation(String operation);
   433 
   434     @JavaScriptBody(args = {}, body = "return this._context().globalCompositeOperation;")
   435     @Override
   436     public native String getGlobalCompositeOperation();
   437 
   438     public LinearGradientWrapper createLinearGradientWrapper(double x0, double y0, double x1, double y1) {
   439         return new LinearGradientWrapper(createLinearGradientImpl(context, x0, y0, x1, y1));
   440     }
   441 
   442     @JavaScriptBody(args = {"context", "x0", "y0", "x1", "y1"}, body = "return context.createLinearGradient(x0,y0,x1,y1);")
   443     private native Object createLinearGradientImpl(Object context, double x0, double y0, double x1, double y1);
   444 
   445     public PatternWrapper createPatternWrapper(Image image, String repeat) {
   446         return new PatternWrapper(createPatternImpl(context, image, repeat));
   447     }
   448 
   449     @JavaScriptBody(args = {"context", "image", "repeat"}, body = "return context.createPattern(image, repeat);")
   450     private static native Object createPatternImpl(Object context, Image image, String repeat);
   451 
   452     public RadialGradientWrapper createRadialGradientWrapper(double x0, double y0, double r0, double x1, double y1, double r1) {
   453         return new RadialGradientWrapper(createRadialGradientImpl(context, x0, y0, r0, x1, y1, r1));
   454     }
   455 
   456     @JavaScriptBody(args = {"context", "x0", "y0", "r0", "x1", "y1", "r1"}, body = "return context.createRadialGradient(x0,y0,r0,x1,y1,r1);")
   457     private static native Object createRadialGradientImpl(Object context, double x0, double y0, double r0, double x1, double y1, double r1);
   458 
   459 //    @JavaScriptBody(args = {"path"}, body = "var b = new Image(); b.src=path; return b;")
   460 //    public native Image getImageForPathImpl(String path);
   461     @Override
   462     public int getHeight() {
   463         return canvas.getHeight();
   464     }
   465 
   466     @Override
   467     public int getWidth() {
   468         return canvas.getWidth();
   469     }
   470 /*
   471     @Override
   472     public void setHeight(int height) {
   473         canvas.setHeight(height);
   474     }
   475 
   476     @Override
   477     public void setWidth(int width) {
   478         canvas.setWidth(width);
   479     }
   480 */
   481 //    @JavaScriptBody(args = {"src"}, body = "var image = new Image();console.log('image complete '+image.complete);image.src = './'+ src; return image;")
   482     @JavaScriptBody(args = {"src"}, body = "console.log ('looking up image by id '+src);return document.getElementById(src);")
   483     private static native Object createImage(String src);
   484 
   485     @Override
   486     public int getWidth(Image image, Object nativeImage) {
   487        
   488         if (nativeImage == null) {
   489             nativeImage = createImage(image.getSrc());
   490            
   491         }
   492         return getWidth(nativeImage);
   493     }
   494 
   495     @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalWidth;")
   496     private static native int getWidth(Object nativeImage);
   497 
   498     @Override
   499     public int getHeight(Image image, Object nativeImage) {
   500         if (nativeImage == null) {
   501             nativeImage = createImage(image.getSrc());
   502         }
   503         return getHeight(nativeImage);
   504     }
   505 
   506     @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalHeight;")
   507     private static native int getHeight(Object nativeImage);
   508 
   509     @Override
   510     public Object mergeImages(Image a, Image b, Object cachedA, Object cachedB) {
   511         return mergeImages(cachedA, cachedB);
   512     }
   513 
   514     @JavaScriptBody(args = {"img1", "img2"}, body = "var canvas = document.createElement('img');\n"
   515             + "var context = canvas.getContext(\"2d\");\n"
   516             + "var width = img1.width;\n"
   517             + "var height = img1.height;\n"
   518             + "canvas.width = width;\n"
   519             + "canvas.height = height;\n"
   520             + "context.drawImage(img1, 0, 0);\n"
   521             + "context.drawImage(img2, 0, 0);\n"
   522             + "url = canvas.toDataURL();\n"
   523             + "var resultImage = document.createElement('img');\n"
   524             + "resultImage.src=url;\n"
   525             + "return resultImage;")
   526     public static native Object mergeImages(Object img1, Object img2);
   527 }