/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/**
* @author Igor V. Stolyarov
*/
package com.jgraph.gaeawt.java.awt.image.renderable;
import java.util.Vector;
import org.apache.harmony.awt.internal.nls.Messages;
import com.jgraph.gaeawt.java.awt.RenderingHints;
import com.jgraph.gaeawt.java.awt.geom.AffineTransform;
import com.jgraph.gaeawt.java.awt.geom.Rectangle2D;
import com.jgraph.gaeawt.java.awt.image.RenderedImage;
public class RenderableImageOp implements RenderableImage {
ContextualRenderedImageFactory CRIF;
ParameterBlock paramBlock;
float minX, minY, width, height;
public RenderableImageOp(ContextualRenderedImageFactory CRIF, ParameterBlock paramBlock) {
this.CRIF = CRIF;
this.paramBlock = (ParameterBlock) paramBlock.clone();
Rectangle2D r = CRIF.getBounds2D(paramBlock);
minX = (float) r.getMinX();
minY = (float) r.getMinY();
width = (float) r.getWidth();
height = (float) r.getHeight();
}
public Object getProperty(String name) {
return CRIF.getProperty(paramBlock, name);
}
public ParameterBlock setParameterBlock(ParameterBlock paramBlock) {
ParameterBlock oldParam = this.paramBlock;
this.paramBlock = (ParameterBlock) paramBlock.clone();
return oldParam;
}
public RenderedImage createRendering(RenderContext renderContext) {
Vector<RenderableImage> sources = getSources();
ParameterBlock rdParam = (ParameterBlock) paramBlock.clone();
if (sources != null) {
Vector<Object> rdSources = new Vector<Object>();
int i = 0;
while (i < sources.size()) {
RenderContext newContext = CRIF.mapRenderContext(i, renderContext, paramBlock,
this);
RenderedImage rdim = sources.elementAt(i).createRendering(newContext);
if (rdim != null) {
rdSources.addElement(rdim);
}
i++;
}
if (rdSources.size() > 0) {
rdParam.setSources(rdSources);
}
}
return CRIF.create(renderContext, rdParam);
}
public RenderedImage createScaledRendering(int w, int h, RenderingHints hints) {
if(w == 0 && h == 0) {
// awt.60=Width and Height mustn't be equal zero both
throw new IllegalArgumentException(Messages.getString("awt.60")); //$NON-NLS-1$
}
if(w == 0){
w = Math.round(h*(getWidth()/getHeight()));
}
if(h == 0){
h = Math.round(w*(getHeight()/getWidth()));
}
double sx = (double)w/getWidth();
double sy = (double)h/getHeight();
AffineTransform at = AffineTransform.getScaleInstance(sx, sy);
RenderContext context = new RenderContext(at, hints);
return createRendering(context);
}
public Vector<RenderableImage> getSources() {
if(paramBlock.getNumSources() == 0) {
return null;
}
Vector<RenderableImage> v = new Vector<RenderableImage>();
int i = 0;
while(i < paramBlock.getNumSources()){
Object o = paramBlock.getSource(i);
if(o instanceof RenderableImage){
v.addElement((RenderableImage) o);
}
i++;
}
return v;
}
public String[] getPropertyNames() {
return CRIF.getPropertyNames();
}
public ParameterBlock getParameterBlock() {
return paramBlock;
}
public RenderedImage createDefaultRendering() {
AffineTransform at = new AffineTransform();
RenderContext context = new RenderContext(at);
return createRendering(context);
}
public boolean isDynamic() {
return CRIF.isDynamic();
}
public float getWidth() {
return width;
}
public float getMinY() {
return minY;
}
public float getMinX() {
return minX;
}
public float getHeight() {
return height;
}
}