001 /*
002 * $Id: McIdasFrame.java,v 1.10 2012/02/19 17:35:45 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2012
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 *
012 * All Rights Reserved
013 *
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.
016 *
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 *
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
025 * GNU Lesser Public License for more details.
026 *
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program. If not, see http://www.gnu.org/licenses.
029 */
030
031 package edu.wisc.ssec.mcidasv.data;
032
033 import edu.wisc.ssec.mcidasv.data.McIdasXInfo;
034 import edu.wisc.ssec.mcidasv.data.McIdasXFrameInfo;
035
036 import java.util.List;
037 import java.util.StringTokenizer;
038
039 import java.awt.Image;
040
041 import ucar.unidata.util.ColorTable;
042
043 /**
044 * Class to hold McIdas-X frame datasets
045 */
046 public class McIdasFrame {
047
048 /** frame data */
049 private int myFrameNumber = 0;
050 private McIdasXFrameInfo myXFrameInfo;
051
052 /** Keep local copies of everything so we dont have to go back over the bridge unless asked to refresh */
053 private int myLineSize = -1;
054 private int myElementSize = -1;
055 private FrameDirectory myFrameDirectory;
056 private ColorTable myColorTable;
057 private byte[] myImage;
058 private byte[] myGraphics;
059
060 /**
061 * Empty constructor for XML encoding
062 */
063 public McIdasFrame() {}
064
065 /**
066 * Construct a new McIdasFrame from the given frame number
067 *
068 * @param frameNumber frame number
069 */
070 public McIdasFrame(int frameNumber, McIdasXInfo xInfo) {
071 // System.out.println("McIdasFrame constructor for frame: " + frameNumber);
072 this.myFrameNumber = frameNumber;
073 this.myXFrameInfo = new McIdasXFrameInfo(frameNumber, xInfo);
074 }
075
076 /** Get frame number */
077 public int getFrameNumber() {
078 // System.out.println("McIdasFrame getFrameNumber: " + this.myFrameNumber);
079 return this.myFrameNumber;
080 }
081
082 /** Tell the XFrameInfo to refresh the cached data */
083 public void setRefreshData(boolean refresh) {
084 // System.out.println("McIdasFrame setRefreshData(" + refresh + ")");
085 this.myXFrameInfo.setRefreshData(refresh);
086 }
087
088 /** Get frame data */
089 public int getLineSize(boolean refresh) {
090 // System.out.println("McIdasFrame getLineSize(" + refresh + ")");
091 if (this.myLineSize <0 || refresh) {
092 this.myLineSize = this.myXFrameInfo.getLineSize();
093 }
094 return this.myLineSize;
095 }
096
097 /** Get frame data */
098 public int getElementSize(boolean refresh) {
099 // System.out.println("McIdasFrame getElementSize(" + refresh + ")");
100 if (this.myElementSize <0 || refresh) {
101 this.myElementSize = this.myXFrameInfo.getElementSize();
102 }
103 return this.myElementSize;
104 }
105
106 /** Get Frame Directory */
107 public FrameDirectory getFrameDirectory(boolean refresh) {
108 // System.out.println("McIdasFrame getFrameDirectory(" + refresh + ")");
109 if (this.myFrameDirectory == null || refresh) {
110 this.myFrameDirectory = new FrameDirectory(this.myXFrameInfo.getFrameDirectory());
111 }
112 return this.myFrameDirectory;
113 }
114
115 /** Get Color Table */
116 public ColorTable getColorTable(boolean refresh) {
117 // System.out.println("McIdasFrame getColorTable(" + refresh + ")");
118 if (this.myColorTable == null || refresh) {
119 this.myColorTable = new ColorTable("McIDAS-X",ColorTable.CATEGORY_BASIC,
120 this.myXFrameInfo.getEnhancementTable());
121 }
122 return this.myColorTable;
123 }
124
125 /** Get image data */
126 public byte[] getImageData(boolean refresh) {
127 // System.out.println("McIdasFrame getImageData(" + refresh + ")");
128 if (this.myImage == null || refresh) {
129 byte[] image = this.myXFrameInfo.getImage();
130 int height = this.myLineSize;
131 int width = this.myElementSize;
132 this.myImage = new byte[height*width];
133 for (int i=0; i<height; i++) {
134 for (int j=0; j<width; j++) {
135 this.myImage[i*width + j] = image[(height-i-1)*width + j];
136 }
137 }
138 }
139 return this.myImage;
140 }
141
142 /** Get graphics data */
143 public byte[] getGraphicsData(boolean refresh) {
144 // System.out.println("McIdasFrame getGraphicsData(" + refresh + ")");
145 if (this.myGraphics == null || refresh) {
146 List graphics = this.myXFrameInfo.getGraphics();
147 int height = this.myLineSize;
148 int width = this.myElementSize;
149 this.myGraphics = new byte[height*width];
150 for (int i=0; i<this.myGraphics.length; i++) {
151 this.myGraphics[i] = (byte)255;
152 }
153 String line;
154 StringTokenizer tok;
155 int[] graphicsPt = new int[3];
156 for (int i=0; i<graphics.size(); i++) {
157 line = (String)(graphics.get(i));
158 tok = new StringTokenizer(line);
159 for (int j=0; j<3; j++) {
160 graphicsPt[j] = new Integer(tok.nextToken()).intValue();
161 }
162 int color = graphicsPt[2];
163 int x = graphicsPt[1] - 1;
164 int y = graphicsPt[0] - 1;
165 if (((y<height)&&(y>0)) && ((x<width)&&(x>0))) {
166 this.myGraphics[y*width + x] = (byte)color;
167 }
168 }
169 }
170 return this.myGraphics;
171 }
172
173 /** Get image data */
174 public Image getGIF() {
175 return this.myXFrameInfo.getGIF();
176 }
177
178 /**
179 * See if this McIdasFrame is equal to the object in question
180 *
181 * @param o object in question
182 * @return true if <code>o</code> is a McIdasFrame and
183 * they area equivalent
184 */
185 public boolean equals(Object o) {
186 if ( !(o instanceof McIdasFrame)) {
187 return false;
188 }
189 McIdasFrame that = (McIdasFrame) o;
190 // System.out.println("McIdasFrame equals: " + this.toString() + " vs " + that.toString());
191 return (this.myFrameNumber == that.myFrameNumber);
192 }
193
194 /**
195 * Get a String representation of this object
196 *
197 * @return a string representation
198 */
199 public String toString() {
200 StringBuffer buf = new StringBuffer();
201 if (this.myFrameNumber > 0) {
202 buf.append("Frame " + this.myFrameNumber);
203 }
204 // System.out.println("McIdasFrame toString: " + buf);
205 return buf.toString();
206 }
207
208 }