001 /* EVolve - an Extensible Software Visualization Framework
002 * Copyright (C) 2001-2002 Qin Wang
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Library General Public
006 * License as published by the Free Software Foundation; either
007 * version 2 of the License, or (at your option) any later version.
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Library General Public License for more details.
013 *
014 * You should have received a copy of the GNU Library General Public
015 * License along with this library; if not, write to the
016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017 * Boston, MA 02111-1307, USA.
018 */
019
020 /*
021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022 */
023
024 package EVolve.visualization;
025
026 import java.awt.*;
027 import java.awt.image.*;
028
029 /**
030 * Automatic expanding image.
031 */
032 public class AutoImage {
033 private Color[][] image; // the image
034 private int w, h; // width and height of the content
035 private int wMax, hMax; // width and height of the image
036
037 /**
038 * Creates an auto-image.
039 */
040 public AutoImage() {
041 w = 0;
042 h = 0;
043 wMax = 200;
044 hMax = 200;
045 image = new Color[wMax][hMax];
046 for (int i = 0; i < wMax; i++) {
047 for (int j = 0; j < hMax; j++) {
048 image[i][j] = null;
049 }
050 }
051 }
052
053 /**
054 * Sets the color of a pixel.
055 *
056 * @param x position on X-axis
057 * @param y position on Y-axis
058 * @param color the color
059 */
060 public void setColor(int x, int y, Color color) {
061 if ((x >= wMax) || (y >= hMax)) {
062 while (x >= wMax) {
063 wMax += 200;
064 }
065 while (y >= hMax) {
066 hMax += 200;
067 }
068
069 Color[][] newImage = new Color[wMax][hMax];
070 for (int i = 0; i < wMax; i++) {
071 for (int j = 0; j < hMax; j++) {
072 newImage[i][j] = null;
073 }
074 }
075 for (int i = 0; i < w; i++) {
076 for (int j = 0; j < h; j++) {
077 newImage[i][j] = image[i][j];
078 }
079 }
080 image = newImage;
081 }
082 image[x][y] = color;
083
084 if (x >= w) {
085 w = x + 1;
086 }
087 if (y >= h) {
088 h = y + 1;
089 }
090 }
091
092 /**
093 * Gets the color of a pixel.
094 *
095 * @param x position on X-axis
096 * @param y position on Y-axis
097 * @return the color
098 */
099 public Color getColor(int x, int y) {
100 if ((x >= wMax) || (y >= hMax)) {
101 return null;
102 } else {
103 return image[x][y];
104 }
105 }
106
107 public Color getSortedColor(ReferenceDimension xAxis, ReferenceDimension yAxis,int x,int y) {
108 int sortedX,sortedY;
109 sortedX = (xAxis == null) ? x : xAxis.getSourceIndex(x);
110 sortedY = (yAxis == null) ? y : yAxis.getSourceIndex(y);
111
112 if ((sortedX >= wMax) || (sortedY >= hMax) || (sortedX < 0) || (sortedY < 0))
113 return null;
114 else
115 return image[sortedX][sortedY];
116 }
117
118 /**
119 * Gets the buffered-image.
120 *
121 * @return buffered-image
122 */
123 public BufferedImage getImage() {
124 BufferedImage returnVal = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
125 returnVal.getGraphics().setColor(Color.white);
126 returnVal.getGraphics().fillRect(0, 0, w, h);
127
128 for (int i = 0; i < w; i++) {
129 for (int j = 0; j < h; j++) {
130 if (image[i][j] != null) {
131 returnVal.setRGB(i, j, image[i][j].getRGB());
132 }
133 }
134 }
135
136 return returnVal;
137 }
138
139 /**
140 * Sorts the image.
141 *
142 * @param xAxis dimension that represents the X-axis, null if doesn't need to be sorted
143 * @param yAxis dimension that represents the Y-axis, null if doesn't need to be sorted
144 * @return sorted image
145 */
146 public AutoImage getSortedImage(ReferenceDimension xAxis, ReferenceDimension yAxis) {
147 AutoImage returnVal = new AutoImage();
148 for (int i = 0; i < w; i++) {
149 for (int j = 0; j < h; j++) {
150 int x, y;
151 if (xAxis == null) {
152 x = i;
153 } else {
154 x = xAxis.getSortedIndex(i);
155 }
156 if (yAxis == null) {
157 y = j;
158 } else {
159 y = yAxis.getSortedIndex(j);
160 }
161 if ((x != -1) && (y != -1)) {
162 returnVal.setColor(x, y, image[i][j]);
163 }
164 }
165 }
166 return returnVal;
167 }
168
169 public int getDimension(int dim) {
170 if (dim == -1) return image.length;
171
172 return image[dim].length;
173 }
174
175 public int getW() {
176 return w;
177 }
178
179 public int getH() {
180 return h;
181 }
182
183 }