本文整理汇总了C++中GeoImage::valid方法的典型用法代码示例。如果您正苦于以下问题:C++ GeoImage::valid方法的具体用法?C++ GeoImage::valid怎么用?C++ GeoImage::valid使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GeoImage
的用法示例。
在下文中一共展示了GeoImage::valid方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handleTile
bool CacheTileHandler::handleTile(const TileKey& key, const TileVisitor& tv)
{
ImageLayer* imageLayer = dynamic_cast< ImageLayer* >( _layer.get() );
ElevationLayer* elevationLayer = dynamic_cast< ElevationLayer* >( _layer.get() );
// Just call createImage or createHeightField on the layer and the it will be cached!
if (imageLayer)
{
GeoImage image = imageLayer->createImage( key );
if (image.valid())
{
return true;
}
}
else if (elevationLayer )
{
GeoHeightField hf = elevationLayer->createHeightField(key, 0L);
if (hf.valid())
{
return true;
}
}
// If we didn't produce a result but the key isn't within range then we should continue to
// traverse the children b/c a min level was set.
if (!_layer->isKeyInLegalRange(key))
{
return true;
}
return false;
}
示例2: while
bool
OSGTileFactory::createValidGeoImage(ImageLayer* layer,
const TileKey& key,
GeoImage& out_image,
TileKey& out_actualTileKey,
ProgressCallback* progress)
{
//TODO: Redo this to just grab images from the parent TerrainTiles
//Try to create the image with the given key
out_actualTileKey = key;
while (out_actualTileKey.valid())
{
if ( layer->isKeyValid(out_actualTileKey) )
{
out_image = layer->createImage( out_actualTileKey, progress );
if ( out_image.valid() )
{
return true;
}
}
out_actualTileKey = out_actualTileKey.createParentKey();
}
return false;
}
示例3: createImage
// override
// Creates an image.
osg::Image* createImage(const TileKey& key,
ProgressCallback* progress )
{
if ( !_imageLayer.valid() || !_featureSource.valid() )
return 0L;
// fetch the image for this key:
GeoImage image = _imageLayer->createImage(key, progress);
if ( !image.valid() )
return 0L;
// fetch a set of features for this key. The features are in their
// own SRS, so we need to transform:
const SpatialReference* featureSRS = _featureSource->getFeatureProfile()->getSRS();
GeoExtent extentInFeatureSRS = key.getExtent().transform( featureSRS );
// assemble a spatial query. It helps if your features have a spatial index.
Query query;
query.bounds() = extentInFeatureSRS.bounds();
//query.expression() = ... // SQL expression compatible with data source
osg::ref_ptr<FeatureCursor> cursor = _featureSource->createFeatureCursor(query);
// create a new image to return.
osg::Image* output = new osg::Image();
//output->allocateImage(128, 128, 1, GL_RGB, GL_UNSIGNED_BYTE);
// do your magic here.
return output;
}
示例4:
bool
CacheSeed::cacheTile(const MapFrame& mapf, const TileKey& key ) const
{
bool gotData = false;
for( ImageLayerVector::const_iterator i = mapf.imageLayers().begin(); i != mapf.imageLayers().end(); i++ )
{
ImageLayer* layer = i->get();
if ( layer->isKeyValid( key ) )
{
GeoImage image = layer->createImage( key );
if ( image.valid() )
gotData = true;
}
}
if ( mapf.elevationLayers().size() > 0 )
{
osg::ref_ptr<osg::HeightField> hf;
mapf.getHeightField( key, false, hf );
if ( hf.valid() )
gotData = true;
}
return gotData;
}
示例5: handleTile
bool handleTile(const TileKey& key)
{
bool ok = false;
GeoImage image = _source->createImage(key);
if ( image.valid() )
ok = _dest->storeImage(key, image.getImage(), 0L);
return ok;
}
示例6: createImage
osg::Image*
createImage( const TileKey& key, ProgressCallback* progress )
{
if ( !_image.valid() || key.getLevelOfDetail() > getMaxDataLevel() )
return NULL;
GeoImage cropped = _image.crop( key.getExtent(), true, getPixelsPerTile(), getPixelsPerTile() );
return cropped.valid() ? cropped.takeImage() : 0L;
}
示例7: execute
void execute()
{
GeoImage geoImage;
bool isFallbackData = false;
// fetch the image from the layer, falling back on parent keys utils we are
// able to find one that works.
TileKey imageKey( _key );
while( !geoImage.valid() && imageKey.valid() && _layer->isKeyValid(imageKey) )
{
geoImage = _layer->createImage( imageKey, 0L ); // TODO: include a progress callback?
if ( !geoImage.valid() )
{
imageKey = imageKey.createParentKey();
isFallbackData = true;
}
}
GeoLocator* locator = 0L;
if ( !geoImage.valid() )
{
// no image found, so make an empty one (one pixel alpha).
geoImage = GeoImage( ImageUtils::createEmptyImage(), _key.getExtent() );
locator = GeoLocator::createForKey( _key, *_mapInfo );
isFallbackData = true;
}
else
{
locator = GeoLocator::createForExtent(geoImage.getExtent(), *_mapInfo);
}
// add the color layer to the repo.
_repo->add( CustomColorLayer(
_layer,
geoImage.getImage(),
locator,
_key.getLevelOfDetail(),
_key,
isFallbackData ) );
}
示例8: CustomColorLayerRef
CustomColorLayerRef*
OSGTileFactory::createImageLayer(const MapInfo& mapInfo,
ImageLayer* layer,
const TileKey& key,
ProgressCallback* progress)
{
if ( !layer )
return 0L;
GeoImage geoImage;
//If the key is valid, try to get the image from the MapLayer
bool keyValid = layer->isKeyValid( key );
if ( keyValid )
{
geoImage = layer->createImage(key, progress);
}
else
{
//If the key is not valid, simply make a transparent tile
geoImage = GeoImage(ImageUtils::createEmptyImage(), key.getExtent());
}
if (geoImage.valid())
{
osg::ref_ptr<GeoLocator> imgLocator = GeoLocator::createForKey( key, mapInfo );
if ( mapInfo.isGeocentric() )
imgLocator->setCoordinateSystemType( osgTerrain::Locator::GEOCENTRIC );
return new CustomColorLayerRef( CustomColorLayer(
layer,
geoImage.getImage(),
imgLocator.get(),
key.getLevelOfDetail(),
key) );
}
return NULL;
}
示例9: handleTile
bool CacheTileHandler::handleTile( const TileKey& key )
{
ImageLayer* imageLayer = dynamic_cast< ImageLayer* >( _layer.get() );
ElevationLayer* elevationLayer = dynamic_cast< ElevationLayer* >( _layer.get() );
// Just call createImage or createHeightField on the layer and the it will be cached!
if (imageLayer)
{
GeoImage image = imageLayer->createImage( key );
if (image.valid())
{
return true;
}
}
else if (elevationLayer )
{
GeoHeightField hf = elevationLayer->createHeightField( key );
if (hf.valid())
{
return true;
}
}
return false;
}
示例10: GeoImage
GeoImage
ImageLayer::createImageInKeyProfile( const TileKey& key, ProgressCallback* progress, bool forceFallback, bool& out_isFallback )
{
GeoImage result;
out_isFallback = false;
// If the layer is disabled, bail out.
if ( !getEnabled() )
{
return GeoImage::INVALID;
}
// Check the max data level, which limits the LOD of available data.
if ( _runtimeOptions.maxDataLevel().isSet() && key.getLOD() > _runtimeOptions.maxDataLevel().value() )
{
return GeoImage::INVALID;
}
// Check for a "Minumum level" setting on this layer. If we are before the
// min level, just return the empty image. Do not cache empties
if ( _runtimeOptions.minLevel().isSet() && key.getLOD() < _runtimeOptions.minLevel().value() )
{
return GeoImage( _emptyImage.get(), key.getExtent() );
}
// Check for a "Minimum resolution" setting on the layer. If we are before the
// min resolution, return the empty image. Do not cache empties.
if ( _runtimeOptions.minResolution().isSet() )
{
double keyres = key.getExtent().width() / getTileSize();
double keyresInLayerProfile = key.getProfile()->getSRS()->transformUnits(keyres, getProfile()->getSRS());
if ( keyresInLayerProfile > _runtimeOptions.minResolution().value() )
{
return GeoImage( _emptyImage.get(), key.getExtent() );
}
}
OE_DEBUG << LC << "create image for \"" << key.str() << "\", ext= "
<< key.getExtent().toString() << std::endl;
// locate the cache bin for the target profile for this layer:
CacheBin* cacheBin = getCacheBin( key.getProfile() );
// validate that we have either a valid tile source, or we're cache-only.
if ( ! (getTileSource() || (isCacheOnly() && cacheBin) ) )
{
OE_WARN << LC << "Error: layer does not have a valid TileSource, cannot create image " << std::endl;
_runtimeOptions.enabled() = false;
return GeoImage::INVALID;
}
// validate the existance of a valid layer profile (unless we're in cache-only mode, in which
// case there is no layer profile)
if ( !isCacheOnly() && !getProfile() )
{
OE_WARN << LC << "Could not establish a valid profile" << std::endl;
_runtimeOptions.enabled() = false;
return GeoImage::INVALID;
}
// First, attempt to read from the cache. Since the cached data is stored in the
// map profile, we can try this first.
if ( cacheBin && getCachePolicy().isCacheReadable() )
{
ReadResult r = cacheBin->readImage( key.str(), getCachePolicy().getMinAcceptTime() );
if ( r.succeeded() )
{
ImageUtils::normalizeImage( r.getImage() );
return GeoImage( r.releaseImage(), key.getExtent() );
}
//else if ( r.code() == ReadResult::RESULT_EXPIRED )
//{
// OE_INFO << LC << getName() << " : " << key.str() << " record expired!" << std::endl;
//}
}
// The data was not in the cache. If we are cache-only, fail sliently
if ( isCacheOnly() )
{
return GeoImage::INVALID;
}
// Get an image from the underlying TileSource.
result = createImageFromTileSource( key, progress, forceFallback, out_isFallback );
// Normalize the image if necessary
if ( result.valid() )
{
ImageUtils::normalizeImage( result.getImage() );
}
// If we got a result, the cache is valid and we are caching in the map profile, write to the map cache.
if (result.valid() &&
//JB: Removed the check to not write out fallback data. If you have a low resolution base dataset (max lod 3) and a high resolution insert (max lod 22)
// then the low res data needs to "fallback" from LOD 4 - 22 so you can display the high res inset. If you don't cache these intermediate tiles then
// performance can suffer generating all those fallback tiles, especially if you have to do reprojection or mosaicing.
//!out_isFallback &&
//.........这里部分代码省略.........
示例11: refresh
void
OSGTerrainEngineNode::addImageLayer( ImageLayer* layerAdded )
{
if ( !layerAdded )
return;
if (!_isStreaming)
{
refresh();
}
else
{
// visit all existing terrain tiles and inform each one of the new image layer:
TileVector tiles;
_terrain->getTiles( tiles );
for( TileVector::iterator itr = tiles.begin(); itr != tiles.end(); ++itr )
{
Tile* tile = itr->get();
StreamingTile* streamingTile = 0L;
GeoImage geoImage;
bool needToUpdateImagery = false;
int imageLOD = -1;
if ( !_isStreaming || tile->getKey().getLevelOfDetail() == 1 )
{
// in standard mode, or at the first LOD in seq/pre mode, fetch the image immediately.
TileKey geoImageKey = tile->getKey();
_tileFactory->createValidGeoImage( layerAdded, tile->getKey(), geoImage, geoImageKey );
imageLOD = tile->getKey().getLevelOfDetail();
}
else
{
// in seq/pre mode, set up a placeholder and mark the tile as dirty.
geoImage = GeoImage(ImageUtils::createEmptyImage(), tile->getKey().getExtent() );
needToUpdateImagery = true;
streamingTile = static_cast<StreamingTile*>(tile);
}
if (geoImage.valid())
{
const MapInfo& mapInfo = _update_mapf->getMapInfo();
double img_min_lon, img_min_lat, img_max_lon, img_max_lat;
geoImage.getExtent().getBounds(img_min_lon, img_min_lat, img_max_lon, img_max_lat);
//Specify a new locator for the color with the coordinates of the TileKey that was actually used to create the image
osg::ref_ptr<GeoLocator> img_locator = tile->getKey().getProfile()->getSRS()->createLocator(
img_min_lon, img_min_lat, img_max_lon, img_max_lat,
!mapInfo.isGeocentric() );
//Set the CS to geocentric if we are dealing with a geocentric map
if ( mapInfo.isGeocentric() )
{
img_locator->setCoordinateSystemType( osgTerrain::Locator::GEOCENTRIC );
}
tile->setCustomColorLayer( CustomColorLayer(
layerAdded,
geoImage.getImage(),
img_locator.get(), imageLOD, tile->getKey() ) );
// if necessary, tell the tile to queue up a new imagery request (since we
// just installed a placeholder)
if ( needToUpdateImagery )
{
streamingTile->updateImagery( layerAdded, *_update_mapf, _tileFactory.get() );
}
}
else
{
// this can happen if there's no data in the new layer for the given tile.
// we will rely on the driver to dump out a warning if this is an error.
}
tile->applyImmediateTileUpdate( TileUpdate::ADD_IMAGE_LAYER, layerAdded->getUID() );
}
updateTextureCombining();
}
}
示例12: createFeatureCursor
FeatureCursor* createFeatureCursor( const Symbology::Query& query )
{
TileKey key = *query.tileKey();
#if 0
// Debug
Polygon* poly = new Polygon();
poly->push_back(key.getExtent().xMin(), key.getExtent().yMin());
poly->push_back(key.getExtent().xMax(), key.getExtent().yMin());
poly->push_back(key.getExtent().xMax(), key.getExtent().yMax());
poly->push_back(key.getExtent().xMin(), key.getExtent().yMax());
FeatureList features;
Feature* feature = new Feature(poly, SpatialReference::create("wgs84"));
features.push_back( feature );
return new FeatureListCursor( features );
#else
osg::ref_ptr< osgEarth::ImageLayer > layer = query.getMap()->getImageLayerByName(*_options.layer());
if (layer.valid())
{
GeoImage image = layer->createImage( key );
FeatureList features;
if (image.valid())
{
double pixWidth = key.getExtent().width() / (double)image.getImage()->s();
double pixHeight = key.getExtent().height() / (double)image.getImage()->t();
ImageUtils::PixelReader reader(image.getImage());
for (unsigned int r = 0; r < image.getImage()->t(); r++)
{
double y = key.getExtent().yMin() + (double)r * pixHeight;
double minX = 0;
double maxX = 0;
float value = 0.0;
for (unsigned int c = 0; c < image.getImage()->s(); c++)
{
double x = key.getExtent().xMin() + (double)c * pixWidth;
osg::Vec4f color = reader(c, r);
// Starting a new row. Initialize the values.
if (c == 0)
{
minX = x;
maxX = x + pixWidth;
value = color.r();
}
// Ending a row, finish the polygon.
else if (c == image.getImage()->s() -1)
{
// Increment the maxX to finish the row.
maxX = x + pixWidth;
Polygon* poly = new Polygon();
poly->push_back(minX, y);
poly->push_back(maxX, y);
poly->push_back(maxX, y+pixHeight);
poly->push_back(minX, y+pixHeight);
Feature* feature = new Feature(poly, SpatialReference::create("wgs84"));
feature->set(*_options.attribute(), value);
features.push_back( feature );
minX = x;
maxX = x + pixWidth;
value = color.r();
}
// The value is different, so complete the polygon and start a new one.
else if (color.r() != value)
{
Polygon* poly = new Polygon();
poly->push_back(minX, y);
poly->push_back(maxX, y);
poly->push_back(maxX, y+pixHeight);
poly->push_back(minX, y+pixHeight);
Feature* feature = new Feature(poly, SpatialReference::create("wgs84"));
feature->set(*_options.attribute(), value);
features.push_back( feature );
minX = x;
maxX = x + pixWidth;
value = color.r();
}
// The value is the same as the previous value, continue the polygon by increasing the maxX.
else if (color.r() == value)
{
maxX = x + pixWidth;
}
}
}
if (!features.empty())
{
//OE_NOTICE << LC << "Returning " << features.size() << " features" << std::endl;
return new FeatureListCursor( features );
}
}
}
//.........这里部分代码省略.........
示例13: GeoImage
GeoImage
ImageLayer::createImageInKeyProfile(const TileKey& key,
ProgressCallback* progress)
{
GeoImage result;
// If the layer is disabled, bail out.
if ( !getEnabled() )
{
return GeoImage::INVALID;
}
// Make sure the request is in range.
if ( !isKeyInRange(key) )
{
return GeoImage::INVALID;
}
OE_DEBUG << LC << "create image for \"" << key.str() << "\", ext= "
<< key.getExtent().toString() << std::endl;
// Check the layer L2 cache first
if ( _memCache.valid() )
{
CacheBin* bin = _memCache->getOrCreateBin( key.getProfile()->getFullSignature() );
ReadResult result = bin->readObject(key.str(), 0);
if ( result.succeeded() )
return GeoImage(static_cast<osg::Image*>(result.releaseObject()), key.getExtent());
//_memCache->dumpStats(key.getProfile()->getFullSignature());
}
// locate the cache bin for the target profile for this layer:
CacheBin* cacheBin = getCacheBin( key.getProfile() );
// validate that we have either a valid tile source, or we're cache-only.
if ( ! (getTileSource() || (isCacheOnly() && cacheBin) ) )
{
OE_WARN << LC << "Error: layer does not have a valid TileSource, cannot create image " << std::endl;
_runtimeOptions.enabled() = false;
return GeoImage::INVALID;
}
// validate the existance of a valid layer profile (unless we're in cache-only mode, in which
// case there is no layer profile)
if ( !isCacheOnly() && !getProfile() )
{
OE_WARN << LC << "Could not establish a valid profile" << std::endl;
_runtimeOptions.enabled() = false;
return GeoImage::INVALID;
}
// First, attempt to read from the cache. Since the cached data is stored in the
// map profile, we can try this first.
if ( cacheBin && getCachePolicy().isCacheReadable() )
{
ReadResult r = cacheBin->readImage( key.str(), getCachePolicy().getMinAcceptTime() );
if ( r.succeeded() )
{
ImageUtils::normalizeImage( r.getImage() );
return GeoImage( r.releaseImage(), key.getExtent() );
}
}
// The data was not in the cache. If we are cache-only, fail sliently
if ( isCacheOnly() )
{
return GeoImage::INVALID;
}
// Get an image from the underlying TileSource.
result = createImageFromTileSource( key, progress );
// Normalize the image if necessary
if ( result.valid() )
{
ImageUtils::normalizeImage( result.getImage() );
}
// memory cache first:
if ( result.valid() && _memCache.valid() )
{
CacheBin* bin = _memCache->getOrCreateBin( key.getProfile()->getFullSignature() );
bin->write(key.str(), result.getImage());
}
// If we got a result, the cache is valid and we are caching in the map profile,
// write to the map cache.
if (result.valid() &&
cacheBin &&
getCachePolicy().isCacheWriteable() )
{
if ( key.getExtent() != result.getExtent() )
{
OE_INFO << LC << "WARNING! mismatched extents." << std::endl;
}
cacheBin->write( key.str(), result.getImage() );
}
if ( result.valid() )
//.........这里部分代码省略.........
示例14: execute
void execute()
{
GeoImage geoImage;
bool isFallbackData = false;
bool useMercatorFastPath =
_opt->enableMercatorFastPath() != false &&
_mapInfo->isGeocentric() &&
_layer->getProfile() &&
_layer->getProfile()->getSRS()->isSphericalMercator();
// fetch the image from the layer, falling back on parent keys utils we are
// able to find one that works.
bool autoFallback = _key.getLevelOfDetail() <= 1;
TileKey imageKey( _key );
TileSource* tileSource = _layer->getTileSource();
const Profile* layerProfile = _layer->getProfile();
//Only try to get data from the source if it actually intersects the key extent
bool hasDataInExtent = true;
if (tileSource && layerProfile)
{
GeoExtent ext = _key.getExtent();
if (!layerProfile->getSRS()->isEquivalentTo( ext.getSRS()))
{
ext = layerProfile->clampAndTransformExtent( ext );
}
hasDataInExtent = ext.isValid() && tileSource->hasDataInExtent( ext );
}
if (hasDataInExtent)
{
while( !geoImage.valid() && imageKey.valid() && _layer->isKeyValid(imageKey) )
{
if ( useMercatorFastPath )
{
bool mercFallbackData = false;
geoImage = _layer->createImageInNativeProfile( imageKey, 0L, autoFallback, mercFallbackData );
if ( geoImage.valid() && mercFallbackData )
{
isFallbackData = true;
}
}
else
{
geoImage = _layer->createImage( imageKey, 0L, autoFallback );
}
if ( !geoImage.valid() )
{
imageKey = imageKey.createParentKey();
isFallbackData = true;
}
}
}
GeoLocator* locator = 0L;
if ( !geoImage.valid() )
{
// no image found, so make an empty one (one pixel alpha).
geoImage = GeoImage( ImageUtils::createEmptyImage(), _key.getExtent() );
locator = GeoLocator::createForKey( _key, *_mapInfo );
isFallbackData = true;
}
else
{
if ( useMercatorFastPath )
locator = new MercatorLocator(geoImage.getExtent());
else
locator = GeoLocator::createForExtent(geoImage.getExtent(), *_mapInfo);
}
bool isStreaming = _opt->loadingPolicy()->mode() == LoadingPolicy::MODE_PREEMPTIVE || _opt->loadingPolicy()->mode() == LoadingPolicy::MODE_SEQUENTIAL;
if (geoImage.getImage() && isStreaming)
{
// protected against multi threaded access. This is a requirement in sequential/preemptive mode,
// for example. This used to be in TextureCompositorTexArray::prepareImage.
// TODO: review whether this affects performance.
geoImage.getImage()->setDataVariance( osg::Object::DYNAMIC );
}
// add the color layer to the repo.
_repo->add( CustomColorLayer(
_layer,
geoImage.getImage(),
locator,
_key.getLevelOfDetail(),
_key,
isFallbackData ) );
}
示例15: createCoverageTexture
void
TerrainTileModelFactory::addColorLayers(TerrainTileModel* model,
const Map* map,
const TerrainEngineRequirements* reqs,
const TileKey& key,
const CreateTileModelFilter& filter,
ProgressCallback* progress)
{
OE_START_TIMER(fetch_image_layers);
int order = 0;
LayerVector layers;
map->getLayers(layers);
for (LayerVector::const_iterator i = layers.begin(); i != layers.end(); ++i)
{
Layer* layer = i->get();
if (layer->getRenderType() != layer->RENDERTYPE_TERRAIN_SURFACE)
continue;
if (!layer->getEnabled())
continue;
if (!filter.accept(layer))
continue;
ImageLayer* imageLayer = dynamic_cast<ImageLayer*>(layer);
if (imageLayer)
{
osg::Texture* tex = 0L;
osg::Matrixf textureMatrix;
if (imageLayer->isKeyInLegalRange(key) && imageLayer->mayHaveDataInExtent(key.getExtent()))
{
if (imageLayer->createTextureSupported())
{
tex = imageLayer->createTexture( key, progress, textureMatrix );
}
else
{
GeoImage geoImage = imageLayer->createImage( key, progress );
if ( geoImage.valid() )
{
if ( imageLayer->isCoverage() )
tex = createCoverageTexture(geoImage.getImage(), imageLayer);
else
tex = createImageTexture(geoImage.getImage(), imageLayer);
}
}
}
// if this is the first LOD, and the engine requires that the first LOD
// be populated, make an empty texture if we didn't get one.
if (tex == 0L &&
_options.firstLOD() == key.getLOD() &&
reqs && reqs->fullDataAtFirstLodRequired())
{
tex = _emptyTexture.get();
}
if (tex)
{
tex->setName(model->getKey().str());
TerrainTileImageLayerModel* layerModel = new TerrainTileImageLayerModel();
layerModel->setImageLayer(imageLayer);
layerModel->setTexture(tex);
layerModel->setMatrix(new osg::RefMatrixf(textureMatrix));
model->colorLayers().push_back(layerModel);
if (imageLayer->isShared())
{
model->sharedLayers().push_back(layerModel);
}
if (imageLayer->isDynamic())
{
model->setRequiresUpdateTraverse(true);
}
}
}
else // non-image kind of TILE layer:
{
TerrainTileColorLayerModel* colorModel = new TerrainTileColorLayerModel();
colorModel->setLayer(layer);
model->colorLayers().push_back(colorModel);
}
}
if (progress)
progress->stats()["fetch_imagery_time"] += OE_STOP_TIMER(fetch_image_layers);
}