/*
* @(#)CheckerboardTransition2D.java
*
* $Date: 2014-06-06 20:04:49 +0200 (P, 06 jún. 2014) $
*
* Copyright (c) 2011 by Jeremy Wood.
* All rights reserved.
*
* The copyright of this software is owned by Jeremy Wood.
* You may not use, copy or modify this software, except in
* accordance with the license agreement you entered into with
* Jeremy Wood. For details see accompanying license terms.
*
* This software is probably, but not necessarily, discussed here:
* https://javagraphics.java.net/
*
* That site should also contain the most recent official version
* of this software. (See the SVN repository for more details.)
*/
package com.bric.image.transition;
import java.awt.Dimension;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import com.bric.geom.TransformUtils;
/** This creates a checkerboard pattern that grows to reveal the new frame. Here are playback samples:
* <p><table summary="Sample Animations of CheckerboardTransition2D" cellspacing="50" border="0"><tr>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/CheckerboardTransition2D/CheckerboardLeft.gif" alt="Checkerboard Left">
* <p>Checkerboard Left
* </td>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/CheckerboardTransition2D/CheckerboardRight.gif" alt="Checkerboard Right">
* <p>Checkerboard Right
* </td>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/CheckerboardTransition2D/CheckerboardUp.gif" alt="Checkerboard Up">
* <p>Checkerboard Up
* </td>
* <td align="center">
* <img src="https://javagraphics.java.net/resources/transition/CheckerboardTransition2D/CheckerboardDown.gif" alt="Checkerboard Down">
* <p>Checkerboard Down
* </td>
* </tr></table>
*
*/
public class CheckerboardTransition2D extends Transition2D {
/** This public static method is used by the
* {@link com.bric.image.transition.Transition2DDemoHelper}
* class to create sample animations of this transition.
* @return the transitions that should be used to demonstrate this
* transition.
*/
public static Transition[] getDemoTransitions() {
return new Transition[] {
new CheckerboardTransition2D(LEFT),
new CheckerboardTransition2D(RIGHT),
new CheckerboardTransition2D(UP),
new CheckerboardTransition2D(DOWN)
};
}
int type;
int rowCount = 20;
int columnCount = 20;
/** Creates a new CheckerboardTransition2D that moves right.
*
*/
public CheckerboardTransition2D() {
this(RIGHT);
}
/** Creates a new CheckerboardTransition2D.
*
* @param type must be LEFT, RIGHT, UP or DOWN
*/
public CheckerboardTransition2D(int type) {
if(!(type==RIGHT || type==LEFT || type==UP || type==DOWN)) {
throw new IllegalArgumentException("The type must be RIGHT, LEFT, UP or DOWN.");
}
this.type = type;
}
@Override
public Transition2DInstruction[] getInstructions(float progress,
Dimension size) {
GeneralPath clipping = new GeneralPath();
if(type==RIGHT || type==LEFT) {
float k = ((float)size.width)/columnCount*2;
float k2 = ((float)size.height)/rowCount;
for(int row = 0; row<rowCount; row++) {
float dx = 0;
if(row%2==0)
dx = k/2;
for(int column = -1; column<columnCount; column++) {
clipping.moveTo(column*k+dx, row*k2);
clipping.lineTo(column*k+dx, row*k2+k2);
clipping.lineTo(column*k+k*progress+dx, row*k2+k2);
clipping.lineTo(column*k+k*progress+dx, row*k2);
clipping.lineTo(column*k+dx, row*k2);
clipping.closePath();
}
}
if(type==LEFT) {
AffineTransform flip = TransformUtils.createAffineTransform(
0,0,
size.width,0,
0,size.height,
size.width,0,
0,0,
size.width,size.height
);
clipping.transform(flip);
}
} else {
float k = ((float)size.height)/rowCount*2;
float k2 = ((float)size.width)/columnCount;
for(int column = 0; column<columnCount; column++) {
float dy = 0;
if(column%2==0)
dy = k/2;
for(int row = -1; row<rowCount; row++) {
clipping.moveTo(column*k2, row*k+dy);
clipping.lineTo(column*k2+k2, row*k+dy);
clipping.lineTo(column*k2+k2, row*k+k*progress+dy);
clipping.lineTo(column*k2, row*k+k*progress+dy);
clipping.lineTo(column*k2, row*k+dy);
clipping.closePath();
}
}
if(type==UP) {
AffineTransform flip = TransformUtils.createAffineTransform(
0,0,
size.width,0,
0,size.height,
0,size.height,
size.width, size.height,
0,0
);
clipping.transform(flip);
}
}
return new Transition2DInstruction[] {
new ImageInstruction(true),
new ImageInstruction(false,null,clipping)
};
}
@Override
public String toString() {
if(type==RIGHT) {
return "Checkerboard Right";
} else if(type==LEFT) {
return "Checkerboard Left";
} else if(type==UP) {
return "Checkerboard Up";
} else {
return "Checkerboard Down";
}
}
}