javaquery/canvas/src/main/java/net/java/html/canvas/GraphicsContext.java
author Anton Epple <toni.epple@eppleton.de>
Wed, 12 Feb 2014 14:46:40 +0100
branchcanvas
changeset 1451 76859a545dd7
parent 1450 0726c9779524
permissions -rw-r--r--
added missing javadoc
toni@1111
     1
/**
toni@1443
     2
 * Back 2 Browser Bytecode Translator Copyright (C) 2012 Jaroslav Tulach
toni@1443
     3
 * <jaroslav.tulach@apidesign.org>
toni@1111
     4
 *
toni@1443
     5
 * This program is free software: you can redistribute it and/or modify it under
toni@1443
     6
 * the terms of the GNU General Public License as published by the Free Software
toni@1443
     7
 * Foundation, version 2 of the License.
toni@1111
     8
 *
toni@1443
     9
 * This program is distributed in the hope that it will be useful, but WITHOUT
toni@1443
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
toni@1443
    11
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
toni@1443
    12
 * details.
toni@1111
    13
 *
toni@1443
    14
 * You should have received a copy of the GNU General Public License along with
toni@1443
    15
 * this program. Look for COPYING file in the top folder. If not, see
toni@1443
    16
 * http://opensource.org/licenses/GPL-2.0.
toni@521
    17
 */
toni@1109
    18
package net.java.html.canvas;
toni@521
    19
toni@1449
    20
import java.util.Map;
toni@1150
    21
import net.java.html.canvas.Style.Color;
toni@1150
    22
import net.java.html.canvas.Style.LinearGradient;
toni@1150
    23
import net.java.html.canvas.Style.Pattern;
toni@1150
    24
import net.java.html.canvas.Style.RadialGradient;
toni@1136
    25
import net.java.html.canvas.spi.GraphicsEnvironment;
toni@1302
    26
import org.apidesign.html.canvas.impl.CnvsAccssr;
toni@521
    27
toni@521
    28
/**
toni@1302
    29
 * A 2D Graphics Context similar to HTML5 or JavaFX GraphicsContext. Use this to
toni@1443
    30
 * paint on your Canvas
toni@1302
    31
 *
toni@1109
    32
 * @author antonepple
toni@521
    33
 */
toni@1128
    34
public final class GraphicsContext {
toni@1128
    35
toni@1449
    36
    public static void init() {
toni@1444
    37
        // do nothing we need this in order to have the class loaded and static 
toni@1444
    38
        // block executed for CnvsAccssr.
toni@1442
    39
    }
toni@1442
    40
toni@1128
    41
    GraphicsEnvironment graphicsEnvironmentImpl;
toni@1128
    42
toni@1302
    43
    static {
toni@1302
    44
        CnvsAccssr cnvsAccssr = new CnvsAccssr() {
toni@1302
    45
            @Override
toni@1302
    46
            public GraphicsContext create(GraphicsEnvironment environment) {
toni@1302
    47
                return new GraphicsContext(environment);
toni@1302
    48
            }
toni@1302
    49
        };
toni@1302
    50
    }
toni@1302
    51
toni@1302
    52
    GraphicsContext(GraphicsEnvironment graphicsEnvironment) {
toni@1128
    53
        this.graphicsEnvironmentImpl = graphicsEnvironment;
toni@1128
    54
    }
toni@521
    55
toni@1302
    56
    /**
toni@1302
    57
     * Adds path elements to the current path to make an arc.
toni@1302
    58
     *
toni@1302
    59
     * @param centerX the center x position of the arc.
toni@1302
    60
     * @param centerY the center y position of the arc.
toni@1447
    61
     * @param startAngle the startAngle of the arc
toni@1302
    62
     * @param radius the radius of the arc.
toni@1447
    63
     * @param endAngle the endAngle of the arc
toni@1302
    64
     * @param ccw the direction of the arc (counterclockwise)
toni@1302
    65
     */
toni@1111
    66
    public void arc(double centerX,
toni@1111
    67
            double centerY,
toni@1111
    68
            double startAngle,
toni@1111
    69
            double radius,
toni@1111
    70
            double endAngle,
toni@1128
    71
            boolean ccw) {
toni@1128
    72
        graphicsEnvironmentImpl.arc(centerX, centerY, startAngle, radius, endAngle, ccw);
toni@1128
    73
    }
toni@521
    74
toni@1302
    75
    /**
toni@1302
    76
     * Adds segments to the current path to make an arc.
toni@1302
    77
     *
toni@1302
    78
     * @param x1 the X coordinate of the first point of the arc.
toni@1302
    79
     * @param y1 the Y coordinate of the first point of the arc.
toni@1302
    80
     * @param x2 the X coordinate of the second point of the arc.
toni@1302
    81
     * @param y2 the Y coordinate of the second point of the arc.
toni@1302
    82
     * @param radius the radius of the arc in the range {0.0-positive infinity}.
toni@1302
    83
     */
toni@1111
    84
    public void arcTo(double x1,
toni@1111
    85
            double y1,
toni@1111
    86
            double x2,
toni@1111
    87
            double y2,
toni@1302
    88
            double radius) {
toni@1302
    89
        graphicsEnvironmentImpl.arcTo(x1, y1, x2, y2, radius);
toni@1128
    90
    }
toni@521
    91
toni@1302
    92
    /**
toni@1302
    93
     * Returns true if the the given x,y point is inside the path.
toni@1302
    94
     *
toni@1302
    95
     * @param x the X coordinate to use for the check.
toni@1302
    96
     * @param y the Y coordinate to use for the check.
toni@1302
    97
     * @return true if the point given is inside the path, false otherwise.
toni@1302
    98
     */
toni@1128
    99
    public boolean isPointInPath(double x, double y) {
toni@1128
   100
        return graphicsEnvironmentImpl.isPointInPath(x, y);
toni@1128
   101
    }
toni@521
   102
toni@1302
   103
    /**
toni@1302
   104
     * Fills the path with the current fill paint.
toni@1302
   105
     */
toni@1128
   106
    public void fill() {
toni@1128
   107
        graphicsEnvironmentImpl.fill();
toni@1128
   108
    }
toni@521
   109
toni@1302
   110
    /**
toni@1302
   111
     * Strokes the path with the current stroke paint.
toni@1302
   112
     */
toni@1128
   113
    public void stroke() {
toni@1128
   114
        graphicsEnvironmentImpl.stroke();
toni@1128
   115
    }
toni@1109
   116
toni@1302
   117
    /**
toni@1302
   118
     * Starts a Path
toni@1302
   119
     */
toni@1128
   120
    public void beginPath() {
toni@1128
   121
        graphicsEnvironmentImpl.beginPath();
toni@1128
   122
    }
toni@1109
   123
toni@1302
   124
    /**
toni@1302
   125
     * Closes the path.
toni@1302
   126
     */
toni@1302
   127
    public void closePath() {
toni@1128
   128
        graphicsEnvironmentImpl.closePath();
toni@1128
   129
    }
toni@521
   130
toni@1302
   131
    /**
toni@1302
   132
     * Clips using the current path
toni@1302
   133
     */
toni@1302
   134
    public void clip() {
toni@1128
   135
        graphicsEnvironmentImpl.clip();
toni@1128
   136
    }
toni@1109
   137
toni@1302
   138
    /**
toni@1302
   139
     * Issues a move command for the current path to the given x,y coordinate.
toni@1302
   140
     *
toni@1302
   141
     * @param x0 the X position for the move to command.
toni@1302
   142
     * @param y0 the Y position for the move to command.
toni@1302
   143
     */
toni@1302
   144
    public void moveTo(double x, double y) {
toni@1128
   145
        graphicsEnvironmentImpl.moveTo(x, y);
toni@1128
   146
    }
toni@1109
   147
toni@1302
   148
    /**
toni@1302
   149
     * Adds segments to the current path to make a line at the given x,y
toni@1302
   150
     * coordinate.
toni@1302
   151
     *
toni@1302
   152
     * @param x1 the X coordinate of the ending point of the line.
toni@1302
   153
     * @param y1 the Y coordinate of the ending point of the line.
toni@1302
   154
     */
toni@1302
   155
    public void lineTo(double x, double y) {
toni@1128
   156
        graphicsEnvironmentImpl.lineTo(x, y);
toni@1128
   157
    }
toni@1109
   158
toni@1302
   159
    /**
toni@1302
   160
     * Adds segments to the current path to make a quadratic curve.
toni@1302
   161
     *
toni@1302
   162
     * @param cpx the X coordinate of the control point
toni@1302
   163
     * @param cpy the Y coordinate of the control point
toni@1302
   164
     * @param x the X coordinate of the end point
toni@1302
   165
     * @param y the Y coordinate of the end point
toni@1302
   166
     */
toni@1302
   167
    public void quadraticCurveTo(double cpx, double cpy, double x, double y) {
toni@1302
   168
        graphicsEnvironmentImpl.quadraticCurveTo(cpx, cpy, x, y);
toni@1128
   169
    }
toni@1109
   170
toni@1302
   171
    /**
toni@1302
   172
     * Adds segments to the current path to make a cubic bezier curve.
toni@1302
   173
     *
toni@1302
   174
     * @param cp1x the X coordinate of first bezier control point.
toni@1302
   175
     * @param cp1y the Y coordinate of the first bezier control point.
toni@1302
   176
     * @param cp2x the X coordinate of the second bezier control point.
toni@1302
   177
     * @param cp2y the Y coordinate of the second bezier control point.
toni@1302
   178
     * @param x the X coordinate of the end point.
toni@1302
   179
     * @param y the Y coordinate of the end point.
toni@1302
   180
     */
toni@1302
   181
    public void bezierCurveTo(double cp1x, double cp1y, double cp2x, double cp2y, double x, double y) {
toni@1128
   182
        graphicsEnvironmentImpl.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
toni@1128
   183
    }
toni@1109
   184
toni@1302
   185
    /**
toni@1302
   186
     * Fills a rectangle using the current fill paint.
toni@1302
   187
     *
toni@1302
   188
     * @param x the X position of the upper left corner of the rectangle.
toni@1302
   189
     * @param y the Y position of the upper left corner of the rectangle.
toni@1447
   190
     * @param width the width of the rectangle.
toni@1451
   191
     * @param height the height of the rectangle.
toni@1302
   192
     */
toni@1302
   193
    public void fillRect(double x, double y, double width, double height) {
toni@1128
   194
        graphicsEnvironmentImpl.fillRect(x, y, width, height);
toni@1128
   195
    }
toni@1109
   196
toni@1302
   197
    /**
toni@1302
   198
     * Strokes a rectangle using the current stroke paint.
toni@1302
   199
     *
toni@1302
   200
     * @param x the X position of the upper left corner of the rectangle.
toni@1302
   201
     * @param y the Y position of the upper left corner of the rectangle.
toni@1302
   202
     * @param width the width of the rectangle.
toni@1302
   203
     * @param height the height of the rectangle.
toni@1302
   204
     */
toni@1302
   205
    public void strokeRect(double x, double y, double width, double height) {
toni@1302
   206
        graphicsEnvironmentImpl.strokeRect(x, y, width, height);
toni@1128
   207
    }
toni@1109
   208
toni@1302
   209
    /**
toni@1302
   210
     * Clears a portion of the canvas with a transparent color value.
toni@1302
   211
     *
toni@1302
   212
     * @param x X position of the upper left corner of the rectangle.
toni@1302
   213
     * @param y Y position of the upper left corner of the rectangle.
toni@1302
   214
     * @param width width of the rectangle.
toni@1302
   215
     * @param height height of the rectangle.
toni@1302
   216
     */
toni@1302
   217
    public void clearRect(double x, double y, double width, double height) {
toni@1128
   218
        graphicsEnvironmentImpl.clearRect(x, y, width, height);
toni@1128
   219
    }
toni@1109
   220
toni@1302
   221
    /**
toni@1302
   222
     * Clears a portion of the canvas with a transparent color value.
toni@1302
   223
     *
toni@1302
   224
     * @param x X position of the upper left corner of the rectangle.
toni@1302
   225
     * @param y Y position of the upper left corner of the rectangle.
toni@1302
   226
     * @param width width of the rectangle.
toni@1302
   227
     * @param height height of the rectangle.
toni@1302
   228
     */
toni@1302
   229
    public void rect(double x, double y, double width, double height) {
toni@1128
   230
        graphicsEnvironmentImpl.rect(x, y, width, height);
toni@1128
   231
    }
toni@1109
   232
toni@1302
   233
    /**
toni@1302
   234
     * Saves the following attributes onto a stack.
toni@1302
   235
     * <ul>
toni@1302
   236
     * <li>Global Alpha</li>
toni@1302
   237
     * <li>Global Blend Operation</li>
toni@1302
   238
     * <li>Transform</li>
toni@1302
   239
     * <li>Fill Paint</li>
toni@1302
   240
     * <li>Stroke Paint</li>
toni@1302
   241
     * <li>Line Width</li>
toni@1302
   242
     * <li>Line Cap</li>
toni@1302
   243
     * <li>Line Join</li>
toni@1302
   244
     * <li>Miter Limit</li>
toni@1302
   245
     * <li>Number of Clip Paths</li>
toni@1302
   246
     * <li>Font</li>
toni@1302
   247
     * <li>Text Align</li>
toni@1302
   248
     * <li>Text Baseline</li>
toni@1302
   249
     * <li>Effect</li>
toni@1302
   250
     * <li>Fill Rule</li>
toni@1302
   251
     * </ul>
toni@1302
   252
     * This method does NOT alter the current state in any way. Also, not that
toni@1302
   253
     * the current path is not saved.
toni@1302
   254
     */
toni@1302
   255
    public void save() {
toni@1128
   256
        graphicsEnvironmentImpl.save();
toni@1128
   257
    }
toni@1109
   258
toni@1302
   259
    /**
toni@1302
   260
     * Pops the state off of the stack, setting the following attributes to
toni@1302
   261
     * their value at the time when that state was pushed onto the stack. If the
toni@1302
   262
     * stack is empty then nothing is changed.
toni@1302
   263
     *
toni@1302
   264
     * <ul>
toni@1302
   265
     * <li>Global Alpha</li>
toni@1302
   266
     * <li>Global Blend Operation</li>
toni@1302
   267
     * <li>Transform</li>
toni@1302
   268
     * <li>Fill Paint</li>
toni@1302
   269
     * <li>Stroke Paint</li>
toni@1302
   270
     * <li>Line Width</li>
toni@1302
   271
     * <li>Line Cap</li>
toni@1302
   272
     * <li>Line Join</li>
toni@1302
   273
     * <li>Miter Limit</li>
toni@1302
   274
     * <li>Number of Clip Paths</li>
toni@1302
   275
     * <li>Font</li>
toni@1302
   276
     * <li>Text Align</li>
toni@1302
   277
     * <li>Text Baseline</li>
toni@1302
   278
     * <li>Effect</li>
toni@1302
   279
     * <li>Fill Rule</li>
toni@1302
   280
     * </ul>
toni@1302
   281
     */
toni@1302
   282
    public void restore() {
toni@1128
   283
        graphicsEnvironmentImpl.restore();
toni@1128
   284
    }
toni@1109
   285
toni@1302
   286
    /**
toni@1302
   287
     * Rotates the current transform in degrees.
toni@1302
   288
     *
toni@1302
   289
     * @param angle value in degrees to rotate the current transform.
toni@1302
   290
     */
toni@1302
   291
    public void rotate(double angle) {
toni@1128
   292
        graphicsEnvironmentImpl.rotate(angle);
toni@1128
   293
    }
toni@1109
   294
toni@1302
   295
    /**
toni@1302
   296
     * Concatenates the input with the current transform.
toni@1302
   297
     *
toni@1302
   298
     * @param mxx - the X coordinate scaling element of the 3x4 matrix
toni@1302
   299
     * @param myx - the Y coordinate shearing element of the 3x4 matrix
toni@1302
   300
     * @param mxy - the X coordinate shearing element of the 3x4 matrix
toni@1302
   301
     * @param myy - the Y coordinate scaling element of the 3x4 matrix
toni@1302
   302
     * @param mxt - the X coordinate translation element of the 3x4 matrix
toni@1302
   303
     * @param myt - the Y coordinate translation element of the 3x4 matrix
toni@1302
   304
     */
toni@1302
   305
    public void transform(double mxx, double myx, double mxy, double myy, double mxt, double myt) {
toni@1302
   306
        graphicsEnvironmentImpl.transform(mxx, myx, mxy, myy, mxt, myt);
toni@1128
   307
    }
toni@1109
   308
toni@1302
   309
    /**
toni@1302
   310
     * Concatenates the input with the current transform.
toni@1302
   311
     *
toni@1302
   312
     * @param mxx - the X coordinate scaling element of the 3x4 matrix
toni@1302
   313
     * @param myx - the Y coordinate shearing element of the 3x4 matrix
toni@1302
   314
     * @param mxy - the X coordinate shearing element of the 3x4 matrix
toni@1302
   315
     * @param myy - the Y coordinate scaling element of the 3x4 matrix
toni@1302
   316
     * @param mxt - the X coordinate translation element of the 3x4 matrix
toni@1302
   317
     * @param myt - the Y coordinate translation element of the 3x4 matrix
toni@1302
   318
     */
toni@1302
   319
    public void setTransform(double mxx, double myx, double mxy, double myy, double mxt, double myt) {
toni@1302
   320
        graphicsEnvironmentImpl.setTransform(mxx, myx, mxy, myy, mxt, myt);
toni@1128
   321
    }
toni@1109
   322
toni@1302
   323
    /**
toni@1302
   324
     * Translates the current transform by x, y.
toni@1302
   325
     *
toni@1302
   326
     * @param x value to translate along the x axis.
toni@1302
   327
     * @param y value to translate along the y axis.
toni@1302
   328
     */
toni@1302
   329
    public void translate(double x, double y) {
toni@1128
   330
        graphicsEnvironmentImpl.translate(x, y);
toni@1128
   331
    }
toni@1109
   332
toni@1302
   333
    /**
toni@1302
   334
     * Scales the current transform by x, y.
toni@1302
   335
     *
toni@1302
   336
     * @param x value to scale in the x axis.
toni@1302
   337
     * @param y value to scale in the y axis.
toni@1302
   338
     */
toni@1302
   339
    public void scale(double x, double y) {
toni@1128
   340
        graphicsEnvironmentImpl.scale(x, y);
toni@1128
   341
    }
toni@1109
   342
toni@1302
   343
    /**
toni@1302
   344
     * Draws an image at the given x, y position using the width and height of
toni@1302
   345
     * the given image.
toni@1302
   346
     *
toni@1451
   347
     * @param image the image to be drawn.
toni@1302
   348
     * @param x the X coordinate on the destination for the upper left of the
toni@1302
   349
     * image.
toni@1302
   350
     * @param y the Y coordinate on the destination for the upper left of the
toni@1302
   351
     * image.
toni@1302
   352
     */
toni@1302
   353
    public void drawImage(Image image, double x, double y) {
toni@1144
   354
        Object nativeImage = graphicsEnvironmentImpl.drawImage(image, x, y, image.getCached());
toni@1144
   355
        image.cache(nativeImage);
toni@1144
   356
    }
toni@1144
   357
toni@1302
   358
    /**
toni@1302
   359
     * Draws an image into the given destination rectangle of the canvas. The
toni@1302
   360
     * Image is scaled to fit into the destination rectagnle.
toni@1302
   361
     *
toni@1451
   362
     * @param image the image to be drawn.
toni@1302
   363
     * @param x the X coordinate on the destination for the upper left of the
toni@1302
   364
     * image.
toni@1302
   365
     * @param y the Y coordinate on the destination for the upper left of the
toni@1302
   366
     * image.
toni@1302
   367
     * @param width the width of the destination rectangle.
toni@1302
   368
     * @param height the height of the destination rectangle.
toni@1302
   369
     */
toni@1302
   370
    public void drawImage(Image image, double x, double y, double width, double height) {
toni@1144
   371
        Object nativeImage = graphicsEnvironmentImpl.drawImage(image, x, y, width, height, image.getCached());
toni@1144
   372
        image.cache(nativeImage);
toni@1144
   373
    }
toni@1144
   374
toni@1302
   375
    /**
toni@1302
   376
     * Draws the current source rectangle of the given image to the given
toni@1302
   377
     * destination rectangle of the Canvas.
toni@1302
   378
     *
toni@1451
   379
     * @param image the image to be drawn.
toni@1302
   380
     * @param sx the source rectangle's X coordinate position.
toni@1302
   381
     * @param sy the source rectangle's Y coordinate position.
toni@1302
   382
     * @param sw the source rectangle's width.
toni@1302
   383
     * @param sh the source rectangle's height.
toni@1302
   384
     * @param dx the destination rectangle's X coordinate position.
toni@1302
   385
     * @param dy the destination rectangle's Y coordinate position.
toni@1302
   386
     * @param dw the destination rectangle's width.
toni@1302
   387
     * @param dh the destination rectangle's height.
toni@1302
   388
     */
toni@1302
   389
    public void drawImage(Image image, double sx, double sy, double sw, double sh, double dx, double dy, double dw, double dh) {
toni@1302
   390
        Object nativeImage = graphicsEnvironmentImpl.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh, image.getCached());
toni@1144
   391
        image.cache(nativeImage);
toni@1144
   392
    }
toni@1302
   393
toni@1302
   394
    /**
toni@1302
   395
     * Merges two images drawing one on top of the other and returning the
toni@1302
   396
     * result.
toni@1302
   397
     *
toni@1302
   398
     * @param a the lower Image
toni@1302
   399
     * @param b the upper Image
toni@1302
   400
     * @return
toni@1302
   401
     */
toni@1302
   402
    public Image merge(Image a, Image b) {
toni@1302
   403
        if (a.getCached() == null) {
toni@1263
   404
            drawImage(a, 0, 0);
toni@1263
   405
        }
toni@1302
   406
        if (b.getCached() == null) {
toni@1263
   407
            drawImage(b, 0, 0);
toni@1263
   408
        }
toni@1302
   409
        Object nativeImage = graphicsEnvironmentImpl.mergeImages(a, b, a.getCached(), b.getCached());
toni@1263
   410
        Image merged = Image.create("should add real path here");
toni@1263
   411
        merged.cache(nativeImage);
toni@1263
   412
        return merged;
toni@1263
   413
    }
toni@1109
   414
toni@1302
   415
//    public void setShadowColor(String color) {
toni@1302
   416
//        graphicsEnvironmentImpl.setShadowColor(color);
toni@1302
   417
//    }
toni@1302
   418
//
toni@1302
   419
//    public void setShadowBlur(double blur) {
toni@1302
   420
//        graphicsEnvironmentImpl.setShadowBlur(blur);
toni@1302
   421
//    }
toni@1302
   422
//
toni@1302
   423
//    public void setShadowOffsetX(double x) {
toni@1302
   424
//        graphicsEnvironmentImpl.setShadowOffsetX(x);
toni@1302
   425
//    }
toni@1302
   426
//
toni@1302
   427
//    public void setShadowOffsetY(double y) {
toni@1302
   428
//        graphicsEnvironmentImpl.setShadowOffsetY(y);
toni@1302
   429
//    }
toni@1302
   430
//
toni@1302
   431
//    public String getShadowColor() {
toni@1302
   432
//        return graphicsEnvironmentImpl.getShadowColor();
toni@1302
   433
//    }
toni@1302
   434
//
toni@1302
   435
//    public double getShadowBlur() {
toni@1302
   436
//        return graphicsEnvironmentImpl.getShadowBlur();
toni@1302
   437
//    }
toni@1302
   438
//
toni@1302
   439
//    public double getShadowOffsetX() {
toni@1302
   440
//        return graphicsEnvironmentImpl.getShadowOffsetX();
toni@1302
   441
//    }
toni@1302
   442
//
toni@1302
   443
//    public double getShadowOffsetY() {
toni@1302
   444
//        return graphicsEnvironmentImpl.getShadowOffsetY();
toni@1302
   445
//    }
toni@1444
   446
    /**
toni@1451
   447
     * Gets the current stroke line cap attribute.
toni@1451
   448
     *
toni@1451
   449
     * @return a value of butt, round, or square.
toni@1451
   450
     */
toni@1302
   451
    public String getLineCap() {
toni@1128
   452
        return graphicsEnvironmentImpl.getLineCap();
toni@1128
   453
    }
toni@1451
   454
toni@1444
   455
    /**
toni@1444
   456
     * Sets the current stroke line cap attribute.
toni@1451
   457
     *
toni@1451
   458
     * @param style a value of miter, bevel, or round.
toni@1444
   459
     */
toni@1302
   460
    public void setLineCap(String style) {
toni@1128
   461
        graphicsEnvironmentImpl.setLineCap(style);
toni@1128
   462
    }
toni@1109
   463
toni@1444
   464
    /**
toni@1444
   465
     * Gets the current stroke line join attribute.
toni@1444
   466
     *
toni@1451
   467
     * @return a value of miter, bevel, or round.
toni@1444
   468
     */
toni@1302
   469
    public String getLineJoin() {
toni@1128
   470
        return graphicsEnvironmentImpl.getLineJoin();
toni@1128
   471
    }
toni@1109
   472
toni@1444
   473
    /**
toni@1444
   474
     * Sets the current stroke line join attribute.
toni@1444
   475
     *
toni@1451
   476
     * @param style a value of miter, bevel, or round.
toni@1444
   477
     */
toni@1302
   478
    public void setLineJoin(String style) {
toni@1128
   479
        graphicsEnvironmentImpl.setLineJoin(style);
toni@1128
   480
    }
toni@1109
   481
toni@1444
   482
    /**
toni@1444
   483
     * Gets the current line width attribute.
toni@1444
   484
     *
toni@1444
   485
     * @return value between 0 and infinity, with any other value being ignored
toni@1444
   486
     * and leaving the value unchanged.
toni@1444
   487
     *
toni@1444
   488
     */
toni@1302
   489
    public double getLineWidth() {
toni@1128
   490
        return graphicsEnvironmentImpl.getLineWidth();
toni@1128
   491
    }
toni@1109
   492
toni@1444
   493
    /**
toni@1444
   494
     * Sets the current line width attribute.
toni@1444
   495
     *
toni@1444
   496
     * @param lw value between 0 and infinity, with any other value being
toni@1444
   497
     * ignored and leaving the value unchanged.
toni@1444
   498
     *
toni@1444
   499
     */
toni@1302
   500
    public void setLineWidth(double width) {
toni@1128
   501
        graphicsEnvironmentImpl.setLineWidth(width);
toni@1128
   502
    }
toni@1109
   503
toni@1444
   504
    /**
toni@1444
   505
     * Gets the current miter limit attribute.
toni@1444
   506
     *
toni@1444
   507
     * @return limit value between 0 and positive infinity with any other value
toni@1444
   508
     * being ignored and leaving the value unchanged.
toni@1444
   509
     */
toni@1302
   510
    public double getMiterLimit() {
toni@1128
   511
        return graphicsEnvironmentImpl.getMiterLimit();
toni@1128
   512
    }
toni@1109
   513
toni@1444
   514
    /**
toni@1444
   515
     * Sets the current miter limit attribute.
toni@1444
   516
     *
toni@1444
   517
     * @param ml miter limit value between 0 and positive infinity with any
toni@1444
   518
     * other value being ignored and leaving the value unchanged.
toni@1444
   519
     */
toni@1302
   520
    public void setMiterLimit(double limit) {
toni@1128
   521
        graphicsEnvironmentImpl.setMiterLimit(limit);
toni@1128
   522
    }
toni@1302
   523
toni@1443
   524
    /**
toni@1444
   525
     * Sets the fill style. Will be used when rendering something, e.g. calling
toni@1444
   526
     * one of the fillText Methods.
toni@1444
   527
     *
toni@1444
   528
     * @param style
toni@1443
   529
     */
toni@1302
   530
    public void setFillStyle(Style style) {
toni@1141
   531
        Object nativeFillStyle = graphicsEnvironmentImpl.setFillStyle(style, style.getCached());
toni@1141
   532
        style.cache(nativeFillStyle);
toni@1141
   533
    }
toni@1109
   534
toni@1443
   535
    /**
toni@1443
   536
     * get the current font
toni@1443
   537
     *
toni@1444
   538
     * @return current Font. of the fillText Methods.
toni@1443
   539
     */
toni@1302
   540
    public String getFont() {
toni@1128
   541
        return graphicsEnvironmentImpl.getFont();
toni@1128
   542
    }
toni@1109
   543
toni@1443
   544
    /**
toni@1444
   545
     * Set the Font. Will be used when rendering Text, e.g. by calling one of
toni@1444
   546
     * the fillText Methods.
toni@1443
   547
     *
toni@1443
   548
     * @param font
toni@1443
   549
     */
toni@1302
   550
    public void setFont(String font) {
toni@1128
   551
        graphicsEnvironmentImpl.setFont(font);
toni@1128
   552
    }
toni@1302
   553
toni@1443
   554
    /**
toni@1443
   555
     * sets the Style of the Stroke.
toni@1443
   556
     *
toni@1443
   557
     * @param style
toni@1443
   558
     */
toni@1302
   559
    public void setStrokeStyle(Style style) {
toni@1141
   560
        Object nativeStrokeStyle = graphicsEnvironmentImpl.setStrokeStyle(style, style.getCached());
toni@1141
   561
        style.cache(nativeStrokeStyle);
toni@1141
   562
    }
toni@1109
   563
toni@1443
   564
    /**
toni@1443
   565
     * Gets the current TextAlignment attribute
toni@1443
   566
     *
toni@1443
   567
     * @return TextAlignment with values of left, center, right, or justify.
toni@1443
   568
     */
toni@1302
   569
    public String getTextAlign() {
toni@1128
   570
        return graphicsEnvironmentImpl.getTextAlign();
toni@1128
   571
    }
toni@521
   572
toni@1443
   573
    /**
toni@1443
   574
     * Defines horizontal text alignment, relative to the text {@code x} origin.
toni@1443
   575
     * <p>
toni@1443
   576
     * Let horizontal bounds represent the logical width of a single line of
toni@1443
   577
     * text. Where each line of text has a separate horizontal bounds.
toni@1443
   578
     * <p>
toni@1443
   579
     * Then TextAlignment is specified as:
toni@1443
   580
     * <ul>
toni@1443
   581
     * <li>left: the left edge of the horizontal bounds will be at {@code x}.
toni@1443
   582
     * <li>center: the center, halfway between left and right edge, of the
toni@1443
   583
     * horizontal bounds will be at {@code x}.
toni@1443
   584
     * <li>right: the right edge of the horizontal bounds will be at {@code x}.
toni@1443
   585
     * </ul>
toni@1443
   586
     * <p>
toni@1443
   587
     *
toni@1443
   588
     * Note: Canvas does not support line wrapping, therefore the text alignment
toni@1443
   589
     * Justify is identical to left aligned text.
toni@1443
   590
     * <p>
toni@1443
   591
     *
toni@1443
   592
     * @param textAlign with values of left, center, right.
toni@1443
   593
     */
toni@1302
   594
    public void setTextAlign(String textAlign) {
toni@1128
   595
        graphicsEnvironmentImpl.setTextAlign(textAlign);
toni@1128
   596
    }
toni@521
   597
toni@1443
   598
    /**
toni@1443
   599
     * Gets the current Text Baseline attribute.
toni@1443
   600
     *
toni@1443
   601
     * @return baseline with values of top, center, baseline, or bottom
toni@1443
   602
     */
toni@1302
   603
    public String getTextBaseline() {
toni@1128
   604
        return graphicsEnvironmentImpl.getTextBaseline();
toni@1128
   605
    }
toni@521
   606
toni@1443
   607
    /**
toni@1443
   608
     * Sets the current Text Baseline attribute.
toni@1443
   609
     *
toni@1443
   610
     * @param baseline with values of top, center, baseline, or bottom
toni@1443
   611
     */
toni@1302
   612
    public void setTextBaseline(String textbaseline) {
toni@1128
   613
        graphicsEnvironmentImpl.setTextBaseline(textbaseline);
toni@1128
   614
    }
toni@521
   615
toni@1443
   616
    /**
toni@1443
   617
     * Renders the indicated String with current fill. default is black.
toni@1443
   618
     *
toni@1443
   619
     * @param text the text to stroke
toni@1443
   620
     * @param x x coordinate of start position
toni@1443
   621
     * @param y y coordinate of start position
toni@1443
   622
     */
toni@1302
   623
    public void fillText(String text, double x, double y) {
toni@1128
   624
        graphicsEnvironmentImpl.fillText(text, x, y);
toni@1128
   625
    }
toni@521
   626
toni@1443
   627
    /**
toni@1443
   628
     * Renders the indicated String with current fill. default is black.
toni@1443
   629
     *
toni@1443
   630
     * @param text the text to stroke
toni@1443
   631
     * @param x x coordinate of start position
toni@1443
   632
     * @param y y coordinate of start position
toni@1443
   633
     * @param maxWidth maximum width of text
toni@1443
   634
     */
toni@1302
   635
    public void fillText(String text, double x, double y, double maxWidth) {
toni@1128
   636
        graphicsEnvironmentImpl.fillText(text, x, y, maxWidth);
toni@1128
   637
    }
toni@521
   638
toni@1443
   639
    /**
toni@1443
   640
     * Check the length of a text before writing it to the Canvas. Takes into
toni@1443
   641
     * account the current Font.
toni@1443
   642
     *
toni@1443
   643
     * @param text the text to measure
toni@1443
   644
     * @return the length in pixels
toni@1443
   645
     */
toni@1302
   646
    public Dimension measureText(String text) {
toni@1128
   647
        return graphicsEnvironmentImpl.measureText(text);
toni@1128
   648
    }
toni@1111
   649
toni@1443
   650
    /**
toni@1443
   651
     * Renders the indicated String (with no fill)
toni@1443
   652
     *
toni@1443
   653
     * @param text the text to stroke
toni@1443
   654
     * @param x x coordinate of start position
toni@1443
   655
     * @param y y coordinate of start position
toni@1443
   656
     */
toni@1302
   657
    public void strokeText(String text, double x, double y) {
toni@1128
   658
        graphicsEnvironmentImpl.strokeText(text, x, y);
toni@1128
   659
    }
toni@1111
   660
toni@1443
   661
    /**
toni@1443
   662
     * Renders the indicated String (with no fill)
toni@1443
   663
     *
toni@1443
   664
     * @param text the text to stroke
toni@1443
   665
     * @param x x coordinate of start position
toni@1443
   666
     * @param y y coordinate of start position
toni@1443
   667
     * @param maxWidth maximum width of text
toni@1443
   668
     */
toni@1302
   669
    public void strokeText(String text, double x, double y, double maxWidth) {
toni@1128
   670
        graphicsEnvironmentImpl.strokeText(text, x, y, maxWidth);
toni@1128
   671
    }
toni@1111
   672
toni@1451
   673
    /**
toni@1451
   674
     * Get a pixel array that you can manipulate, e.g. apply effects /
toni@1451
   675
     * transparency
toni@1451
   676
     *
toni@1451
   677
     * @param x width
toni@1451
   678
     * @param y height
toni@1451
   679
     * @return a PixelMap
toni@1451
   680
     */
toni@1450
   681
    public ImageData createPixelMap(double x, double y) {
toni@1450
   682
        return graphicsEnvironmentImpl.createPixelMap(x, y);
toni@1450
   683
    }
toni@1450
   684
toni@1451
   685
    /**
toni@1451
   686
     * Create a new ImageData object with the same dimensions as the object
toni@1451
   687
     * specified by imageData (this does not copy the image data)
toni@1451
   688
     *
toni@1451
   689
     * @param pixelMap 
toni@1451
   690
     * @return
toni@1451
   691
     */
toni@1450
   692
    public ImageData createPixelMap(ImageData pixelMap) {
toni@1450
   693
        return graphicsEnvironmentImpl.createPixelMap(pixelMap);
toni@1450
   694
    }
toni@1451
   695
    
toni@1451
   696
    /**
toni@1451
   697
     * Get the pixels for a region of your GraphicsContext
toni@1451
   698
     * @param x start x coordinate
toni@1451
   699
     * @param y start y coordinate
toni@1451
   700
     * @param width width
toni@1451
   701
     * @param height height
toni@1451
   702
     * @return 
toni@1451
   703
     */
toni@1450
   704
    public ImageData getSnapshot(double x, double y, double width, double height) {
toni@1450
   705
        return graphicsEnvironmentImpl.getPixelMap(x, y, width, height);
toni@1450
   706
    }
toni@1451
   707
    
toni@1451
   708
    /**
toni@1451
   709
     * Render an ImageData Object at the specified position
toni@1451
   710
     * @param pixelMap  the Pixel array
toni@1451
   711
      * @param x start x coordinate
toni@1451
   712
     * @param y start y coordinate
toni@1451
   713
     */
toni@1450
   714
    public void drawPixelMap(ImageData pixelMap, double x, double y) {
toni@1450
   715
        graphicsEnvironmentImpl.putPixelMap(pixelMap, x, y);
toni@1450
   716
    }
toni@1450
   717
toni@1451
   718
      /**
toni@1451
   719
     * Render an ImageData Object at the specified position
toni@1451
   720
     * @param pixelMap  the Pixel array to draw
toni@1451
   721
     * @param x start x coordinate
toni@1451
   722
     * @param y start y coordinate
toni@1451
   723
     * @param dirtyx The horizontal (x) value, in pixels, where to place the image on the canvas
toni@1451
   724
     * @param dirtyy The vertical (y) value, in pixels, where to place the image on the canvas
toni@1451
   725
     * @param dirtywidth The width to use to draw the image on the canvas
toni@1451
   726
     * @param dirtyheight The height to use to draw the image on the canvas
toni@1451
   727
     */
toni@1450
   728
    public void drawPixelMap(ImageData pixelMap, double x, double y, double dirtyx, double dirtyy, double dirtywidth, double dirtyheight) {
toni@1450
   729
        graphicsEnvironmentImpl.putPixelMap(pixelMap, x, y, dirtyx, dirtyy, dirtywidth, dirtyheight);
toni@1450
   730
    }
toni@1451
   731
toni@1302
   732
    /**
toni@1302
   733
     * Sets the global alpha of the current state.
toni@1302
   734
     *
toni@1302
   735
     * @param alpha value in the range {@code 0.0-1.0}. The value is clamped if
toni@1302
   736
     * it is out of range.
toni@1302
   737
     */
toni@1302
   738
    public void setGlobalAlpha(double alpha) {
toni@1128
   739
        graphicsEnvironmentImpl.setGlobalAlpha(alpha);
toni@1128
   740
    }
toni@1111
   741
toni@1302
   742
    /**
toni@1302
   743
     * Gets the current global alpha.
toni@1302
   744
     *
toni@1302
   745
     * @return the current global alpha.
toni@1302
   746
     */
toni@1302
   747
    public double getGlobalAlpha() {
toni@1128
   748
        return graphicsEnvironmentImpl.getGlobalAlpha();
toni@1128
   749
    }
toni@1111
   750
toni@1302
   751
    /**
toni@1302
   752
     * Sets the global blend mode.
toni@1302
   753
     *
toni@1302
   754
     * @param op the BlendMode that will be set.
toni@1302
   755
     */
toni@1302
   756
    public void setGlobalCompositeOperation(String operation) {
toni@1128
   757
        graphicsEnvironmentImpl.setGlobalCompositeOperation(operation);
toni@1128
   758
    }
toni@1111
   759
toni@1302
   760
    /**
toni@1302
   761
     * Gets the global blend mode.
toni@1302
   762
     *
toni@1302
   763
     * @return the global BlendMode of the current state.
toni@1302
   764
     */
toni@1302
   765
    public String getGlobalCompositeOperation() {
toni@1128
   766
        return graphicsEnvironmentImpl.getGlobalCompositeOperation();
toni@1128
   767
    }
toni@1111
   768
toni@1443
   769
    /**
toni@1443
   770
     * Create a LinearGradient to use in Canvas.
toni@1443
   771
     *
toni@1443
   772
     * @param x0 x coordinate of start point
toni@1443
   773
     * @param y0 y coordinate of start point
toni@1443
   774
     * @param x1 x coordinate of end point
toni@1443
   775
     * @param y1 y coordinate of end point
toni@1443
   776
     * @return the gradient
toni@1443
   777
     */
toni@1449
   778
    public LinearGradient createLinearGradient(double x0, double y0, double x1, double y1, Map<Double, String> stops) {
toni@1449
   779
        return Style.LinearGradient.create(x0, y0, x1, y1, stops);
toni@1128
   780
    }
toni@1111
   781
toni@1443
   782
    /**
toni@1443
   783
     * Create an Image Pattern from a source Image and a repeat style. Possible
toni@1443
   784
     * Styles are repeat, repeat-x, repeat-y, or no-repeat. defaults to repeat
toni@1443
   785
     *
toni@1443
   786
     * @param image the Image
toni@1443
   787
     * @param repeat the repeat style
toni@1443
   788
     * @return the Pattern
toni@1443
   789
     */
toni@1302
   790
    public Pattern createPattern(Image image, String repeat) {
toni@1144
   791
        return new Pattern(image, repeat);
toni@1144
   792
    }
toni@1111
   793
toni@1443
   794
    /**
toni@1443
   795
     * Create a RadialGradient
toni@1443
   796
     *
toni@1443
   797
     * @param x0 x Coordinate of starting circle
toni@1443
   798
     * @param y0 y Coordinate of starting circle
toni@1443
   799
     * @param r0 radius of starting circle
toni@1443
   800
     * @param x1 x coordinate of ending circle
toni@1443
   801
     * @param y1 y coordinate of ending circle
toni@1443
   802
     * @param r1 radius of ending circle
toni@1443
   803
     * @return the Gradient
toni@1443
   804
     */
toni@1449
   805
    public RadialGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, Map<Double, String> stops) {
toni@1449
   806
        return RadialGradient.create(x0, y0, r0, x1, y1, r1, stops);
toni@1128
   807
    }
toni@1302
   808
toni@1443
   809
    /**
toni@1443
   810
     * Convert this String Representation of a Color to a Color Object.
toni@1443
   811
     *
toni@1443
   812
     * @param webColor
toni@1443
   813
     * @return The Color represented by the input
toni@1443
   814
     */
toni@1302
   815
    public Color getWebColor(String webColor) {
toni@1150
   816
        return new Style.Color(webColor);
toni@1150
   817
    }
toni@1111
   818
toni@1302
   819
    /**
toni@1302
   820
     * Get the height of this GraphicsContext (which should be the same as the
toni@1302
   821
     * enclosing canvas height)
toni@1302
   822
     *
toni@1302
   823
     * @return the height of this GraphicsContext
toni@1302
   824
     */
toni@1302
   825
    public int getHeight() {
toni@1128
   826
        return graphicsEnvironmentImpl.getHeight();
toni@1128
   827
    }
toni@1111
   828
toni@1302
   829
    /**
toni@1302
   830
     * Get the width of this GraphicsContext (which should be the same as the
toni@1302
   831
     * enclosing canvas height)
toni@1302
   832
     *
toni@1302
   833
     * @return the width of this GraphicsContext
toni@1302
   834
     */
toni@1302
   835
    public int getWidth() {
toni@1128
   836
        return graphicsEnvironmentImpl.getWidth();
toni@1128
   837
    }
toni@1111
   838
toni@1302
   839
//    public void setHeight(int height) {
toni@1302
   840
//        graphicsEnvironmentImpl.setHeight(height);
toni@1302
   841
//    }
toni@1302
   842
//
toni@1302
   843
//    public void setWidth(int width) {
toni@1302
   844
//        graphicsEnvironmentImpl.setWidth(width);
toni@1302
   845
//    }
toni@1302
   846
    /**
toni@1302
   847
     * Fill a circle with a center position of centerX, centerY and the
toni@1302
   848
     * specified radius.
toni@1302
   849
     *
toni@1302
   850
     * @param centerX
toni@1302
   851
     * @param centerY
toni@1302
   852
     * @param radius
toni@1302
   853
     */
toni@1302
   854
    public void fillCircle(float centerX, float centerY, float radius) {
toni@1302
   855
        graphicsEnvironmentImpl.arc(centerX, centerY, radius, 0, Math.PI * 2, false);
toni@1128
   856
    }
toni@1128
   857
toni@1302
   858
    /**
toni@1302
   859
     * Fills a polygon with the given points using the currently set fill paint.
toni@1302
   860
     *
toni@1302
   861
     * @param x_coord array containing the x coordinates of the polygon's
toni@1302
   862
     * points.
toni@1302
   863
     * @param y_coord array containing the y coordinates of the polygon's
toni@1302
   864
     * points.
toni@1302
   865
     * @param vertexCount the number of points that make the polygon.
toni@1302
   866
     */
toni@1263
   867
    public void fillPolygon(double[] x_coord, double[] y_coord, int vertexCount) {
toni@1302
   868
        if (vertexCount >= 1 && x_coord != null && x_coord.length >= vertexCount && y_coord != null && y_coord.length >= vertexCount) {
toni@1302
   869
            graphicsEnvironmentImpl.beginPath();
toni@1302
   870
        }
toni@1263
   871
        graphicsEnvironmentImpl.moveTo(x_coord[0], y_coord[0]);
toni@1263
   872
        for (int i = 1; i < vertexCount; i++) {
toni@1263
   873
            graphicsEnvironmentImpl.lineTo(x_coord[i], y_coord[i]);
toni@1302
   874
toni@1263
   875
        }
toni@1263
   876
        graphicsEnvironmentImpl.closePath();
toni@1263
   877
        graphicsEnvironmentImpl.fill();
toni@1263
   878
        graphicsEnvironmentImpl.stroke();
toni@1263
   879
    }
toni@521
   880
}