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