1 : /******************************************************************************
2 : * $Id: fujibasdataset.cpp 17664 2009-09-21 21:16:45Z rouault $
3 : *
4 : * Project: eCognition
5 : * Purpose: Implementation of FUJI BAS Format
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2001, Frank Warmerdam
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #include "rawdataset.h"
31 : #include "cpl_string.h"
32 :
33 : CPL_CVSID("$Id: fujibasdataset.cpp 17664 2009-09-21 21:16:45Z rouault $");
34 :
35 : CPL_C_START
36 : void GDALRegister_FujiBAS(void);
37 : CPL_C_END
38 :
39 : /************************************************************************/
40 : /* ==================================================================== */
41 : /* FujiBASDataset */
42 : /* ==================================================================== */
43 : /************************************************************************/
44 :
45 : class FujiBASDataset : public RawDataset
46 : {
47 : FILE *fpImage; // image data file.
48 :
49 : char **papszHeader;
50 :
51 : public:
52 : FujiBASDataset();
53 : ~FujiBASDataset();
54 :
55 : static GDALDataset *Open( GDALOpenInfo * );
56 : };
57 :
58 : /************************************************************************/
59 : /* FujiBASDataset() */
60 : /************************************************************************/
61 :
62 1 : FujiBASDataset::FujiBASDataset()
63 : {
64 1 : fpImage = NULL;
65 1 : papszHeader = NULL;
66 1 : }
67 :
68 : /************************************************************************/
69 : /* ~FujiBASDataset() */
70 : /************************************************************************/
71 :
72 2 : FujiBASDataset::~FujiBASDataset()
73 :
74 : {
75 1 : FlushCache();
76 1 : if( fpImage != NULL )
77 1 : VSIFClose( fpImage );
78 1 : CSLDestroy( papszHeader );
79 2 : }
80 :
81 : /************************************************************************/
82 : /* Open() */
83 : /************************************************************************/
84 :
85 8559 : GDALDataset *FujiBASDataset::Open( GDALOpenInfo * poOpenInfo )
86 :
87 : {
88 : /* -------------------------------------------------------------------- */
89 : /* We assume the user is pointing to the header (.pcb) file. */
90 : /* Does this appear to be a pcb file? */
91 : /* -------------------------------------------------------------------- */
92 8559 : if( poOpenInfo->nHeaderBytes < 80 || poOpenInfo->fp == NULL )
93 8328 : return NULL;
94 :
95 231 : if( !EQUALN((const char *)poOpenInfo->pabyHeader,"[Raw data]",10)
96 : || strstr((const char *)poOpenInfo->pabyHeader, "Fuji BAS") == NULL )
97 230 : return NULL;
98 :
99 : /* -------------------------------------------------------------------- */
100 : /* Load the header file. */
101 : /* -------------------------------------------------------------------- */
102 : char **papszHeader;
103 : int nXSize, nYSize;
104 : const char *pszOrgFile;
105 :
106 1 : papszHeader = CSLLoad( poOpenInfo->pszFilename );
107 :
108 1 : if( papszHeader == NULL )
109 0 : return NULL;
110 :
111 : /* -------------------------------------------------------------------- */
112 : /* Munge header information into form suitable for CSL functions. */
113 : /* -------------------------------------------------------------------- */
114 : int i;
115 :
116 12 : for( i = 0; papszHeader[i] != NULL; i++ )
117 : {
118 11 : char *pszSep = strstr(papszHeader[i]," = ");
119 :
120 11 : if( pszSep != NULL )
121 : {
122 0 : memmove( pszSep + 1, pszSep + 3, strlen(pszSep+3)+1 );
123 0 : *pszSep = '=';
124 : }
125 : }
126 :
127 : /* -------------------------------------------------------------------- */
128 : /* Fetch required fields. */
129 : /* -------------------------------------------------------------------- */
130 1 : if( CSLFetchNameValue(papszHeader, "width") == NULL
131 : || CSLFetchNameValue(papszHeader, "height") == NULL
132 : || CSLFetchNameValue(papszHeader, "OrgFile") == NULL )
133 : {
134 0 : CSLDestroy( papszHeader );
135 0 : return NULL;
136 : }
137 :
138 1 : nYSize = atoi(CSLFetchNameValue(papszHeader,"width"));
139 1 : nXSize = atoi(CSLFetchNameValue(papszHeader,"height"));
140 :
141 1 : pszOrgFile = CSLFetchNameValue(papszHeader,"OrgFile");
142 :
143 1 : if( nXSize < 1 || nYSize < 1 )
144 : {
145 0 : CSLDestroy( papszHeader );
146 0 : return NULL;
147 : }
148 :
149 : /* -------------------------------------------------------------------- */
150 : /* Confirm the requested access is supported. */
151 : /* -------------------------------------------------------------------- */
152 1 : if( poOpenInfo->eAccess == GA_Update )
153 : {
154 : CPLError( CE_Failure, CPLE_NotSupported,
155 : "The FUJIBAS driver does not support update access to existing"
156 0 : " datasets.\n" );
157 0 : return NULL;
158 : }
159 :
160 : /* -------------------------------------------------------------------- */
161 : /* Try to open the original data file. */
162 : /* -------------------------------------------------------------------- */
163 : const char *pszRawFile;
164 1 : char *pszPath = CPLStrdup(CPLGetPath(poOpenInfo->pszFilename));
165 : FILE *fpRaw;
166 :
167 1 : pszRawFile = CPLFormCIFilename( pszPath, pszOrgFile, "IMG" );
168 1 : CPLFree( pszPath );
169 :
170 1 : fpRaw = VSIFOpen( pszRawFile, "rb" );
171 1 : if( fpRaw == NULL )
172 : {
173 : CPLError( CE_Failure, CPLE_OpenFailed,
174 : "Trying to open Fuji BAS image with the header file:\n"
175 : " Header=%s\n"
176 : "but expected raw image file doesn't appear to exist. Trying to open:\n"
177 : " Raw File=%s\n"
178 : "Perhaps the raw file needs to be renamed to match expected?",
179 : poOpenInfo->pszFilename,
180 0 : pszRawFile );
181 0 : CSLDestroy( papszHeader );
182 0 : return NULL;
183 : }
184 :
185 : /* -------------------------------------------------------------------- */
186 : /* Create a corresponding GDALDataset. */
187 : /* -------------------------------------------------------------------- */
188 : FujiBASDataset *poDS;
189 :
190 1 : poDS = new FujiBASDataset();
191 :
192 : /* -------------------------------------------------------------------- */
193 : /* Capture some information from the file that is of interest. */
194 : /* -------------------------------------------------------------------- */
195 1 : poDS->nRasterXSize = nXSize;
196 1 : poDS->nRasterYSize = nYSize;
197 1 : poDS->papszHeader = papszHeader;
198 1 : poDS->fpImage = fpRaw;
199 :
200 : /* -------------------------------------------------------------------- */
201 : /* Create band information object. */
202 : /* -------------------------------------------------------------------- */
203 : int bNativeOrder;
204 : #ifdef CPL_MSB
205 : bNativeOrder = TRUE;
206 : #else
207 1 : bNativeOrder = FALSE;
208 : #endif
209 : poDS->SetBand( 1,
210 : new RawRasterBand( poDS, 1, poDS->fpImage,
211 2 : 0, 2, nXSize * 2, GDT_UInt16, bNativeOrder ));
212 :
213 : /* -------------------------------------------------------------------- */
214 : /* Initialize any PAM information. */
215 : /* -------------------------------------------------------------------- */
216 1 : poDS->SetDescription( poOpenInfo->pszFilename );
217 1 : poDS->TryLoadXML();
218 :
219 : /* -------------------------------------------------------------------- */
220 : /* Check for overviews. */
221 : /* -------------------------------------------------------------------- */
222 1 : poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename );
223 :
224 1 : return( poDS );
225 : }
226 :
227 : /************************************************************************/
228 : /* GDALRegister_FujiBAS() */
229 : /************************************************************************/
230 :
231 338 : void GDALRegister_FujiBAS()
232 :
233 : {
234 : GDALDriver *poDriver;
235 :
236 338 : if( GDALGetDriverByName( "FujiBAS" ) == NULL )
237 : {
238 336 : poDriver = new GDALDriver();
239 :
240 336 : poDriver->SetDescription( "FujiBAS" );
241 : poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
242 336 : "Fuji BAS Scanner Image" );
243 : poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
244 336 : "frmt_various.html#FujiBAS" );
245 :
246 336 : poDriver->pfnOpen = FujiBASDataset::Open;
247 :
248 336 : GetGDALDriverManager()->RegisterDriver( poDriver );
249 : }
250 338 : }
251 :
|