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    }