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