/*
* Copyright 2015 Brandon Borkholder
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jogamp.glg2d.impl;
import java.awt.RenderingHints.Key;
import java.awt.geom.AffineTransform;
import java.util.ArrayDeque;
import java.util.Deque;
import org.jogamp.glg2d.GLG2DTransformHelper;
import org.jogamp.glg2d.GLGraphics2D;
public abstract class AbstractMatrixHelper implements GLG2DTransformHelper {
protected GLGraphics2D g2d;
protected Deque<AffineTransform> stack = new ArrayDeque<AffineTransform>();
@Override
public void setG2D(GLGraphics2D g2d) {
this.g2d = g2d;
stack.clear();
stack.push(new AffineTransform());
}
@Override
public void push(GLGraphics2D newG2d) {
stack.push(getTransform());
}
@Override
public void pop(GLGraphics2D parentG2d) {
stack.pop();
flushTransformToOpenGL();
}
@Override
public void setHint(Key key, Object value) {
// nop
}
@Override
public void resetHints() {
// nop
}
@Override
public void dispose() {
// nop
}
@Override
public void translate(int x, int y) {
translate((double) x, (double) y);
flushTransformToOpenGL();
}
@Override
public void translate(double tx, double ty) {
getTransform0().translate(tx, ty);
flushTransformToOpenGL();
}
@Override
public void rotate(double theta) {
getTransform0().rotate(theta);
flushTransformToOpenGL();
}
@Override
public void rotate(double theta, double x, double y) {
getTransform0().rotate(theta, x, y);
flushTransformToOpenGL();
}
@Override
public void scale(double sx, double sy) {
getTransform0().scale(sx, sy);
flushTransformToOpenGL();
}
@Override
public void shear(double shx, double shy) {
getTransform0().shear(shx, shy);
flushTransformToOpenGL();
}
@Override
public void transform(AffineTransform Tx) {
getTransform0().concatenate(Tx);
flushTransformToOpenGL();
}
@Override
public void setTransform(AffineTransform transform) {
getTransform0().setTransform(transform);
flushTransformToOpenGL();
}
@Override
public AffineTransform getTransform() {
return (AffineTransform) getTransform0().clone();
}
/**
* Returns the {@code AffineTransform} at the top of the stack, <em>not</em> a
* copy.
*/
protected AffineTransform getTransform0() {
return stack.peek();
}
/**
* Sends the {@code AffineTransform} that's on top of the stack to the video
* card.
*/
protected abstract void flushTransformToOpenGL();
}