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 }