javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/HTML5GraphicsEnvironment.java
author Anton Epple <toni.epple@eppleton.de>
Mon, 23 Sep 2013 07:09:13 -0700
branchcanvas
changeset 1296 6fed3663b751
parent 1267 0f775bd8d210
child 1306 304e6ee67862
permissions -rw-r--r--
Fixed bug in logger & registered Graphicsenvironment service
     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.Set;
    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;
    34 
    35 /**
    36  *
    37  * @author Anton Epple <toni.epple@eppleton.de>
    38  */
    39 @ServiceProvider(service = GraphicsEnvironment.class)
    40 public class HTML5GraphicsEnvironment implements GraphicsEnvironment {
    41 
    42     Object context;
    43     Canvas canvas;
    44 
    45     public HTML5GraphicsEnvironment() {
    46     }
    47 
    48     
    49     
    50     public HTML5GraphicsEnvironment(Object contextImpl, Canvas canvas) {
    51         this.context = contextImpl;
    52         this.canvas = canvas;
    53     }
    54 
    55     @JavaScriptBody(args = {"centerx", "centery", "radius", "startangle", "endangle", "ccw"},
    56             body = "this._context().arc(centerx,centery, radius, startangle, endangle,ccw);")
    57     @Override
    58     public native void arc(double centerX,
    59             double centerY,
    60             double startAngle,
    61             double radius,
    62             double endAngle,
    63             boolean ccw);
    64 
    65     @JavaScriptBody(args = {"x1", "y1", "x2", "y2", "r"},
    66             body = "this._context().arcTo(x1,y1,x2,y2,r);")
    67     @Override
    68     public native void arcTo(double x1,
    69             double y1,
    70             double x2,
    71             double y2,
    72             double r);
    73 
    74     @JavaScriptBody(args = {"x", "y"},
    75             body = "return this._context().isPointInPath(x,y);")
    76     @Override
    77     public native boolean isPointInPath(double x, double y);
    78 
    79     @JavaScriptBody(args = {}, body = "this._context().fill();")
    80     @Override
    81     public native void fill();
    82 
    83     @JavaScriptBody(args = {}, body = "this._context().stroke();")
    84     @Override
    85     public native void stroke();
    86 
    87     @JavaScriptBody(args = {}, body = "this._context().beginPath();")
    88     @Override
    89     public native void beginPath();
    90 
    91     @JavaScriptBody(args = {}, body = "this._context().closePath();")
    92     @Override
    93     public native void closePath();
    94 
    95     @JavaScriptBody(args = {}, body = "this._context().clip();")
    96     @Override
    97     public native void clip();
    98 
    99     @JavaScriptBody(args = {"x", "y"}, body = "this._context().moveTo(x,y);")
   100     @Override
   101     public native void moveTo(double x, double y);
   102 
   103     @JavaScriptBody(args = {"x", "y"}, body = "this._context().lineTo(x,y);")
   104     @Override
   105     public native void lineTo(double x, double y);
   106 
   107     @JavaScriptBody(args = {"cpx", "cpy", "x", "y"}, body = "this._context().quadraticCurveTo(cpx,cpy,x,y);")
   108     @Override
   109     public native void quadraticCurveTo(double cpx, double cpy, double x, double y);
   110 
   111     @JavaScriptBody(args = {"cp1x", "cp1y", "cp2x", "cp2y", "x", "y"},
   112             body = "this._context().bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);")
   113     @Override
   114     public native void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y);
   115 
   116     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().fillRect(x,y,width,height);")
   117     @Override
   118     public native void fillRect(double x, double y, double width, double height);
   119 
   120     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().strokeRect(x,y,width,height);")
   121     @Override
   122     public native void strokeRect(double x, double y, double width, double height);
   123 
   124     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().clearRect(x,y,width,height);")
   125     @Override
   126     public native void clearRect(double x, double y, double width, double height);
   127 
   128     @JavaScriptBody(args = {"x", "y", "width", "height"}, body = "this._context().rect(x,y,width,height);")
   129     @Override
   130     public native void rect(double x, double y, double width, double height);
   131 
   132     @JavaScriptBody(args = {}, body = "this._context().save();")
   133     @Override
   134     public native void save();
   135 
   136     @JavaScriptBody(args = {}, body = "this._context().restore();")
   137     @Override
   138     public native void restore();
   139 
   140     @JavaScriptBody(args = {"angle"}, body = "this._context().rotate(angle);")
   141     @Override
   142     public native void rotate(double angle);
   143 
   144     @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().transform(a,b,c,d,e,f);")
   145     @Override
   146     public native void transform(double a, double b, double c, double d, double e, double f);
   147 
   148     @JavaScriptBody(args = {"a", "b", "c", "d", "e", "f"}, body = "this._context().setTransform(a,b,c,d,e,f);")
   149     @Override
   150     public native void setTransform(double a, double b, double c, double d, double e, double f);
   151 
   152     @JavaScriptBody(args = {"x", "y"}, body = "this._context().translate(x,y);")
   153     @Override
   154     public native void translate(double x, double y);
   155 
   156     @JavaScriptBody(args = {"x", "y"}, body = "this._context().scale(x,y);")
   157     @Override
   158     public native void scale(double x, double y);
   159 
   160     @Override
   161     public Object drawImage(Image image, double x, double y, Object nativeImage) {
   162         if (nativeImage == null) {
   163             nativeImage = createImage(image.getSrc());
   164         }
   165         return drawImageImpl(context, nativeImage, x, y);
   166     }
   167 
   168     @Override
   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());
   172         }
   173         return drawImageImpl(context, nativeImage, x, y, width, height);
   174     }
   175 
   176     @Override
   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());
   180         }
   181         return drawImageImpl(context, nativeImage, sx, sy, sWidth, sHeight, x, y, width, height);
   182     }
   183 
   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);
   186 
   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);
   189 
   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);
   192 
   193     public Object setFillStyle(Style style, Object nativeStyle) {
   194         if (nativeStyle == null) {
   195             nativeStyle = createNativeStyle(style);
   196         }
   197         setFillStyleImpl(context, nativeStyle);
   198         return nativeStyle;
   199     }
   200 
   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));
   214             }
   215             return gradient;
   216 
   217 
   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));
   228             }
   229             return gradient;
   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)
   234                     .getAsString();
   235         }
   236         return null;
   237     }
   238 
   239     @JavaScriptBody(args = {"gradient", "position", "color"}, body =
   240             "gradient.addColorStop(position,color)")
   241     private static native void addColorStopImpl(Object gradient, double position, String color);
   242 
   243     @JavaScriptBody(args = {"context", "obj"}, body = "context.fillStyle=obj;")
   244     private native void setFillStyleImpl(Object context, Object obj);
   245 
   246     @JavaScriptBody(args = {"style"}, body = "this._context().strokeStyle=style.valueOf();")
   247     public native void setStrokeStyle(String style);
   248 
   249     @Override
   250     public Object setStrokeStyle(Style style, Object nativeStyle) {
   251         if (nativeStyle == null) {
   252             nativeStyle = createNativeStyle(style);
   253         }
   254         setStrokeStyleImpl(context, nativeStyle);
   255         return nativeStyle;
   256     }
   257 
   258     @JavaScriptBody(args = {"context", "obj"}, body = "context.strokeStyle=obj;")
   259     private native void setStrokeStyleImpl(Object context, Object obj);
   260 
   261     @JavaScriptBody(args = {"color"}, body = "this._context().shadowColor=color.valueOf();")
   262     @Override
   263     public native void setShadowColor(String color);
   264 
   265     @JavaScriptBody(args = {"blur"}, body = "this._context().shadowBlur=blur;")
   266     @Override
   267     public native void setShadowBlur(double blur);
   268 
   269     @JavaScriptBody(args = {"x"}, body = "this._context().shadowOffsetX=x;")
   270     @Override
   271     public native void setShadowOffsetX(double x);
   272 
   273     @JavaScriptBody(args = {"y"}, body = "this._context().shadowOffsetY=y;")
   274     @Override
   275     public native void setShadowOffsetY(double y);
   276 
   277     @JavaScriptBody(args = {}, body = "return this._context().strokeStyle;")
   278     public native String getStrokeStyle();
   279 
   280     @JavaScriptBody(args = {}, body = "return this._context().shadowColor;")
   281     @Override
   282     public native String getShadowColor();
   283 
   284     @JavaScriptBody(args = {}, body = "return this._context().shadowBlur;")
   285     @Override
   286     public native double getShadowBlur();
   287 
   288     @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetX;")
   289     @Override
   290     public native double getShadowOffsetX();
   291 
   292     @JavaScriptBody(args = {}, body = "return this._context().shadowOffsetY;")
   293     @Override
   294     public native double getShadowOffsetY();
   295 
   296     @JavaScriptBody(args = {}, body = "return this._context().lineCap;")
   297     @Override
   298     public native String getLineCap();
   299 
   300     @JavaScriptBody(args = {"style"}, body = "this._context().lineCap=style.valueOf();")
   301     @Override
   302     public native void setLineCap(String style);
   303 
   304     @JavaScriptBody(args = {}, body = "return this._context().lineJoin;")
   305     @Override
   306     public native String getLineJoin();
   307 
   308     @JavaScriptBody(args = {"style"}, body = "this._context().lineJoin=style.valueOf();")
   309     @Override
   310     public native void setLineJoin(String style);
   311 
   312     @JavaScriptBody(args = {}, body = "return this._context().lineWidth;")
   313     @Override
   314     public native double getLineWidth();
   315 
   316     @JavaScriptBody(args = {"width"}, body = "this._context().lineWidth=width;")
   317     @Override
   318     public native void setLineWidth(double width);
   319 
   320     @JavaScriptBody(args = {}, body = "return this._context().miterLimit;")
   321     @Override
   322     public native double getMiterLimit();
   323 
   324     @JavaScriptBody(args = {"limit"}, body = "this._context().miterLimit=limit;")
   325     @Override
   326     public native void setMiterLimit(double limit);
   327 
   328     @JavaScriptBody(args = {}, body = "return this._context().font;")
   329     @Override
   330     public native String getFont();
   331 
   332     @JavaScriptBody(args = {"font"}, body = "this._context().font=font.valueOf();")
   333     @Override
   334     public native void setFont(String font);
   335 
   336     @JavaScriptBody(args = {}, body = "return this._context().textAlign;")
   337     @Override
   338     public native String getTextAlign();
   339 
   340     @JavaScriptBody(args = {"textalign"}, body = "this._context().textAlign=textalign.valueOf();")
   341     @Override
   342     public native void setTextAlign(String textAlign);
   343 
   344     @JavaScriptBody(args = {}, body = "return this._context().textBaseline;")
   345     @Override
   346     public native String getTextBaseline();
   347 
   348     @JavaScriptBody(args = {"textbaseline"}, body = "this._context().textBaseline=textbaseline.valueOf();")
   349     @Override
   350     public native void setTextBaseline(String textbaseline);
   351 
   352     @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().fillText(text,x,y);")
   353 //    @JavaScriptBody(args = {"text", "x", "y"}, body = "console.log(text);")
   354     @Override
   355     public native void fillText(String text, double x, double y);
   356 
   357     @JavaScriptBody(args = {"text", "x", "y", "maxwidth"}, body = "this._context().fillText(text,x,y,maxwidth);")
   358     @Override
   359     public void fillText(String text, double x, double y, double maxWidth) {
   360     }
   361 
   362     @Override
   363     public Dimension measureText(String text) {
   364         measureTextImpl(text);
   365         return new Dimension(1, 1);
   366     }
   367 
   368     @JavaScriptBody(args = {"text"},
   369             body = "return this._context().measureText(text);")
   370     private native Object measureTextImpl(String text);
   371 
   372     @JavaScriptBody(args = {"text", "x", "y"}, body = "this._context().strokeText(text,x,y);")
   373     @Override
   374     public native void strokeText(String text, double x, double y);
   375 
   376     @JavaScriptBody(args = {"text", "x", "y", "maxWidth"}, body = "this._context().strokeText(text,x,y,maxWidth);")
   377     @Override
   378     public native void strokeText(String text, double x, double y, double maxWidth);
   379 
   380     @Override
   381     public ImageData createPixelMap(double x, double y) {
   382         return new ImageDataWrapper(createPixelMapImpl(x, y));
   383     }
   384 
   385     @JavaScriptBody(args = {"x", "y"},
   386             body = "return this._context().createImageData(x,y);")
   387     private native Object createPixelMapImpl(double x, double y);
   388 
   389     @Override
   390     public ImageData createPixelMap(ImageData imageData) {
   391         return new ImageDataWrapper(createPixelMapImpl(imageData.getWidth(), imageData.getHeight()));
   392     }
   393 
   394     @Override
   395     public ImageData getPixelMap(double x, double y, double width, double height) {
   396         return new ImageDataWrapper(getPixelMapImpl(x, y, width, height));
   397     }
   398 
   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);
   402 
   403     @Override
   404     public void putPixelMap(ImageData imageData, double x, double y) {
   405         putPixelMapImpl(((ImageDataWrapper) imageData).object(), x, y);
   406     }
   407 
   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);
   411 
   412     @Override
   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);
   415     }
   416 
   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);
   420 
   421     @JavaScriptBody(args = {"alpha"}, body = "this._context().globalAlpha=alpha;")
   422     @Override
   423     public native void setGlobalAlpha(double alpha);
   424 
   425     @JavaScriptBody(args = {}, body = "return this._context().globalAlpha;")
   426     @Override
   427     public native double getGlobalAlpha();
   428 
   429     @JavaScriptBody(args = {"operation"}, body = "this._context().globalCompositeOperation=operation.valueOf();")
   430     @Override
   431     public native void setGlobalCompositeOperation(String operation);
   432 
   433     @JavaScriptBody(args = {}, body = "return this._context().globalCompositeOperation;")
   434     @Override
   435     public native String getGlobalCompositeOperation();
   436 
   437     public LinearGradientWrapper createLinearGradientWrapper(double x0, double y0, double x1, double y1) {
   438         return new LinearGradientWrapper(createLinearGradientImpl(context, x0, y0, x1, y1));
   439     }
   440 
   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);
   443 
   444     public PatternWrapper createPatternWrapper(Image image, String repeat) {
   445         return new PatternWrapper(createPatternImpl(context, image, repeat));
   446     }
   447 
   448     @JavaScriptBody(args = {"context", "image", "repeat"}, body = "return context.createPattern(image, repeat);")
   449     private static native Object createPatternImpl(Object context, Image image, String repeat);
   450 
   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));
   453     }
   454 
   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);
   457 
   458 //    @JavaScriptBody(args = {"path"}, body = "var b = new Image(); b.src=path; return b;")
   459 //    public native Image getImageForPathImpl(String path);
   460     @Override
   461     public int getHeight() {
   462         return canvas.getHeight();
   463     }
   464 
   465     @Override
   466     public int getWidth() {
   467         return canvas.getWidth();
   468     }
   469 
   470     @Override
   471     public void setHeight(int height) {
   472         canvas.setHeight(height);
   473     }
   474 
   475     @Override
   476     public void setWidth(int width) {
   477         canvas.setWidth(width);
   478     }
   479 
   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);
   483 
   484     @Override
   485     public int getWidth(Image image, Object nativeImage) {
   486        
   487         if (nativeImage == null) {
   488             nativeImage = createImage(image.getSrc());
   489            
   490         }
   491         return getWidth(nativeImage);
   492     }
   493 
   494     @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalWidth;")
   495     private static native int getWidth(Object nativeImage);
   496 
   497     @Override
   498     public int getHeight(Image image, Object nativeImage) {
   499         if (nativeImage == null) {
   500             nativeImage = createImage(image.getSrc());
   501         }
   502         return getHeight(nativeImage);
   503     }
   504 
   505     @JavaScriptBody(args = {"nativeImage"}, body = "return nativeImage.naturalHeight;")
   506     private static native int getHeight(Object nativeImage);
   507 
   508     @Override
   509     public Object mergeImages(Image a, Image b, Object cachedA, Object cachedB) {
   510         return mergeImages(cachedA, cachedB);
   511     }
   512 
   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);
   526 }