1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // Intel License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000, Intel Corporation, all rights reserved. 14 // Third party copyrights are property of their respective owners. 15 // 16 // Redistribution and use in source and binary forms, with or without modification, 17 // are permitted provided that the following conditions are met: 18 // 19 // * Redistribution's of source code must retain the above copyright notice, 20 // this list of conditions and the following disclaimer. 21 // 22 // * Redistribution's in binary form must reproduce the above copyright notice, 23 // this list of conditions and the following disclaimer in the documentation 24 // and/or other materials provided with the distribution. 25 // 26 // * The name of Intel Corporation may not be used to endorse or promote products 27 // derived from this software without specific prior written permission. 28 // 29 // This software is provided by the copyright holders and contributors "as is" and 30 // any express or implied warranties, including, but not limited to, the implied 31 // warranties of merchantability and fitness for a particular purpose are disclaimed. 32 // In no event shall the Intel Corporation or contributors be liable for any direct, 33 // indirect, incidental, special, exemplary, or consequential damages 34 // (including, but not limited to, procurement of substitute goods or services; 35 // loss of use, data, or profits; or business interruption) however caused 36 // and on any theory of liability, whether in contract, strict liability, 37 // or tort (including negligence or otherwise) arising in any way out of 38 // the use of this software, even if advised of the possibility of such damage. 39 // 40 //M*/ 41 42 #include "_highgui.h" 43 44 #include "grfmt_base.h" 45 #include "bitstrm.h" 46 47 48 GrFmtReader::GrFmtReader( const char* filename ) 49 { 50 strncpy( m_filename, filename, sizeof(m_filename) - 1 ); 51 m_filename[sizeof(m_filename)-1] = '\0'; 52 m_width = m_height = 0; 53 m_iscolor = false; 54 m_bit_depth = 8; 55 m_native_depth = false; 56 m_isfloat = false; 57 } 58 59 60 GrFmtReader::~GrFmtReader() 61 { 62 Close(); 63 } 64 65 66 void GrFmtReader::Close() 67 { 68 m_width = m_height = 0; 69 m_iscolor = false; 70 } 71 72 73 GrFmtWriter::GrFmtWriter( const char* filename ) 74 { 75 strncpy( m_filename, filename, sizeof(m_filename) - 1 ); 76 m_filename[sizeof(m_filename)-1] = '\0'; 77 } 78 79 80 bool GrFmtWriter::IsFormatSupported( int depth ) 81 { 82 return depth == IPL_DEPTH_8U; 83 } 84 85 86 GrFmtFilterFactory::GrFmtFilterFactory() 87 { 88 m_description = m_signature = 0; 89 m_sign_len = 0; 90 } 91 92 93 bool GrFmtFilterFactory::CheckFile( const char* filename ) 94 { 95 FILE* f = 0; 96 char signature[4096]; 97 int sign_len = 0; 98 int cur_sign_len = GetSignatureLength(); 99 100 if( !filename ) return false; 101 102 assert( cur_sign_len <= (int)sizeof( signature ) ); 103 f = fopen( filename, "rb" ); 104 105 if( f ) 106 { 107 sign_len = (int)fread( signature, 1, cur_sign_len, f ); 108 fclose( f ); 109 110 if( cur_sign_len <= sign_len && CheckSignature( signature ) ) 111 return true; 112 } 113 114 return false; 115 } 116 117 118 bool GrFmtFilterFactory::CheckSignature( const char* signature ) 119 { 120 return m_sign_len > 0 && signature != 0 && 121 memcmp( signature, m_signature, m_sign_len ) == 0; 122 } 123 124 125 static int GetExtensionLength( const char* buffer ) 126 { 127 int len = 0; 128 129 if( buffer ) 130 { 131 const char* ext = strchr( buffer, '.'); 132 if( ext++ ) 133 while( isalnum(ext[len]) && len < _MAX_PATH ) 134 len++; 135 } 136 137 return len; 138 } 139 140 141 bool GrFmtFilterFactory::CheckExtension( const char* format ) 142 { 143 const char* descr = 0; 144 int len = 0; 145 146 if( !format || !m_description ) 147 return false; 148 149 // find the right-most extension of the passed format string 150 for(;;) 151 { 152 const char* ext = strchr( format + 1, '.' ); 153 if( !ext ) break; 154 format = ext; 155 } 156 157 len = GetExtensionLength( format ); 158 159 if( format[0] != '.' || len == 0 ) 160 return false; 161 162 descr = strchr( m_description, '(' ); 163 164 while( descr ) 165 { 166 descr = strchr( descr + 1, '.' ); 167 int i, len2 = GetExtensionLength( descr ); 168 169 if( len2 == 0 ) 170 break; 171 172 if( len2 == len ) 173 { 174 for( i = 0; i < len; i++ ) 175 { 176 int c1 = tolower(format[i+1]); 177 int c2 = tolower(descr[i+1]); 178 179 if( c1 != c2 ) 180 break; 181 } 182 if( i == len ) 183 return true; 184 } 185 } 186 187 return false; 188 } 189 190 191 192 ///////////////////// GrFmtFilterList ////////////////////////// 193 194 GrFmtFactoriesList::GrFmtFactoriesList() 195 { 196 m_factories = 0; 197 RemoveAll(); 198 } 199 200 201 GrFmtFactoriesList::~GrFmtFactoriesList() 202 { 203 RemoveAll(); 204 } 205 206 207 void GrFmtFactoriesList::RemoveAll() 208 { 209 if( m_factories ) 210 { 211 for( int i = 0; i < m_curFactories; i++ ) delete m_factories[i]; 212 delete[] m_factories; 213 } 214 m_factories = 0; 215 m_maxFactories = m_curFactories = 0; 216 } 217 218 219 bool GrFmtFactoriesList::AddFactory( GrFmtFilterFactory* factory ) 220 { 221 assert( factory != 0 ); 222 if( m_curFactories == m_maxFactories ) 223 { 224 // reallocate the factorys pointers storage 225 int newMaxFactories = 2*m_maxFactories; 226 if( newMaxFactories < 16 ) newMaxFactories = 16; 227 228 GrFmtFilterFactory** newFactories = new GrFmtFilterFactory*[newMaxFactories]; 229 230 for( int i = 0; i < m_curFactories; i++ ) newFactories[i] = m_factories[i]; 231 232 delete[] m_factories; 233 m_factories = newFactories; 234 m_maxFactories = newMaxFactories; 235 } 236 237 m_factories[m_curFactories++] = factory; 238 return true; 239 } 240 241 242 ListPosition GrFmtFactoriesList::GetFirstFactoryPos() 243 { 244 return (ListPosition)m_factories; 245 } 246 247 248 GrFmtFilterFactory* GrFmtFactoriesList::GetNextFactory( ListPosition& pos ) 249 { 250 GrFmtFilterFactory* factory = 0; 251 GrFmtFilterFactory** temp = (GrFmtFilterFactory**)pos; 252 253 assert( temp == 0 || (m_factories <= temp && temp < m_factories + m_curFactories)); 254 if( temp ) 255 { 256 factory = *temp++; 257 pos = (ListPosition)(temp < m_factories + m_curFactories ? temp : 0); 258 } 259 return factory; 260 } 261 262 263 GrFmtReader* GrFmtFactoriesList::FindReader( const char* filename ) 264 { 265 if( !filename ) return 0; 266 267 GrFmtReader* reader = 0; 268 ListPosition pos = GetFirstFactoryPos(); 269 270 while( pos ) 271 { 272 GrFmtFilterFactory* tempFactory = GetNextFactory( pos ); 273 if( tempFactory->CheckFile( filename ) ) 274 { 275 reader = tempFactory->NewReader( filename ); 276 break; 277 } 278 } 279 280 return reader; 281 } 282 283 284 GrFmtWriter* GrFmtFactoriesList::FindWriter( const char* filename ) 285 { 286 GrFmtWriter* writer = 0; 287 ListPosition pos = GetFirstFactoryPos(); 288 289 if( !filename ) return 0; 290 291 while( pos ) 292 { 293 GrFmtFilterFactory* tempFactory = GetNextFactory(pos); 294 if( tempFactory->CheckExtension( filename )) 295 { 296 writer = tempFactory->NewWriter( filename ); 297 break; 298 } 299 } 300 301 return writer; 302 } 303 304 /* End of file. */ 305 306