GvRaster *gv_manager_get_dataset_raster( GvManager *manager, GDALDatasetH dataset, int band ) { int i; GvDataset *ds = NULL; GvSampleMethod sm; const char *sm_pref; if( band < 1 || band > GDALGetRasterCount(dataset) ) return NULL; /* * Find in our list. The dataset must already be "under management". */ for( i = 0; i < manager->datasets->len; i++ ) { ds = (GvDataset *) g_ptr_array_index(manager->datasets, i); if( dataset == ds->dataset ) break; } if( i == manager->datasets->len ) { g_warning( "gv_manager_get_dataset_raster called with unmanaged dataset" ); return NULL; } /* * Figure out the sample method to use from the preferences. */ sm_pref = gv_manager_get_preference( manager, "default_raster_sample"); if( sm_pref != NULL && EQUAL(sm_pref,"average") ) sm = GvSMAverage; else if( sm_pref != NULL && EQUAL(sm_pref,"average_8bit_phase") ) sm = GvSMAverage8bitPhase; else sm = GvSMSample; /* * Create a new GvRaster if it doesn't already exist. */ if( ds->rasters[band-1] == NULL ) { GDALRasterBandH gdal_band; gdal_band = GDALGetRasterBand( ds->dataset, band ); if( GDALGetRasterColorInterpretation(gdal_band) == GCI_PaletteIndex ) sm = GvSMSample; ds->rasters[band-1] = GV_RASTER(gv_raster_new( ds->dataset, band, sm)); g_signal_connect(GV_DATA(ds->rasters[band-1]), "destroy", G_CALLBACK(gv_manager_raster_destroy_cb), manager); } return ds->rasters[band-1]; }
GvSymbolObj * gv_symbol_manager_get_symbol(GvSymbolManager *manager, const char *symbol_name) { gchar *pszOpenEVHome = NULL; gchar *pszSymbolsDir = NULL; gchar *pszAbsolutePath = NULL; gchar *pszPathSeparator = NULL; GDALDatasetH hDataset; GvSymbolObj *poSymbol; CPLXMLNode *xml_shape = NULL; GByte *rgba_buffer; /* -------------------------------------------------------------------- */ /* Lookup the symbol in the hash table, and return it if found. */ /* -------------------------------------------------------------------- */ poSymbol = g_hash_table_lookup( manager->symbol_cache, symbol_name ); if( poSymbol != NULL ) return poSymbol; /* -------------------------------------------------------------------- */ /* We didn't already have it, so try to find a file to load it */ /* from. */ /* -------------------------------------------------------------------- */ #ifndef WIN32 pszPathSeparator = "/"; #else pszPathSeparator = "\\"; #endif /* WIN32 */ /* validate inputs */ g_return_val_if_fail( manager != NULL, 0 ); g_return_val_if_fail( symbol_name != NULL, 0 ); /* get an absolute path */ if ( !g_path_is_absolute( symbol_name ) ) { /* check configuration option first */ pszSymbolsDir = g_strdup( gv_manager_get_preference( gv_get_manager(), "symbols_dir" ) ); /* if not configured check $OPENEV_HOME */ if ( !pszSymbolsDir ) { pszOpenEVHome = g_getenv( "OPENEV_HOME" ); if( pszOpenEVHome == NULL ) pszOpenEVHome = g_getenv( "OPENEVHOME" ); if ( pszOpenEVHome ) pszSymbolsDir = g_strjoin( pszPathSeparator, pszOpenEVHome, "symbols", NULL ); } /* get current directory as last resort */ if ( !pszSymbolsDir ) pszSymbolsDir = g_get_current_dir(); pszAbsolutePath = g_strjoin( pszPathSeparator, pszSymbolsDir, symbol_name, NULL ); g_free( pszSymbolsDir ); } else pszAbsolutePath = g_strdup( symbol_name ); /* -------------------------------------------------------------------- */ /* pszAbsolutePath contains a newly allocated string that is */ /* suitable for using as a key in the hash table. If a texture */ /* is found in the hash table then this string needs to be */ /* freed. If one isn't found then the string is used in the */ /* hash table and should be freed when the associated hash */ /* table entry is released */ /* -------------------------------------------------------------------- */ CPLDebug( "OpenEV", "gv_symbol_manager_get_symbol(%s) ... need to load.", pszAbsolutePath ); /* * validate path by opening with GDAL and looking for an error * Disable CPL error handler to supress error reporting */ CPLErrorReset(); CPLPushErrorHandler( CPLQuietErrorHandler ); hDataset = GDALOpen( pszAbsolutePath, GA_ReadOnly ); CPLPopErrorHandler(); if ( hDataset ) { rgba_buffer = gdal_to_rgba( hDataset ); if ( rgba_buffer ) { gv_symbol_manager_inject_raster_symbol( manager, symbol_name, GDALGetRasterXSize( hDataset ), GDALGetRasterYSize( hDataset ), rgba_buffer ); CPLFree( rgba_buffer ); } GDALClose( hDataset ); } /* probably we have vector symbol? */ else if ( ( xml_shape = CPLParseXMLFile( pszAbsolutePath ) ) ) { GvShape *shape; shape = gv_shape_from_xml_tree( xml_shape ); CPLDestroyXMLNode( xml_shape ); if( shape != NULL ) gv_symbol_manager_inject_vector_symbol( manager, symbol_name, shape ); else { CPLDebug( "OpenEV", "Failed to instantiate GvSahpe from file %s, using simple point.", pszAbsolutePath ); shape = gv_shape_new( GVSHAPE_POINT ); gv_symbol_manager_inject_vector_symbol( manager, symbol_name, shape ); } } else { GvShape *shape; CPLDebug( "OpenEV", "Failed to open file %s, using simple point.", pszAbsolutePath ); shape = gv_shape_new( GVSHAPE_POINT ); gv_symbol_manager_inject_vector_symbol( manager, symbol_name, shape ); } /* look up in the hash table again */ poSymbol = g_hash_table_lookup(manager->symbol_cache, symbol_name ); g_free( pszAbsolutePath ); return poSymbol; }