/******************************************************************************
 * Copyright (c) 2002, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    IBM Corporation - initial API and implementation 
 ****************************************************************************/

package org.eclipse.gmf.runtime.draw2d.ui.render;

import org.eclipse.swt.graphics.RGB;

/**
 * @author sshaw
 * 
 * Contains information needed by RenderedImage to perform the rendering of the
 * Vector graphics data.
 * 
 * IMPORTANT: This interface is <EM>not</EM> intended to be implemented by
 * clients. 
 * New methods may be added in the future.
 */
public interface RenderInfo {

	/**
	 * Accessor method to return the width of the rendered image.
	 * 
	 * @return the width of the rendered image.
	 */
	public abstract int getWidth();

	/**
	 * Accessor method to return the height of the rendered image.
	 * 
	 * @return the height of the rendered image.
	 */
	public abstract int getHeight();

	/**
	 * Accessor method to return the fill color of the rendered image.
	 * 
	 * @return <code>RGB</code> value that is the fill color of the rendered
	 *         image. Note: a <code>null</code> return value is valid and
	 *         means that the fill color defaults to the values stored in the
	 *         vector graphics file.
	 */
	public abstract RGB getBackgroundColor();

	/**
	 * Accessor method to return the outline color of the rendered image.
	 * 
	 * @return <code>RGB</code> value that is the outline color of the
	 *         rendered image. Note: a <code>null</code> return value is valid
	 *         and means that the outline color defaults to the values stored in
	 *         the vector graphics file.
	 */
	public abstract RGB getForegroundColor();

	/**
	 * Accessor method to return whether or not the aspect ratio is maintained.
	 * 
	 * @return <code>boolean</code> <code>true</code> if aspect ratio of
	 *         original vector file is maintained, <code>false</code>
	 *         otherwise.
	 */
	public abstract boolean shouldMaintainAspectRatio();

	/**
	 * Accessor method to return whether or not the vector data is anti-aliased.
	 * 
	 * @return <code>boolean</code> <code>true</code> if vector graphic is
	 *         to be rendered wih anti-aliasing, <code>false</code> otherwise.
	 */
	public abstract boolean shouldAntiAlias();

	/**
	 * Generic setter to set values in the RenderInfo data structure. This is
	 * useful when retrieving a RenderInfo structure from a RenderedImage object
	 * and then wishing to re-render the image with new values.
	 * 
	 * @param width
	 *            the width of the rendered image to set
	 * @param height
	 *            the height of the rendered image to set
	 * @param maintainAspectRatio
	 *            <code>boolean</code> <code>true</code> if aspect ratio of
	 *            original vector file is maintained, <code>false</code>
	 *            otherwise
	 * @param antialias
	 *            <code>boolean</code> <code>true</code> if vector graphic
	 *            is to be rendered wih anti-aliasing, <code>false</code>
	 *            otherwise.
	 * @param background
	 *            <code>Color</code> fill color for the whole image: null
	 *            value defaults to stored values for each element in the vector
	 *            file.
	 * @param outline
	 *            <code>Color</code> outline color for the whole image: null
	 *            value defaults to stored foreground for each element in the
	 *            vector file.
	 */
	public abstract void setValues(int width, int height,
			boolean maintainAspectRatio, boolean antialias, RGB background,
			RGB foreground);
}
