1 /* 2 * Copyright (c) 2010, 2014, 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 javafx.scene.canvas; 27 28 import javafx.geometry.VPos; 29 import javafx.scene.NodeTest; 30 import javafx.scene.effect.BlendMode; 31 import javafx.scene.image.ImageForTesting; 32 import javafx.scene.paint.Color; 33 import javafx.scene.shape.ArcType; 34 import javafx.scene.shape.FillRule; 35 import javafx.scene.shape.StrokeLineCap; 36 import javafx.scene.shape.StrokeLineJoin; 37 import javafx.scene.text.Font; 38 import javafx.scene.text.TextAlignment; 39 import javafx.scene.transform.Affine; 40 import javafx.scene.transform.Rotate; 41 import javafx.scene.transform.Transform; 42 import org.junit.Before; 43 import org.junit.Test; 44 45 import static org.junit.Assert.assertEquals; 46 47 public class CanvasTest { 48 49 private Canvas canvas; 50 private GraphicsContext gc; 51 52 @Before 53 public void setUp() { 54 canvas = new Canvas(); 55 gc = canvas.getGraphicsContext2D(); 56 } 57 58 @Test public void testPropertyPropagation_visible() throws Exception { 59 NodeTest.testBooleanPropertyPropagation(canvas, "visible", false, true); 60 } 61 62 //maybe test doing stuff from different threads 63 @Test public void testGetGC2() throws Exception { 64 GraphicsContext gc2 = canvas.getGraphicsContext2D(); 65 GraphicsContext gc3 = canvas.getGraphicsContext2D(); 66 GraphicsContext gc4 = canvas.getGraphicsContext2D(); 67 GraphicsContext gc5 = canvas.getGraphicsContext2D(); 68 assertEquals(gc,gc2); 69 assertEquals(gc,gc3); 70 assertEquals(gc,gc4); 71 assertEquals(gc,gc5); 72 } 73 74 //basic tests make sure that the methods do not blow up. 75 @Test public void testGCfillRect_basic() throws Exception { 76 gc.fillRect(0, 0, 1, 1); 77 } 78 79 @Test public void testGCfillOval_basic() throws Exception { 80 gc.fillOval(0, 0, 1, 1); 81 } 82 83 @Test public void testGCfillRoundRect_basic() throws Exception { 84 gc.fillRoundRect(0, 0, 1, 1, 2, 2); 85 } 86 87 @Test public void testGCfillText_basic() throws Exception { 88 gc.fillText("Test", 0, 0); 89 gc.fillText("Test", 0, 0, 0); 90 gc.fillText("", 0, 0, 0); 91 gc.fillText("", 0, 0); 92 gc.fillText(null, 0, 0); 93 gc.fillText(null, 0, 0, 0); 94 } 95 96 @Test public void testGCfillPolygon_basic() throws Exception { 97 double[] xPoints = {0.0,10.0}; 98 double[] yPoints = {0.0,10.0}; 99 gc.fillPolygon( xPoints, yPoints, 2); 100 gc.fillPolygon( xPoints, null, 2); 101 gc.fillPolygon( null, yPoints, 2); 102 } 103 104 @Test public void testGCfillArc_basic() throws Exception { 105 gc.fillArc(10, 10, 100, 100, 0, 40, ArcType.OPEN); 106 gc.fillArc(10, 10, 100, 100, 0, 360, ArcType.CHORD); 107 gc.fillArc(10, 10, 100, 100, 0, 361, ArcType.ROUND); 108 gc.fillArc(10, 10, 100, 100, 0, 361, null); 109 } 110 111 @Test public void testGCdrawRect_basic() throws Exception { 112 gc.rect(0, 0, 1, 1); 113 } 114 115 @Test public void testGCdrawOval_basic() throws Exception { 116 gc.strokeOval(0, 0, 1, 1); 117 } 118 119 @Test public void testGCdrawRoundRect_basic() throws Exception { 120 gc.strokeRoundRect(0, 0, 1, 1, 2, 2); 121 } 122 123 @Test public void testGCstrokeText_basic() throws Exception { 124 gc.strokeText("Test", 0, 0); 125 gc.strokeText("", 0, 0); 126 gc.strokeText(null, 0, 0); 127 } 128 129 @Test public void testGCdrawPolygon_basic() throws Exception { 130 double[] xPoints = {0.0,10.0}; 131 double[] yPoints = {0.0,10.0}; 132 gc.strokePolygon( xPoints, yPoints, 2); 133 gc.strokePolygon( null, yPoints, 2); 134 gc.strokePolygon( xPoints, null, 2); 135 } 136 137 @Test public void testGCdrawArc_basic() throws Exception { 138 gc.strokeArc(10, 10, 100, 100, 0, 40, ArcType.OPEN); 139 gc.strokeArc(10, 10, 100, 100, 0, 360, ArcType.CHORD); 140 gc.strokeArc(10, 10, 100, 100, 0, 361, ArcType.ROUND); 141 gc.strokeArc(10, 10, 100, 100, 0, 361, null); 142 } 143 144 @Test public void testGCfillPath_basic() throws Exception { 145 gc.arcTo(0, 0, 5, 5, 5); 146 gc.moveTo(50, 50); 147 gc.lineTo(100, 100); 148 gc.bezierCurveTo(75, 150, 75, 150, 80, 80); 149 gc.beginPath(); 150 gc.moveTo(50, 50); 151 gc.lineTo(100, 100); 152 gc.bezierCurveTo(75, 150, 75, 150, 80, 80); 153 gc.arcTo(0, 0, 5, 5, 5); 154 gc.closePath(); 155 } 156 157 @Test public void testGCclip_basic() throws Exception { 158 gc.beginPath(); 159 gc.moveTo(50, 50); 160 gc.lineTo(100, 100); 161 gc.bezierCurveTo(75, 150, 75, 150, 80, 80); 162 gc.arcTo(0, 0, 5, 5, 5); 163 gc.closePath(); 164 gc.clip(); 165 } 166 167 @Test public void testGCfillDrawPath_basic() throws Exception { 168 gc.beginPath(); 169 gc.moveTo(50, 50); 170 gc.lineTo(100, 100); 171 gc.bezierCurveTo(75, 150, 75, 150, 80, 80); 172 gc.arcTo(0, 0, 5, 5, 5); 173 gc.closePath(); 174 gc.stroke(); 175 gc.fill(); 176 } 177 178 @Test public void testGCPath_LineTo_NoMoveto() throws Exception { 179 gc.lineTo(10, 10); 180 } 181 182 @Test public void testGCPath_QuadraticCurveTo_NoMoveto() throws Exception { 183 gc.quadraticCurveTo(10, 10, 20, 20); 184 } 185 186 @Test public void testGCPath_BezierCurveTo_NoMoveto() throws Exception { 187 gc.bezierCurveTo(10, 10, 20, 20, 30, 30); 188 } 189 190 @Test public void testGCPath_ArcTo_NoMoveto() throws Exception { 191 gc.arcTo(10, 10, 20, 20, 30); 192 } 193 194 @Test public void testGCPath_Arc_NoMoveto() throws Exception { 195 gc.arc(10, 10, 20, 20, 30, 30); 196 } 197 198 @Test public void testGCPath_ClosePath_NoMoveto() throws Exception { 199 gc.closePath(); 200 } 201 202 @Test public void testGCPath_Rect_NoMoveto() throws Exception { 203 gc.rect(10, 10, 20, 20); 204 } 205 206 @Test public void testGCState_Translate() throws Exception { 207 gc.translate(50, 50); 208 Affine result = gc.getTransform(); 209 Affine expected = new Affine(); 210 211 expected.setTx(50); 212 expected.setTy(50); 213 214 assertMatrix(result, expected); 215 } 216 217 @Test public void testGCState_Scale() throws Exception { 218 gc.scale(3, 3); 219 Affine result = gc.getTransform(); 220 Affine expected = new Affine(); 221 222 expected.setMxx(3); 223 expected.setMyy(3); 224 225 assertMatrix(result, expected); 226 } 227 228 @Test public void testGCState_Rotate() throws Exception { 229 gc.rotate(45.0); 230 Affine result = gc.getTransform(); 231 232 Rotate expected = new Rotate(45, 0, 0); 233 234 assertMatrix(result, expected); 235 } 236 237 @Test public void testGCState_getTransform() throws Exception { 238 Affine expected = new Affine(); 239 gc.setTransform(expected); 240 Affine result = gc.getTransform(); 241 242 assertMatrix(result, expected); 243 244 gc.setTransform(expected.getMxx(), expected.getMyx(), expected.getMxy(), 245 expected.getMyy(), expected.getTx(), expected.getTy()); 246 247 Affine result2 = gc.getTransform(); 248 249 assertMatrix(result2, expected); 250 } 251 252 @Test public void testGCState_FillStrokeSaveRestore() throws Exception { 253 Affine expected = new Affine(); 254 gc.setTransform(expected); 255 Affine result = gc.getTransform(); 256 257 assertMatrix(result, expected); 258 259 gc.setFill(Color.BLACK); 260 assertEquals(Color.BLACK, gc.getFill()); 261 gc.save(); 262 gc.setFill(Color.RED); 263 assertEquals(gc.getFill(), Color.RED); 264 gc.restore(); 265 assertEquals(Color.BLACK, gc.getFill()); 266 gc.setStroke(Color.BLACK); 267 assertEquals(Color.BLACK, gc.getStroke()); 268 gc.save(); 269 gc.setStroke(Color.RED); 270 assertEquals(gc.getStroke(), Color.RED); 271 gc.restore(); 272 assertEquals(Color.BLACK, gc.getStroke()); 273 assertMatrix(result, expected); 274 } 275 276 @Test public void testGCState_SetStroke() { 277 gc.setStroke(Color.RED); 278 assertEquals(Color.RED, gc.getStroke()); 279 gc.setStroke(null); 280 assertEquals(Color.RED, gc.getStroke()); 281 } 282 283 @Test public void testGCState_Fill_Null() { 284 gc.setFill(Color.BLACK); 285 assertEquals(Color.BLACK, gc.getFill()); 286 gc.setFill(Color.RED); 287 assertEquals(gc.getFill(), Color.RED); 288 gc.setFill(null); 289 assertEquals(gc.getFill(), Color.RED); 290 } 291 292 @Test public void testGCState_FillRule_Null() { 293 gc.setFillRule(FillRule.EVEN_ODD); 294 assertEquals(FillRule.EVEN_ODD, gc.getFillRule()); 295 gc.setFillRule(null); 296 assertEquals(FillRule.EVEN_ODD, gc.getFillRule()); 297 } 298 299 @Test public void testGCState_Font_Null() { 300 Font f = new Font(10); 301 gc.setFont(f); 302 assertEquals(f, gc.getFont()); 303 gc.setFont(null); 304 assertEquals(f, gc.getFont()); 305 } 306 307 @Test public void testGCState_TextBaseline_Null() { 308 gc.setTextBaseline(VPos.BASELINE); 309 assertEquals(VPos.BASELINE, gc.getTextBaseline()); 310 gc.setTextBaseline(null); 311 assertEquals(VPos.BASELINE, gc.getTextBaseline()); 312 } 313 314 @Test public void testGCState_TextAlign_Null() { 315 gc.setTextAlign(TextAlignment.JUSTIFY); 316 assertEquals(TextAlignment.JUSTIFY, gc.getTextAlign()); 317 gc.setTextAlign(null); 318 assertEquals(TextAlignment.JUSTIFY, gc.getTextAlign()); 319 } 320 321 @Test public void testGCState_Line() throws Exception { 322 gc.setLineCap(StrokeLineCap.BUTT); 323 gc.setLineJoin(StrokeLineJoin.MITER); 324 gc.setLineWidth(5); 325 gc.setMiterLimit(3); 326 327 gc.save(); 328 gc.setLineCap(StrokeLineCap.ROUND); 329 gc.setLineJoin(StrokeLineJoin.BEVEL); 330 gc.setLineWidth(1); 331 gc.setMiterLimit(1); 332 assertEquals(gc.getLineCap(), StrokeLineCap.ROUND); 333 assertEquals(gc.getLineJoin(), StrokeLineJoin.BEVEL); 334 assertEquals(gc.getLineWidth(), 1, 0.00001); 335 assertEquals(gc.getMiterLimit(), 1, 0.00001); 336 gc.restore(); 337 338 assertEquals(gc.getLineCap(), StrokeLineCap.BUTT); 339 assertEquals(gc.getLineJoin(), StrokeLineJoin.MITER); 340 assertEquals(gc.getLineWidth(), 5, 0.00001); 341 assertEquals(gc.getMiterLimit(), 3, 0.00001); 342 } 343 344 @Test 345 public void testGCState_LineCapNull() throws Exception { 346 gc.setLineCap(StrokeLineCap.BUTT); 347 gc.setLineCap(null); 348 assertEquals(gc.getLineCap(), StrokeLineCap.BUTT); 349 gc.setLineCap(StrokeLineCap.ROUND); 350 gc.setLineCap(null); 351 assertEquals(gc.getLineCap(), StrokeLineCap.ROUND); 352 gc.setLineCap(StrokeLineCap.SQUARE); 353 gc.setLineCap(null); 354 assertEquals(gc.getLineCap(), StrokeLineCap.SQUARE); 355 } 356 357 @Test 358 public void testGCState_LineJoinNull() throws Exception { 359 gc.setLineJoin(StrokeLineJoin.BEVEL); 360 gc.setLineJoin(null); 361 assertEquals(gc.getLineJoin(), StrokeLineJoin.BEVEL); 362 gc.setLineJoin(StrokeLineJoin.MITER); 363 gc.setLineJoin(null); 364 assertEquals(gc.getLineJoin(), StrokeLineJoin.MITER); 365 gc.setLineJoin(StrokeLineJoin.ROUND); 366 gc.setLineJoin(null); 367 assertEquals(gc.getLineJoin(), StrokeLineJoin.ROUND); 368 } 369 370 @Test public void testGCState_BlendMode() throws Exception { 371 gc.setGlobalBlendMode(BlendMode.ADD); 372 gc.setGlobalAlpha(0); 373 374 gc.save(); 375 gc.setGlobalAlpha(0.5); 376 gc.setGlobalBlendMode(BlendMode.COLOR_BURN); 377 assertEquals(gc.getGlobalBlendMode(), BlendMode.COLOR_BURN); 378 assertEquals(gc.getGlobalAlpha(), 0.5, 0.000001); 379 gc.restore(); 380 381 assertEquals(BlendMode.ADD, gc.getGlobalBlendMode()); 382 assertEquals(0, gc.getGlobalAlpha(), 0.000001); 383 } 384 385 @Test public void testGCState_BlendMode_Null() { 386 gc.setGlobalBlendMode(BlendMode.ADD); 387 assertEquals(BlendMode.ADD, gc.getGlobalBlendMode()); 388 gc.setGlobalBlendMode(null); 389 assertEquals(BlendMode.ADD, gc.getGlobalBlendMode()); 390 } 391 392 @Test public void testGCappendSVGPath_Null() { 393 gc.appendSVGPath("m 0 0"); 394 gc.appendSVGPath("Q 150 -300 300 0"); 395 gc.appendSVGPath(null); 396 } 397 398 @Test public void testGCappendSVGPath_IncorrectPath() { 399 gc.appendSVGPath("Q 150 -300 300 0"); // No move at the beginning 400 } 401 402 @Test public void testGCappendSVGPath_IncorrectPath2() { 403 gc.appendSVGPath("F 150"); // No move at the beginning 404 } 405 406 @Test public void testGCapplyEffect_Null() { 407 gc.applyEffect(null); 408 } 409 410 @Test public void testGCdrawImage_Null() { 411 gc.drawImage(null, 0 ,0); 412 gc.drawImage(null, 0 ,0, 100, 100); 413 gc.drawImage(null, 0, 0, 100, 100, 0, 0, 100, 100); 414 } 415 416 @Test public void testGCdrawImage_InProgress() { 417 ImageForTesting image = new ImageForTesting("http://something.png", false); 418 image.updateProgress(0.5); 419 420 gc.drawImage(image, 0 ,0); 421 gc.drawImage(image, 0 ,0, 100, 100); 422 gc.drawImage(image, 0, 0, 100, 100, 0, 0, 100, 100); 423 } 424 425 public static void assertMatrix(Transform expected, 426 Transform result) { 427 assertEquals(expected.getMxx(), result.getMxx(), 0.00001); 428 assertEquals(expected.getMxy(), result.getMxy(), 0.00001); 429 assertEquals(expected.getMxz(), result.getMxz(), 0.00001); 430 assertEquals(expected.getTx(), result.getTx(), 0.00001); 431 assertEquals(expected.getMyx(), result.getMyx(), 0.00001); 432 assertEquals(expected.getMyy(), result.getMyy(), 0.00001); 433 assertEquals(expected.getMyz(), result.getMyz(), 0.00001); 434 assertEquals(expected.getTy(), result.getTy(), 0.00001); 435 assertEquals(expected.getMzx(), result.getMzx(), 0.00001); 436 assertEquals(expected.getMzy(), result.getMzy(), 0.00001); 437 assertEquals(expected.getMzz(), result.getMzz(), 0.00001); 438 assertEquals(expected.getTz(), result.getTz(), 0.00001); 439 } 440 }