bool ossimImageUtil::hasRequiredOverview( ossimRefPtr<ossimImageHandler>& ih, ossimRefPtr<ossimOverviewBuilderBase>& ob ) { bool result = false; if ( ih.valid() && ob.valid() && ( getCopyAllFlag() == false ) ) { if ( ih->getClassName() == "ossimCcfTileSource" ) { // CCF reader does not use external overviews. result = true; } else { // Note we always have one rset ossim_uint32 required = 1; ossim_uint32 startingResLevel = ih->getNumberOfDecimationLevels(); ossim_uint32 overviewStopDimension = ob->getOverviewStopDimension(); ossim_uint32 largestImageDimension = ih->getNumberOfSamples(0) > ih->getNumberOfLines(0) ? ih->getNumberOfSamples(0) : ih->getNumberOfLines(0); while(largestImageDimension > overviewStopDimension) { largestImageDimension /= 2; ++required; } if ( startingResLevel >= required ) { result = true; } } } return result; }
// Create overview for entry: void ossimImageUtil::createOverview(ossimRefPtr<ossimImageHandler>& ih, ossimRefPtr<ossimOverviewBuilderBase>& ob, ossim_uint32 entry, bool useEntryIndex, bool& consumedHistogramOptions) { static const char M[] = "ossimImageUtil::createOverview #2"; if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " entered...\n"; } if ( ih.valid() && ob.valid() ) { if (useEntryIndex) { // Set entry before deriving file name. ih->setCurrentEntry(entry); ossimNotify(ossimNotifyLevel_NOTICE) << "entry number: "<< entry << std::endl; } ossimFilename outputFile = ih->getFilenameWithThisExtension(ossimString(".ovr"), useEntryIndex); if ( rebuildOverviews() ) { ih->closeOverview(); if ( outputFile.exists() ) { outputFile.remove(); } } if ( getInternalOverviewsFlag() ) { if ( ih->getClassName() == "ossimTiffTileSource") { //--- // INTERNAL_OVERVIEWS_FLAG_KW is set to true: // Tiff reader can handle internal overviews. Set the output file to // input file. Do it after the above remove so that if there were // external overviews they will get removed. //--- outputFile = ih->getFilename(); } else { ossimNotify(ossimNotifyLevel_NOTICE) << "Internal overviews not supported for reader type: " <<ih->getClassName() << "\nIgnoring option..." << endl; } } if ( hasRequiredOverview( ih, ob ) == false ) { //--- // Set create histogram code... // // Notes: // 1) Must put this logic after any removal of external overview file. // // 2) Base file could have built in overviews, e.g. jp2 files. So the sequensor could // start at R6 even if there is no external overview file. // // 3) If user want the histogram from R0 the overview builder can do as long as // ossimImageHandler::getNumberOfDecimationLevels returns 1. If we are starting // overview building at R6 then we must do the create histogram in a separate path. //--- ossimHistogramMode histoMode = OSSIM_HISTO_MODE_UNKNOWN; if ( createHistogram() || ( createHistogramR0() && ( ih->getNumberOfDecimationLevels() == 1 ) ) ) { histoMode = OSSIM_HISTO_MODE_NORMAL; } else if ( createHistogramFast() ) { histoMode = OSSIM_HISTO_MODE_FAST; } if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << "Histogram mode: " << histoMode << "\n"; } if ( histoMode != OSSIM_HISTO_MODE_UNKNOWN ) { consumedHistogramOptions = true; ob->setHistogramMode(histoMode); ossimNotify(ossimNotifyLevel_NOTICE) << "Creating overviews with histogram for file: " << ih->getFilename() << std::endl; } else { if ( histoMode != OSSIM_HISTO_MODE_UNKNOWN ) { consumedHistogramOptions = false; ossimNotify(ossimNotifyLevel_NOTICE) << "Creating overviews for file: " << ih->getFilename() << std::endl; } } ob->setOutputFile(outputFile); ob->setInputSource(ih.get()); // Create the overview for this entry in this file: if ( ob->execute() == false ) { setErrorStatus( ossimErrorCodes::OSSIM_ERROR ); ossimNotify(ossimNotifyLevel_WARN) << "Error returned creating overviews for file: " << ih->getFilename() << std::endl; } } else { consumedHistogramOptions = false; ossimNotify(ossimNotifyLevel_NOTICE) << "Image has required reduced resolution data sets." << std::endl; } } if(traceDebug()) { ossimNotify(ossimNotifyLevel_DEBUG) << M << " exited...\n"; } }