1 /*
   2  * Copyright (c) 2013, 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.transform;
  27 
  28 import com.sun.javafx.geom.transform.Affine2D;
  29 import com.sun.javafx.geom.transform.Affine3D;
  30 import com.sun.javafx.geom.transform.BaseTransform;
  31 import com.sun.javafx.geom.transform.Identity;
  32 import com.sun.javafx.geom.transform.Translate2D;
  33 import java.util.Arrays;
  34 import java.util.Collection;
  35 import test.com.sun.javafx.test.TransformHelper;
  36 import javafx.geometry.Point3D;
  37 import javafx.scene.transform.Affine;
  38 import javafx.scene.transform.Rotate;
  39 import javafx.scene.transform.Scale;
  40 import javafx.scene.transform.Shear;
  41 import javafx.scene.transform.Transform;
  42 import javafx.scene.transform.Translate;
  43 import org.junit.Test;
  44 import org.junit.runner.RunWith;
  45 import org.junit.runners.Parameterized;
  46 import org.junit.runners.Parameterized.Parameters;
  47 
  48 import static org.junit.Assert.*;
  49 
  50 @RunWith(Parameterized.class)
  51 public class TransformDeriveTest {
  52 
  53     private static final Identity identity = new Identity();
  54     private static final Translate2D translate2d = new Translate2D(10, 20);
  55     private static final Affine2D affine2d = new Affine2D();
  56     static { affine2d.scale(2, 4); }
  57     private static final Affine3D affine3d = new Affine3D();
  58     static { affine3d.scale(2, 4, 8); }
  59 
  60     private static final Translate translate_identity = new Translate();
  61     private static final Translate translate_translate2d = new Translate(10, 20);
  62     private static final Translate translate_translate3d = new Translate(10, 20, 30);
  63 
  64     private static final Scale scale_identity = new Scale();
  65     private static final Scale scale_pivotedidentity = new Scale(1, 1, 20, 30);
  66     private static final Scale scale_scale2d = new Scale(2, 4);
  67     private static final Scale scale_pivotedscale2d = new Scale(2, 4, 20, 40);
  68     private static final Scale scale_scale3d = new Scale(2, 4, 8);
  69     private static final Scale scale_pivotedscale3d = new Scale(2, 4, 8, 20, 40, 60);
  70 
  71     private static final Rotate rotate_identity = new Rotate();
  72     private static final Rotate rotate_pivotedidentity = new Rotate(0.0, 10, 20, 30, Rotate.X_AXIS);
  73     private static final Rotate rotate_rotate2d = new Rotate(90);
  74     private static final Rotate rotate_negative2d = new Rotate(90, 0, 0, 0, new Point3D(0, 0, -1));
  75     private static final Rotate rotate_pivotedrotate2d = new Rotate(90, 20, 30);
  76     private static final Rotate rotate_rotate3d = new Rotate(90, 0, 0, 0, Rotate.X_AXIS);
  77     private static final Rotate rotate_pivotedrotate3d = new Rotate(90, 20, 30, 0, Rotate.X_AXIS);
  78 
  79     private static final Shear shear_identity = new Shear();
  80     private static final Shear shear_shear = new Shear(2, 3);
  81 
  82     private static final Affine affine_identity = new Affine();
  83     private static final Affine affine_translate2d = new Affine();
  84     static { affine_translate2d.appendTranslation(10, 20); }
  85     private static final Affine affine_translate3d = new Affine();
  86     static { affine_translate3d.appendTranslation(10, 20, 30); }
  87     private static final Affine affine_scale2d = new Affine();
  88     static { affine_scale2d.appendScale(2, 4); }
  89     private static final Affine affine_scale3d = new Affine();
  90     static { affine_scale3d.appendScale(2, 4, 8); }
  91     private static final Affine affine_affine2d = new Affine();
  92     static { affine_affine2d.appendRotation(45); }
  93     private static final Affine affine_affine3d = new Affine();
  94     static { affine_affine3d.appendRotation(45, 10, 20, 30, 1, 1, 1); }
  95 
  96     @Parameters
  97     public static Collection getParams() {
  98         return Arrays.asList(new Object[][] {
  99             { identity, translate_identity, Identity.class },           //  0
 100             { identity, translate_translate2d, Translate2D.class },
 101             { identity, translate_translate3d, Affine3D.class },
 102             { identity, scale_identity, Identity.class },
 103             { identity, scale_pivotedidentity, Identity.class },
 104             { identity, scale_scale2d, Affine2D.class },
 105             { identity, scale_pivotedscale2d, Affine2D.class },
 106             { identity, scale_scale3d, Affine3D.class },
 107             { identity, scale_pivotedscale3d, Affine3D.class },
 108             { identity, rotate_identity, Identity.class },
 109             { identity, rotate_pivotedidentity, Identity.class },       // 10
 110             { identity, rotate_rotate2d, Affine2D.class },
 111             { identity, rotate_negative2d, Affine2D.class },
 112             { identity, rotate_pivotedrotate2d, Affine2D.class },
 113             { identity, rotate_rotate3d, Affine3D.class },
 114             { identity, rotate_pivotedrotate3d, Affine3D.class },
 115             { identity, shear_identity, Identity.class },
 116             { identity, shear_shear, Affine2D.class },
 117             { identity, affine_identity, Identity.class },
 118             { identity, affine_translate2d, Translate2D.class },
 119             { identity, affine_translate3d, Affine3D.class },           // 20
 120             { identity, affine_scale2d, Affine2D.class },
 121             { identity, affine_scale3d, Affine3D.class },
 122             { identity, affine_affine2d, Affine2D.class },
 123             { identity, affine_affine3d, Affine3D.class },
 124 
 125             { translate2d, translate_identity, Translate2D.class },
 126             { translate2d, translate_translate2d, Translate2D.class },
 127             { translate2d, translate_translate3d, Affine3D.class },
 128             { translate2d, scale_identity, Translate2D.class },
 129             { translate2d, scale_pivotedidentity, Translate2D.class },
 130             { translate2d, scale_scale2d, Affine2D.class },             // 30
 131             { translate2d, scale_pivotedscale2d, Affine2D.class },
 132             { translate2d, scale_scale3d, Affine3D.class },
 133             { translate2d, scale_pivotedscale3d, Affine3D.class },
 134             { translate2d, rotate_identity, Translate2D.class },
 135             { translate2d, rotate_pivotedidentity, Translate2D.class },
 136             { translate2d, rotate_rotate2d, Affine2D.class },
 137             { translate2d, rotate_negative2d, Affine2D.class },
 138             { translate2d, rotate_pivotedrotate2d, Affine2D.class },
 139             { translate2d, rotate_rotate3d, Affine3D.class },
 140             { translate2d, rotate_pivotedrotate3d, Affine3D.class },    // 40
 141             { translate2d, shear_identity, Translate2D.class },
 142             { translate2d, shear_shear, Affine2D.class },
 143             { translate2d, affine_identity, Translate2D.class },
 144             { translate2d, affine_translate2d, Translate2D.class },
 145             { translate2d, affine_translate3d, Affine3D.class },
 146             { translate2d, affine_scale2d, Affine2D.class },
 147             { translate2d, affine_scale3d, Affine3D.class },
 148             { translate2d, affine_affine2d, Affine2D.class },
 149             { translate2d, affine_affine3d, Affine3D.class },
 150 
 151             { affine2d, translate_identity, Affine2D.class },           // 50
 152             { affine2d, translate_translate2d, Affine2D.class },
 153             { affine2d, translate_translate3d, Affine3D.class },
 154             { affine2d, scale_identity, Affine2D.class },
 155             { affine2d, scale_pivotedidentity, Affine2D.class },
 156             { affine2d, scale_scale2d, Affine2D.class },
 157             { affine2d, scale_pivotedscale2d, Affine2D.class },
 158             { affine2d, scale_scale3d, Affine3D.class },
 159             { affine2d, scale_pivotedscale3d, Affine3D.class },
 160             { affine2d, rotate_identity, Affine2D.class },
 161             { affine2d, rotate_pivotedidentity, Affine2D.class },       // 60
 162             { affine2d, rotate_rotate2d, Affine2D.class },
 163             { affine2d, rotate_negative2d, Affine2D.class },
 164             { affine2d, rotate_pivotedrotate2d, Affine2D.class },
 165             { affine2d, rotate_rotate3d, Affine3D.class },
 166             { affine2d, rotate_pivotedrotate3d, Affine3D.class },
 167             { affine2d, shear_identity, Affine2D.class },
 168             { affine2d, shear_shear, Affine2D.class },
 169             { affine2d, affine_identity, Affine2D.class },
 170             { affine2d, affine_translate2d, Affine2D.class },
 171             { affine2d, affine_translate3d, Affine3D.class },           // 70
 172             { affine2d, affine_scale2d, Affine2D.class },
 173             { affine2d, affine_scale3d, Affine3D.class },
 174             { affine2d, affine_affine2d, Affine2D.class },
 175             { affine2d, affine_affine3d, Affine3D.class },
 176 
 177             { affine3d, translate_identity, Affine3D.class },
 178             { affine3d, translate_translate2d, Affine3D.class },
 179             { affine3d, translate_translate3d, Affine3D.class },
 180             { affine3d, scale_identity, Affine3D.class },
 181             { affine3d, scale_pivotedidentity, Affine3D.class },
 182             { affine3d, scale_scale2d, Affine3D.class },                // 80
 183             { affine3d, scale_pivotedscale2d, Affine3D.class },
 184             { affine3d, scale_scale3d, Affine3D.class },
 185             { affine3d, scale_pivotedscale3d, Affine3D.class },
 186             { affine3d, rotate_identity, Affine3D.class },
 187             { affine3d, rotate_pivotedidentity, Affine3D.class },
 188             { affine3d, rotate_rotate2d, Affine3D.class },
 189             { affine3d, rotate_negative2d, Affine3D.class },
 190             { affine3d, rotate_pivotedrotate2d, Affine3D.class },
 191             { affine3d, rotate_rotate3d, Affine3D.class },
 192             { affine3d, rotate_pivotedrotate3d, Affine3D.class },       // 90
 193             { affine3d, shear_identity, Affine3D.class },
 194             { affine3d, shear_shear, Affine3D.class },
 195             { affine3d, affine_identity, Affine3D.class },
 196             { affine3d, affine_translate2d, Affine3D.class },
 197             { affine3d, affine_translate3d, Affine3D.class },
 198             { affine3d, affine_scale2d, Affine3D.class },
 199             { affine3d, affine_scale3d, Affine3D.class },
 200             { affine3d, affine_affine2d, Affine3D.class },
 201             { affine3d, affine_affine3d, Affine3D.class },              // 99
 202         });
 203     }
 204 
 205     private BaseTransform from;
 206     private Transform deriver;
 207     private Class deriveType;
 208 
 209     public TransformDeriveTest(BaseTransform from, Transform deriver, Class deriveType) {
 210         this.from = from.copy();
 211         this.deriver = deriver;
 212         this.deriveType = deriveType;
 213     }
 214 
 215     @Test public void testDerive() {
 216         Transform conc = TransformHelper.concatenate(from, deriver);
 217 
 218         BaseTransform res = deriver.impl_derive(from);
 219 
 220         assertSame(deriveType, res.getClass());
 221         TransformHelper.assertMatrix(res,
 222                 conc.getMxx(), conc.getMxy(), conc.getMxz(), conc.getTx(),
 223                 conc.getMyx(), conc.getMyy(), conc.getMyz(), conc.getTy(),
 224                 conc.getMzx(), conc.getMzy(), conc.getMzz(), conc.getTz());
 225    }
 226 }