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.effect; 27 28 import static com.sun.javafx.test.TestHelper.box; 29 import static org.junit.Assert.assertEquals; 30 import static org.junit.Assert.assertNull; 31 import static org.junit.Assert.fail; 32 import javafx.beans.property.ObjectProperty; 33 import javafx.beans.property.SimpleObjectProperty; 34 35 import org.junit.Before; 36 import org.junit.Test; 37 38 import com.sun.scenario.effect.Blend.Mode; 39 40 public class BlendTest extends EffectsTestBase { 41 private Blend effect; 42 43 @Before 44 public void setUp() { 45 effect = new Blend(); 46 setupTest(effect); 47 } 48 49 @Test 50 public void testSetOpacity() { 51 // try setting correct value 52 effect.setOpacity(0.5f); 53 assertEquals(0.5f, effect.getOpacity(), 1e-100); 54 pulse(); 55 assertEquals(0.5f, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getOpacity(), 1e-100); 56 } 57 58 @Test 59 public void testDefaultOpacity() { 60 // default value should be 1 61 assertEquals(1f, effect.getOpacity(), 1e-100); 62 assertEquals(1f, effect.opacityProperty().get(), 1e-100); 63 pulse(); 64 assertEquals(1f, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getOpacity(), 1e-100); 65 } 66 67 @Test 68 public void testMinOpacity() { 69 // 0 should be ok 70 effect.setOpacity(0); 71 // try setting value smaller than minimal 72 effect.setOpacity(-0.1f); 73 assertEquals(-0.1f, effect.getOpacity(), 1e-100); 74 pulse(); 75 assertEquals(0f, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getOpacity(), 1e-100); 76 } 77 78 @Test 79 public void testMaxOpacity() { 80 // 1 should be ok 81 effect.setOpacity(1); 82 // try setting value greater than maximal 83 effect.setOpacity(1.1f); 84 assertEquals(1.1f, effect.getOpacity(), 1e-100); 85 pulse(); 86 assertEquals(1f, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getOpacity(), 1e-100); 87 } 88 89 @Test 90 public void testSetMode() { 91 // try setting correct values 92 effect.setMode(BlendMode.ADD); 93 assertEquals(BlendMode.ADD, effect.getMode()); 94 pulse(); 95 assertEquals(Mode.ADD, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 96 97 effect.setMode(BlendMode.BLUE); 98 assertEquals(BlendMode.BLUE, effect.getMode()); 99 pulse(); 100 assertEquals(Mode.BLUE, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 101 102 effect.setMode(BlendMode.COLOR_BURN); 103 assertEquals(BlendMode.COLOR_BURN, effect.getMode()); 104 pulse(); 105 assertEquals(Mode.COLOR_BURN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 106 107 effect.setMode(BlendMode.COLOR_DODGE); 108 assertEquals(BlendMode.COLOR_DODGE, effect.getMode()); 109 pulse(); 110 assertEquals(Mode.COLOR_DODGE, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 111 112 effect.setMode(BlendMode.DARKEN); 113 assertEquals(BlendMode.DARKEN, effect.getMode()); 114 pulse(); 115 assertEquals(Mode.DARKEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 116 117 effect.setMode(BlendMode.DIFFERENCE); 118 assertEquals(BlendMode.DIFFERENCE, effect.getMode()); 119 pulse(); 120 assertEquals(Mode.DIFFERENCE, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 121 122 effect.setMode(BlendMode.EXCLUSION); 123 assertEquals(BlendMode.EXCLUSION, effect.getMode()); 124 pulse(); 125 assertEquals(Mode.EXCLUSION, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 126 127 effect.setMode(BlendMode.GREEN); 128 assertEquals(BlendMode.GREEN, effect.getMode()); 129 pulse(); 130 assertEquals(Mode.GREEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 131 132 effect.setMode(BlendMode.HARD_LIGHT); 133 assertEquals(BlendMode.HARD_LIGHT, effect.getMode()); 134 pulse(); 135 assertEquals(Mode.HARD_LIGHT, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 136 137 effect.setMode(BlendMode.LIGHTEN); 138 assertEquals(BlendMode.LIGHTEN, effect.getMode()); 139 pulse(); 140 assertEquals(Mode.LIGHTEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 141 142 effect.setMode(BlendMode.MULTIPLY); 143 assertEquals(BlendMode.MULTIPLY, effect.getMode()); 144 pulse(); 145 assertEquals(Mode.MULTIPLY, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 146 147 effect.setMode(BlendMode.OVERLAY); 148 assertEquals(BlendMode.OVERLAY, effect.getMode()); 149 pulse(); 150 assertEquals(Mode.OVERLAY, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 151 152 effect.setMode(BlendMode.RED); 153 assertEquals(BlendMode.RED, effect.getMode()); 154 pulse(); 155 assertEquals(Mode.RED, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 156 157 effect.setMode(BlendMode.ADD); 158 assertEquals(BlendMode.ADD, effect.getMode()); 159 pulse(); 160 assertEquals(Mode.ADD, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 161 162 effect.setMode(BlendMode.SCREEN); 163 assertEquals(BlendMode.SCREEN, effect.getMode()); 164 pulse(); 165 assertEquals(Mode.SCREEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 166 167 effect.setMode(BlendMode.SOFT_LIGHT); 168 assertEquals(BlendMode.SOFT_LIGHT, effect.getMode()); 169 pulse(); 170 assertEquals(Mode.SOFT_LIGHT, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 171 172 effect.setMode(BlendMode.SRC_ATOP); 173 assertEquals(BlendMode.SRC_ATOP, effect.getMode()); 174 pulse(); 175 assertEquals(Mode.SRC_ATOP, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 176 177 effect.setMode(BlendMode.SRC_OVER); 178 assertEquals(BlendMode.SRC_OVER, effect.getMode()); 179 pulse(); 180 assertEquals(Mode.SRC_OVER, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 181 182 effect.setMode(null); 183 assertNull(effect.getMode()); 184 pulse(); 185 assertEquals(Mode.SRC_OVER, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 186 } 187 188 @Test 189 public void testDefaultMode() { 190 // default value should be SRC_OVER 191 assertEquals(BlendMode.SRC_OVER, effect.getMode()); 192 assertEquals(BlendMode.SRC_OVER, effect.modeProperty().get()); 193 pulse(); 194 assertEquals(Mode.SRC_OVER, ((com.sun.scenario.effect.Blend)effect.impl_getImpl()).getMode()); 195 } 196 197 @Test 198 public void testBottomInput() { 199 // default is null 200 assertNull(effect.getBottomInput()); 201 // try setting input to some other effect 202 Effect blur = new BoxBlur(); 203 effect.setBottomInput(blur); 204 assertEquals(blur, effect.getBottomInput()); 205 206 // try setting input to null 207 effect.setBottomInput(null); 208 assertNull(effect.getBottomInput()); 209 } 210 211 @Test 212 public void testTopInput() { 213 // default is null 214 assertNull(effect.getTopInput()); 215 // try setting input to some other effect 216 Effect blur = new BoxBlur(); 217 effect.setTopInput(blur); 218 assertEquals(blur, effect.getTopInput()); 219 220 // try setting input to null 221 effect.setTopInput(null); 222 assertNull(effect.getTopInput()); 223 } 224 225 @Test 226 public void testOpacitySynced() throws Exception { 227 checkDoublePropertySynced( 228 "javafx.scene.effect.Blend", "opacity", 229 "com.sun.scenario.effect.Blend", "opacity", 230 0.3); 231 } 232 233 @Test 234 public void testModeSynced() throws Exception { 235 checkObjectPropertySynced( 236 "javafx.scene.effect.Blend", "mode", 237 "com.sun.scenario.effect.Blend", "mode", 238 BlendMode.OVERLAY, Mode.OVERLAY, 239 BlendMode.ADD); 240 } 241 242 @Test 243 public void testTopInputSynced() throws Exception { 244 BoxBlur blur = new BoxBlur(); 245 checkEffectPropertySynced( 246 "javafx.scene.effect.Blend", "topInput", 247 "com.sun.scenario.effect.Blend", "topInput", 248 blur, (com.sun.scenario.effect.BoxBlur)blur.impl_getImpl()); 249 } 250 251 @Test 252 public void testBottomInputSynced() throws Exception { 253 BoxBlur blur = new BoxBlur(); 254 checkEffectPropertySynced( 255 "javafx.scene.effect.Blend","bottomInput", 256 "com.sun.scenario.effect.Blend", "bottomInput", 257 blur, (com.sun.scenario.effect.BoxBlur)blur.impl_getImpl()); 258 } 259 260 @Test 261 public void testCycles() { 262 // try setting itself as top input 263 try { 264 effect.setTopInput(effect); 265 fail("IllegalArgument should have been thrown."); 266 } catch (IllegalArgumentException e) { 267 assertEquals(null, effect.getTopInput()); 268 } 269 270 // try setting itself as bottom input 271 try { 272 effect.setBottomInput(effect); 273 fail("IllegalArgument should have been thrown."); 274 } catch (IllegalArgumentException e) { 275 assertEquals(null, effect.getBottomInput()); 276 } 277 278 // test following cycle 279 // Blend <- BoxBlur <- Blend 280 BoxBlur blur = new BoxBlur(); 281 effect.setBottomInput(blur); 282 effect.setTopInput(blur); 283 try { 284 blur.setInput(effect); 285 fail("IllegalArgument should have been thrown."); 286 } catch (IllegalArgumentException e) { 287 assertEquals(null, blur.getInput()); 288 } 289 290 // test following cycle 291 // BoxBlur <- Blend <- BoxBlur 292 effect.setBottomInput(null); 293 effect.setTopInput(null); 294 blur.setInput(effect); 295 try { 296 effect.setBottomInput(blur); 297 fail("IllegalArgument should have been thrown."); 298 } catch (IllegalArgumentException e) {} 299 300 try { 301 effect.setTopInput(blur); 302 fail("IllegalArgument should have been thrown."); 303 } catch (IllegalArgumentException e) {} 304 305 assertEquals(null, effect.getTopInput()); 306 assertEquals(null, effect.getBottomInput()); 307 308 // try setting ColorInput effect (without input itself) as top and bottom input 309 // it shouldn't throw exception 310 ColorInput f = new ColorInput(); 311 effect.setBottomInput(f); 312 effect.setTopInput(f); 313 assertEquals(f, effect.getBottomInput()); 314 assertEquals(f, effect.getTopInput()); 315 } 316 317 @Test 318 public void testCyclesForBoundInput() { 319 ObjectProperty vTop = new SimpleObjectProperty(); 320 effect.topInputProperty().bind(vTop); 321 322 // try setting itself as top input 323 vTop.set(effect); 324 assertEquals(null, effect.getTopInput()); 325 vTop.set(null); 326 effect.topInputProperty().bind(vTop); 327 328 // try setting itself as bottom input 329 ObjectProperty vBottom = new SimpleObjectProperty(); 330 effect.bottomInputProperty().bind(vBottom); 331 332 vBottom.set(effect); 333 assertEquals(null, effect.getBottomInput()); 334 vBottom.set(null); 335 effect.bottomInputProperty().bind(vBottom); 336 337 // test following cycle 338 // Blend <- BoxBlur <- Blend 339 BoxBlur blur = new BoxBlur(); 340 ObjectProperty vBlur = new SimpleObjectProperty(); 341 blur.inputProperty().bind(vBlur); 342 vBottom.set(blur); 343 344 vBlur.set(effect); 345 assertEquals(null, blur.getInput()); 346 vBlur.set(null); 347 blur.inputProperty().bind(vBlur); 348 349 // test following cycle 350 // BoxBlur <- Blend <- BoxBlur 351 vTop.set(null); 352 vBottom.set(null); 353 vBlur.set(effect); 354 vBottom.set(blur); 355 assertEquals(null, effect.getBottomInput()); 356 vBottom.set(null); 357 effect.bottomInputProperty().bind(vBottom); 358 359 vTop.set(blur); 360 assertEquals(null, effect.getTopInput()); 361 vTop.set(null); 362 effect.topInputProperty().bind(vTop); 363 364 assertEquals(null, effect.getTopInput()); 365 assertEquals(null, effect.getBottomInput()); 366 367 // try setting ColorInput effect (without input itself) as top and bottom input 368 // it shouldn't throw exception 369 ColorInput f = new ColorInput(); 370 vBottom.set(f); 371 vTop.set(f); 372 assertEquals(f, effect.getBottomInput()); 373 assertEquals(f, effect.getTopInput()); 374 } 375 376 @Test 377 public void testBounds() { 378 assertEquals(box(0, 0, 100, 100), n.getBoundsInLocal()); 379 } 380 381 @Test 382 public void testBoundsWidthTopInput() { 383 assertEquals(box(0, 0, 100, 100), n.getBoundsInLocal()); 384 BoxBlur blur = new BoxBlur(); 385 effect.setTopInput(blur); 386 assertEquals(box(-2, -2, 104, 104), n.getBoundsInLocal()); 387 } 388 389 @Test 390 public void testBoundsWidthBottomInput() { 391 assertEquals(box(0, 0, 100, 100), n.getBoundsInLocal()); 392 BoxBlur blur = new BoxBlur(); 393 effect.setBottomInput(blur); 394 assertEquals(box(-2, -2, 104, 104), n.getBoundsInLocal()); 395 } 396 397 @Test 398 public void testBoundsWidthTopAndBottomInput() { 399 assertEquals(box(0, 0, 100, 100), n.getBoundsInLocal()); 400 401 BoxBlur blur = new BoxBlur(); 402 blur.setIterations(2); 403 effect.setTopInput(blur); 404 BoxBlur blur2 = new BoxBlur(); 405 blur2.setHeight(100); 406 effect.setBottomInput(blur2); 407 408 assertEquals(box(-4, -50, 108, 200), n.getBoundsInLocal()); 409 } 410 411 @Test 412 public void testCreateWithParams() { 413 effect = new Blend(BlendMode.GREEN); 414 setupTest(effect); 415 assertEquals(BlendMode.GREEN, effect.getMode()); 416 pulse(); 417 assertEquals(Mode.GREEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 418 } 419 420 @Test 421 public void testCreateWithParams3() { 422 Effect blur = new BoxBlur(); 423 Effect bloom = new Bloom(1); 424 425 effect = new Blend(BlendMode.GREEN, bloom, blur); 426 setupTest(effect); 427 assertEquals(BlendMode.GREEN, effect.getMode()); 428 assertEquals(bloom, effect.getBottomInput()); 429 assertEquals(blur, effect.getTopInput()); 430 pulse(); 431 assertEquals(Mode.GREEN, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 432 assertEquals(1.0f, ((com.sun.scenario.effect.Bloom) bloom.impl_getImpl()).getThreshold(), 1e-100); 433 } 434 435 @Test 436 public void testCreateWithDefaultParams() { 437 effect = new Blend(BlendMode.SRC_OVER); 438 setupTest(effect); 439 assertEquals(BlendMode.SRC_OVER, effect.getMode()); 440 pulse(); 441 assertEquals(Mode.SRC_OVER, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 442 } 443 444 @Test 445 public void testCreateWithDefaultParams3() { 446 effect = new Blend(BlendMode.SRC_OVER, null, null); 447 setupTest(effect); 448 assertEquals(BlendMode.SRC_OVER, effect.getMode()); 449 assertNull(effect.getBottomInput()); 450 assertNull(effect.getTopInput()); 451 pulse(); 452 assertEquals(Mode.SRC_OVER, ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getMode()); 453 assertNull( ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getBottomInput()); 454 assertNull( ((com.sun.scenario.effect.Blend) effect.impl_getImpl()).getTopInput()); 455 } 456 }