1 /*
   2  * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.javafx.scene.canvas;
  27 
  28 import javafx.geometry.VPos;
  29 import test.javafx.scene.NodeTest;
  30 import javafx.scene.canvas.Canvas;
  31 import javafx.scene.canvas.GraphicsContext;
  32 import javafx.scene.effect.BlendMode;
  33 import test.javafx.scene.image.ImageForTesting;
  34 import javafx.scene.paint.Color;
  35 import javafx.scene.shape.ArcType;
  36 import javafx.scene.shape.FillRule;
  37 import javafx.scene.shape.StrokeLineCap;
  38 import javafx.scene.shape.StrokeLineJoin;
  39 import javafx.scene.text.Font;
  40 import javafx.scene.text.FontSmoothingType;
  41 import javafx.scene.text.TextAlignment;
  42 import javafx.scene.transform.Affine;
  43 import javafx.scene.transform.Rotate;
  44 import javafx.scene.transform.Transform;
  45 import org.junit.Before;
  46 import org.junit.Test;
  47 
  48 import static org.junit.Assert.assertEquals;
  49 import static org.junit.Assert.assertArrayEquals;
  50 import static org.junit.Assert.assertNull;
  51 import static org.junit.Assert.assertNotNull;
  52 
  53 public class CanvasTest {
  54 
  55     private Canvas canvas;
  56     private GraphicsContext gc;
  57 
  58     @Before
  59     public void setUp() {
  60         canvas = new Canvas();
  61         gc = canvas.getGraphicsContext2D();
  62     }
  63 
  64     @Test public void testPropertyPropagation_visible() throws Exception {
  65         NodeTest.testBooleanPropertyPropagation(canvas, "visible", false, true);
  66     }
  67 
  68     //maybe test doing stuff from different threads
  69     @Test public void testGetGC2() throws Exception {
  70         GraphicsContext gc2 = canvas.getGraphicsContext2D();
  71         GraphicsContext gc3 = canvas.getGraphicsContext2D();
  72         GraphicsContext gc4 = canvas.getGraphicsContext2D();
  73         GraphicsContext gc5 = canvas.getGraphicsContext2D();
  74         assertEquals(gc,gc2);
  75         assertEquals(gc,gc3);
  76         assertEquals(gc,gc4);
  77         assertEquals(gc,gc5);
  78     }
  79 
  80     //basic tests make sure that the methods do not blow up.
  81     @Test public void testGCfillRect_basic() throws Exception {
  82         gc.fillRect(0, 0, 1, 1);
  83     }
  84 
  85     @Test public void testGCfillOval_basic() throws Exception {
  86         gc.fillOval(0, 0, 1, 1);
  87     }
  88 
  89     @Test public void testGCfillRoundRect_basic() throws Exception {
  90         gc.fillRoundRect(0, 0, 1, 1, 2, 2);
  91     }
  92 
  93     @Test public void testGCfillText_basic() throws Exception {
  94         gc.fillText("Test", 0, 0);
  95         gc.fillText("Test", 0, 0, 0);
  96         gc.fillText("", 0, 0, 0);
  97         gc.fillText("", 0, 0);
  98         gc.fillText(null, 0, 0);
  99         gc.fillText(null, 0, 0, 0);
 100     }
 101 
 102     @Test public void testGCfillPolygon_basic() throws Exception {
 103         double[] xPoints = {0.0,10.0};
 104         double[] yPoints = {0.0,10.0};
 105         gc.fillPolygon( xPoints, yPoints, 2);
 106         gc.fillPolygon( xPoints, null, 2);
 107         gc.fillPolygon( null, yPoints, 2);
 108     }
 109 
 110     @Test public void testGCfillArc_basic() throws Exception {
 111         gc.fillArc(10, 10, 100, 100, 0, 40, ArcType.OPEN);
 112         gc.fillArc(10, 10, 100, 100, 0, 360, ArcType.CHORD);
 113         gc.fillArc(10, 10, 100, 100, 0, 361, ArcType.ROUND);
 114         gc.fillArc(10, 10, 100, 100, 0, 361, null);
 115     }
 116 
 117     @Test public void testGCdrawRect_basic() throws Exception {
 118         gc.rect(0, 0, 1, 1);
 119     }
 120 
 121     @Test public void testGCdrawOval_basic() throws Exception {
 122         gc.strokeOval(0, 0, 1, 1);
 123     }
 124 
 125     @Test public void testGCdrawRoundRect_basic() throws Exception {
 126         gc.strokeRoundRect(0, 0, 1, 1, 2, 2);
 127     }
 128 
 129     @Test public void testGCstrokeText_basic() throws Exception {
 130         gc.strokeText("Test", 0, 0);
 131         gc.strokeText("", 0, 0);
 132         gc.strokeText(null, 0, 0);
 133     }
 134 
 135     @Test public void testGCdrawPolygon_basic() throws Exception {
 136         double[] xPoints = {0.0,10.0};
 137         double[] yPoints = {0.0,10.0};
 138         gc.strokePolygon( xPoints, yPoints, 2);
 139         gc.strokePolygon( null, yPoints, 2);
 140         gc.strokePolygon( xPoints, null, 2);
 141     }
 142 
 143     @Test public void testGCdrawArc_basic() throws Exception {
 144         gc.strokeArc(10, 10, 100, 100, 0, 40, ArcType.OPEN);
 145         gc.strokeArc(10, 10, 100, 100, 0, 360, ArcType.CHORD);
 146         gc.strokeArc(10, 10, 100, 100, 0, 361, ArcType.ROUND);
 147         gc.strokeArc(10, 10, 100, 100, 0, 361, null);
 148     }
 149 
 150     @Test public void testGCfillPath_basic() throws Exception {
 151         gc.arcTo(0, 0, 5, 5, 5);
 152         gc.moveTo(50, 50);
 153         gc.lineTo(100, 100);
 154         gc.bezierCurveTo(75, 150, 75, 150, 80, 80);
 155         gc.beginPath();
 156         gc.moveTo(50, 50);
 157         gc.lineTo(100, 100);
 158         gc.bezierCurveTo(75, 150, 75, 150, 80, 80);
 159         gc.arcTo(0, 0, 5, 5, 5);
 160         gc.closePath();
 161     }
 162 
 163     @Test public void testGCclip_basic() throws Exception {
 164         gc.beginPath();
 165         gc.moveTo(50, 50);
 166         gc.lineTo(100, 100);
 167         gc.bezierCurveTo(75, 150, 75, 150, 80, 80);
 168         gc.arcTo(0, 0, 5, 5, 5);
 169         gc.closePath();
 170         gc.clip();
 171     }
 172 
 173     @Test public void testGCfillDrawPath_basic() throws Exception {
 174         gc.beginPath();
 175         gc.moveTo(50, 50);
 176         gc.lineTo(100, 100);
 177         gc.bezierCurveTo(75, 150, 75, 150, 80, 80);
 178         gc.arcTo(0, 0, 5, 5, 5);
 179         gc.closePath();
 180         gc.stroke();
 181         gc.fill();
 182     }
 183 
 184     @Test public void testGCPath_LineTo_NoMoveto() throws Exception {
 185         gc.lineTo(10, 10);
 186     }
 187 
 188     @Test public void testGCPath_QuadraticCurveTo_NoMoveto() throws Exception {
 189         gc.quadraticCurveTo(10, 10, 20, 20);
 190     }
 191 
 192     @Test public void testGCPath_BezierCurveTo_NoMoveto() throws Exception {
 193         gc.bezierCurveTo(10, 10, 20, 20, 30, 30);
 194     }
 195 
 196     @Test public void testGCPath_ArcTo_NoMoveto() throws Exception {
 197         gc.arcTo(10, 10, 20, 20, 30);
 198     }
 199 
 200     @Test public void testGCPath_Arc_NoMoveto() throws Exception {
 201         gc.arc(10, 10, 20, 20, 30, 30);
 202     }
 203 
 204     @Test public void testGCPath_ClosePath_NoMoveto() throws Exception {
 205         gc.closePath();
 206     }
 207 
 208     @Test public void testGCPath_Rect_NoMoveto() throws Exception {
 209         gc.rect(10, 10, 20, 20);
 210     }
 211 
 212     @Test public void testGCState_Translate() throws Exception {
 213         gc.translate(50, 50);
 214         Affine result = gc.getTransform();
 215         Affine expected = new Affine();
 216 
 217         expected.setTx(50);
 218         expected.setTy(50);
 219 
 220         assertMatrix(result, expected);
 221     }
 222 
 223     @Test public void testGCState_Scale() throws Exception {
 224         gc.scale(3, 3);
 225         Affine result = gc.getTransform();
 226         Affine expected = new Affine();
 227 
 228         expected.setMxx(3);
 229         expected.setMyy(3);
 230 
 231         assertMatrix(result, expected);
 232     }
 233 
 234     @Test public void testGCState_Rotate() throws Exception {
 235         gc.rotate(45.0);
 236         Affine result = gc.getTransform();
 237 
 238         Rotate expected = new Rotate(45, 0, 0);
 239 
 240         assertMatrix(result, expected);
 241     }
 242 
 243     @Test public void testGCState_getTransform() throws Exception {
 244         Affine expected = new Affine();
 245         gc.setTransform(expected);
 246         Affine result = gc.getTransform();
 247 
 248         assertMatrix(result, expected);
 249 
 250         gc.setTransform(expected.getMxx(), expected.getMyx(), expected.getMxy(),
 251                 expected.getMyy(), expected.getTx(), expected.getTy());
 252 
 253         Affine result2 = gc.getTransform();
 254 
 255         assertMatrix(result2, expected);
 256     }
 257 
 258     @Test public void testGCState_FillStrokeSaveRestore() throws Exception {
 259         Affine expected = new Affine();
 260         gc.setTransform(expected);
 261         Affine result = gc.getTransform();
 262 
 263         assertMatrix(result, expected);
 264 
 265         gc.setFill(Color.BLACK);
 266         assertEquals(Color.BLACK, gc.getFill());
 267         gc.save();
 268         gc.setFill(Color.RED);
 269         assertEquals(gc.getFill(), Color.RED);
 270         gc.restore();
 271         assertEquals(Color.BLACK, gc.getFill());
 272         gc.setStroke(Color.BLACK);
 273         assertEquals(Color.BLACK, gc.getStroke());
 274         gc.save();
 275         gc.setStroke(Color.RED);
 276         assertEquals(gc.getStroke(), Color.RED);
 277         gc.restore();
 278         assertEquals(Color.BLACK, gc.getStroke());
 279         assertMatrix(result, expected);
 280     }
 281 
 282     @Test public void testGCState_SetStroke() {
 283         gc.setStroke(Color.RED);
 284         assertEquals(Color.RED, gc.getStroke());
 285         gc.setStroke(null);
 286         assertEquals(Color.RED, gc.getStroke());
 287     }
 288 
 289     @Test public void testGCState_Fill_Null() {
 290         gc.setFill(Color.BLACK);
 291         assertEquals(Color.BLACK, gc.getFill());
 292         gc.setFill(Color.RED);
 293         assertEquals(gc.getFill(), Color.RED);
 294         gc.setFill(null);
 295         assertEquals(gc.getFill(), Color.RED);
 296     }
 297 
 298     @Test public void testGCState_FillRule_Null() {
 299         gc.setFillRule(FillRule.EVEN_ODD);
 300         assertEquals(FillRule.EVEN_ODD, gc.getFillRule());
 301         gc.setFillRule(null);
 302         assertEquals(FillRule.EVEN_ODD, gc.getFillRule());
 303     }
 304 
 305     @Test public void testGCState_Font_Null() {
 306         Font f = new Font(10);
 307         gc.setFont(f);
 308         assertEquals(f, gc.getFont());
 309         gc.setFont(null);
 310         assertEquals(f, gc.getFont());
 311     }
 312 
 313     @Test public void testGCState_FontSmoothing_Null() {
 314         gc.setFontSmoothingType(FontSmoothingType.GRAY);
 315         assertEquals(FontSmoothingType.GRAY, gc.getFontSmoothingType());
 316         gc.setFontSmoothingType(null);
 317         assertEquals(FontSmoothingType.GRAY, gc.getFontSmoothingType());
 318     }
 319 
 320     @Test public void testGCState_TextBaseline_Null() {
 321         gc.setTextBaseline(VPos.BASELINE);
 322         assertEquals(VPos.BASELINE, gc.getTextBaseline());
 323         gc.setTextBaseline(null);
 324         assertEquals(VPos.BASELINE, gc.getTextBaseline());
 325     }
 326 
 327     @Test public void testGCState_TextAlign_Null() {
 328         gc.setTextAlign(TextAlignment.JUSTIFY);
 329         assertEquals(TextAlignment.JUSTIFY, gc.getTextAlign());
 330         gc.setTextAlign(null);
 331         assertEquals(TextAlignment.JUSTIFY, gc.getTextAlign());
 332     }
 333 
 334     @Test public void testGCState_Line() throws Exception {
 335         gc.setLineCap(StrokeLineCap.BUTT);
 336         gc.setLineJoin(StrokeLineJoin.MITER);
 337         gc.setLineWidth(5);
 338         gc.setMiterLimit(3);
 339 
 340         gc.save();
 341         gc.setLineCap(StrokeLineCap.ROUND);
 342         gc.setLineJoin(StrokeLineJoin.BEVEL);
 343         gc.setLineWidth(1);
 344         gc.setMiterLimit(1);
 345         gc.setLineDashes(10, 10);
 346         gc.setLineDashOffset(100);
 347         assertEquals(gc.getLineCap(), StrokeLineCap.ROUND);
 348         assertEquals(gc.getLineJoin(), StrokeLineJoin.BEVEL);
 349         assertEquals(gc.getLineWidth(), 1, 0.00001);
 350         assertEquals(gc.getMiterLimit(), 1, 0.00001);
 351         assertArrayEquals(gc.getLineDashes(), new double[] {10, 10}, 0.00001);
 352         assertEquals(gc.getLineDashOffset(), 100, 0.00001);
 353         gc.restore();
 354 
 355         assertEquals(gc.getLineCap(), StrokeLineCap.BUTT);
 356         assertEquals(gc.getLineJoin(), StrokeLineJoin.MITER);
 357         assertEquals(gc.getLineWidth(), 5, 0.00001);
 358         assertEquals(gc.getMiterLimit(), 3, 0.00001);
 359         assertNull(gc.getLineDashes());
 360         assertEquals(gc.getLineDashOffset(), 0, 0.00001);
 361     }
 362 
 363     @Test
 364     public void testGCState_LineCapNull() throws Exception {
 365         gc.setLineCap(StrokeLineCap.BUTT);
 366         gc.setLineCap(null);
 367         assertEquals(gc.getLineCap(), StrokeLineCap.BUTT);
 368         gc.setLineCap(StrokeLineCap.ROUND);
 369         gc.setLineCap(null);
 370         assertEquals(gc.getLineCap(), StrokeLineCap.ROUND);
 371         gc.setLineCap(StrokeLineCap.SQUARE);
 372         gc.setLineCap(null);
 373         assertEquals(gc.getLineCap(), StrokeLineCap.SQUARE);
 374     }
 375 
 376     @Test
 377     public void testGCState_LineJoinNull() throws Exception {
 378         gc.setLineJoin(StrokeLineJoin.BEVEL);
 379         gc.setLineJoin(null);
 380         assertEquals(gc.getLineJoin(), StrokeLineJoin.BEVEL);
 381         gc.setLineJoin(StrokeLineJoin.MITER);
 382         gc.setLineJoin(null);
 383         assertEquals(gc.getLineJoin(), StrokeLineJoin.MITER);
 384         gc.setLineJoin(StrokeLineJoin.ROUND);
 385         gc.setLineJoin(null);
 386         assertEquals(gc.getLineJoin(), StrokeLineJoin.ROUND);
 387     }
 388 
 389     @Test
 390     public void testGCState_LineDashNonPositive() throws Exception {
 391         gc.setLineDashes(20, 10);
 392         assertArrayEquals(gc.getLineDashes(), new double[] {20, 10}, 0.00001);
 393         gc.setLineDashes(1, Double.NaN);
 394         assertArrayEquals(gc.getLineDashes(), new double[] {20, 10}, 0.00001);
 395         gc.setLineDashes(1, Double.POSITIVE_INFINITY);
 396         assertArrayEquals(gc.getLineDashes(), new double[] {20, 10}, 0.00001);
 397         gc.setLineDashes(1, -1);
 398         assertArrayEquals(gc.getLineDashes(), new double[] {20, 10}, 0.00001);
 399     }
 400 
 401     @Test
 402     public void testGCState_LineDashNull() throws Exception {
 403         gc.setLineDashes(10, 10);
 404         assertNotNull(gc.getLineDashes());
 405         gc.setLineDashes(null);
 406         assertNull(gc.getLineDashes());
 407 
 408         gc.setLineDashes(10, 10);
 409         assertNotNull(gc.getLineDashes());
 410         gc.setLineDashes();
 411         assertNull(gc.getLineDashes());
 412 
 413         gc.setLineDashes(10, 10);
 414         assertNotNull(gc.getLineDashes());
 415         gc.setLineDashes(new double[0]);
 416         assertNull(gc.getLineDashes());
 417 
 418         gc.setLineDashes(10, 10);
 419         assertNotNull(gc.getLineDashes());
 420         gc.setLineDashes(0, 0);
 421         assertNull(gc.getLineDashes());
 422     }
 423 
 424     @Test
 425     public void testGCState_LineDashOddLength() throws Exception {
 426         gc.setLineDashes(10);
 427         assertArrayEquals(gc.getLineDashes(), new double[] {10, 10}, 0.00001);
 428         gc.setLineDashes(10, 20, 30);
 429         assertArrayEquals(gc.getLineDashes(), new double[] {10, 20, 30, 10, 20, 30}, 0.00001);
 430     }
 431 
 432     @Test
 433     public void testGCState_LineDashOffsetNonFinite() throws Exception {
 434         gc.setLineDashOffset(5.0);
 435         assertEquals(gc.getLineDashOffset(), 5.0, 0.00001);
 436         gc.setLineDashOffset(Double.NaN);
 437         assertEquals(gc.getLineDashOffset(), 5.0, 0.00001);
 438         gc.setLineDashOffset(Double.NEGATIVE_INFINITY);
 439         assertEquals(gc.getLineDashOffset(), 5.0, 0.00001);
 440         gc.setLineDashOffset(Double.POSITIVE_INFINITY);
 441         assertEquals(gc.getLineDashOffset(), 5.0, 0.00001);
 442     }
 443 
 444     @Test public void testGCState_BlendMode() throws Exception {
 445         gc.setGlobalBlendMode(BlendMode.ADD);
 446         gc.setGlobalAlpha(0);
 447 
 448         gc.save();
 449         gc.setGlobalAlpha(0.5);
 450         gc.setGlobalBlendMode(BlendMode.COLOR_BURN);
 451         assertEquals(gc.getGlobalBlendMode(), BlendMode.COLOR_BURN);
 452         assertEquals(gc.getGlobalAlpha(), 0.5, 0.000001);
 453         gc.restore();
 454 
 455         assertEquals(BlendMode.ADD, gc.getGlobalBlendMode());
 456         assertEquals(0, gc.getGlobalAlpha(), 0.000001);
 457     }
 458 
 459     @Test public void testGCState_BlendMode_Null() {
 460         gc.setGlobalBlendMode(BlendMode.ADD);
 461         assertEquals(BlendMode.ADD, gc.getGlobalBlendMode());
 462         gc.setGlobalBlendMode(null);
 463         assertEquals(BlendMode.ADD, gc.getGlobalBlendMode());
 464     }
 465 
 466     @Test public void testGCappendSVGPath_Null() {
 467         gc.appendSVGPath("m 0 0");
 468         gc.appendSVGPath("Q 150 -300 300 0");
 469         gc.appendSVGPath(null);
 470     }
 471 
 472     @Test public void testGCappendSVGPath_IncorrectPath() {
 473         gc.appendSVGPath("Q 150 -300 300 0"); // No move at the beginning
 474     }
 475 
 476     @Test public void testGCappendSVGPath_IncorrectPath2() {
 477         gc.appendSVGPath("F 150"); // No move at the beginning
 478     }
 479 
 480     @Test public void testGCapplyEffect_Null() {
 481         gc.applyEffect(null);
 482     }
 483 
 484     @Test public void testGCdrawImage_Null() {
 485         gc.drawImage(null, 0 ,0);
 486         gc.drawImage(null, 0 ,0, 100, 100);
 487         gc.drawImage(null, 0, 0, 100, 100, 0, 0, 100, 100);
 488     }
 489 
 490     @Test public void testGCdrawImage_InProgress() {
 491         ImageForTesting image = new ImageForTesting("http://something.png", false);
 492         image.updateProgress(0.5);
 493 
 494         gc.drawImage(image, 0 ,0);
 495         gc.drawImage(image, 0 ,0, 100, 100);
 496         gc.drawImage(image, 0, 0, 100, 100, 0, 0, 100, 100);
 497     }
 498 
 499     public static void assertMatrix(Transform expected,
 500             Transform result) {
 501         assertEquals(expected.getMxx(), result.getMxx(), 0.00001);
 502         assertEquals(expected.getMxy(), result.getMxy(), 0.00001);
 503         assertEquals(expected.getMxz(), result.getMxz(), 0.00001);
 504         assertEquals(expected.getTx(), result.getTx(), 0.00001);
 505         assertEquals(expected.getMyx(), result.getMyx(), 0.00001);
 506         assertEquals(expected.getMyy(), result.getMyy(), 0.00001);
 507         assertEquals(expected.getMyz(), result.getMyz(), 0.00001);
 508         assertEquals(expected.getTy(), result.getTy(), 0.00001);
 509         assertEquals(expected.getMzx(), result.getMzx(), 0.00001);
 510         assertEquals(expected.getMzy(), result.getMzy(), 0.00001);
 511         assertEquals(expected.getMzz(), result.getMzz(), 0.00001);
 512         assertEquals(expected.getTz(), result.getTz(), 0.00001);
 513     }
 514 }