CPLErr VRTRasterBand::GetHistogram( double dfMin, double dfMax, int nBuckets, GUIntBig * panHistogram, int bIncludeOutOfRange, int bApproxOK, GDALProgressFunc pfnProgress, void *pProgressData ) { /* -------------------------------------------------------------------- */ /* Check if we have a matching histogram. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psHistItem = PamFindMatchingHistogram( m_psSavedHistograms, dfMin, dfMax, nBuckets, bIncludeOutOfRange, bApproxOK ); if( psHistItem != NULL ) { GUIntBig *panTempHist = NULL; if( PamParseHistogram( psHistItem, &dfMin, &dfMax, &nBuckets, &panTempHist, &bIncludeOutOfRange, &bApproxOK ) ) { memcpy( panHistogram, panTempHist, sizeof(GUIntBig) * nBuckets ); CPLFree( panTempHist ); return CE_None; } } /* -------------------------------------------------------------------- */ /* We don't have an existing histogram matching the request, so */ /* generate one manually. */ /* -------------------------------------------------------------------- */ CPLErr eErr = GDALRasterBand::GetHistogram( dfMin, dfMax, nBuckets, panHistogram, bIncludeOutOfRange, bApproxOK, pfnProgress, pProgressData ); /* -------------------------------------------------------------------- */ /* Save an XML description of this histogram. */ /* -------------------------------------------------------------------- */ if( eErr == CE_None ) { CPLXMLNode *psXMLHist = PamHistogramToXMLTree( dfMin, dfMax, nBuckets, panHistogram, bIncludeOutOfRange, bApproxOK ); if( psXMLHist != NULL ) { reinterpret_cast<VRTDataset *>( poDS )->SetNeedsFlush(); if( m_psSavedHistograms == NULL ) m_psSavedHistograms = CPLCreateXMLNode( NULL, CXT_Element, "Histograms" ); CPLAddXMLChild( m_psSavedHistograms, psXMLHist ); } } return eErr; }
CPLErr GDALPamRasterBand::SetDefaultHistogram( double dfMin, double dfMax, int nBuckets, int *panHistogram) { CPLXMLNode *psNode; PamInitialize(); if( psPam == NULL ) return GDALRasterBand::SetDefaultHistogram( dfMin, dfMax, nBuckets, panHistogram ); /* -------------------------------------------------------------------- */ /* Do we have a matching histogram we should replace? */ /* -------------------------------------------------------------------- */ psNode = PamFindMatchingHistogram( psPam->psSavedHistograms, dfMin, dfMax, nBuckets, TRUE, TRUE ); if( psNode != NULL ) { /* blow this one away */ CPLRemoveXMLChild( psPam->psSavedHistograms, psNode ); CPLDestroyXMLNode( psNode ); } /* -------------------------------------------------------------------- */ /* Translate into a histogram XML tree. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psHistItem; psHistItem = PamHistogramToXMLTree( dfMin, dfMax, nBuckets, panHistogram, TRUE, FALSE ); if( psHistItem == NULL ) return CE_Failure; /* -------------------------------------------------------------------- */ /* Insert our new default histogram at the front of the */ /* histogram list so that it will be the default histogram. */ /* -------------------------------------------------------------------- */ psPam->poParentDS->MarkPamDirty(); if( psPam->psSavedHistograms == NULL ) psPam->psSavedHistograms = CPLCreateXMLNode( NULL, CXT_Element, "Histograms" ); psHistItem->psNext = psPam->psSavedHistograms->psChild; psPam->psSavedHistograms->psChild = psHistItem; return CE_None; }
CPLErr VRTRasterBand::SetDefaultHistogram( double dfMin, double dfMax, int nBuckets, GUIntBig *panHistogram) { CPLXMLNode *psNode; /* -------------------------------------------------------------------- */ /* Do we have a matching histogram we should replace? */ /* -------------------------------------------------------------------- */ psNode = PamFindMatchingHistogram( psSavedHistograms, dfMin, dfMax, nBuckets, TRUE, TRUE ); if( psNode != NULL ) { /* blow this one away */ CPLRemoveXMLChild( psSavedHistograms, psNode ); CPLDestroyXMLNode( psNode ); } /* -------------------------------------------------------------------- */ /* Translate into a histogram XML tree. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psHistItem; psHistItem = PamHistogramToXMLTree( dfMin, dfMax, nBuckets, panHistogram, TRUE, FALSE ); if( psHistItem == NULL ) return CE_Failure; /* -------------------------------------------------------------------- */ /* Insert our new default histogram at the front of the */ /* histogram list so that it will be the default histogram. */ /* -------------------------------------------------------------------- */ ((VRTDataset *) poDS)->SetNeedsFlush(); if( psSavedHistograms == NULL ) psSavedHistograms = CPLCreateXMLNode( NULL, CXT_Element, "Histograms" ); psHistItem->psNext = psSavedHistograms->psChild; psSavedHistograms->psChild = psHistItem; return CE_None; }
CPLErr GDALPamRasterBand::GetHistogram( double dfMin, double dfMax, int nBuckets, int * panHistogram, int bIncludeOutOfRange, int bApproxOK, GDALProgressFunc pfnProgress, void *pProgressData ) { PamInitialize(); if( psPam == NULL ) return GDALRasterBand::GetHistogram( dfMin, dfMax, nBuckets, panHistogram, bIncludeOutOfRange, bApproxOK, pfnProgress, pProgressData ); /* -------------------------------------------------------------------- */ /* Check if we have a matching histogram. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psHistItem; psHistItem = PamFindMatchingHistogram( psPam->psSavedHistograms, dfMin, dfMax, nBuckets, bIncludeOutOfRange, bApproxOK ); if( psHistItem != NULL ) { int *panTempHist = NULL; if( PamParseHistogram( psHistItem, &dfMin, &dfMax, &nBuckets, &panTempHist, &bIncludeOutOfRange, &bApproxOK ) ) { memcpy( panHistogram, panTempHist, sizeof(int) * nBuckets ); CPLFree( panTempHist ); return CE_None; } } /* -------------------------------------------------------------------- */ /* We don't have an existing histogram matching the request, so */ /* generate one manually. */ /* -------------------------------------------------------------------- */ CPLErr eErr; eErr = GDALRasterBand::GetHistogram( dfMin, dfMax, nBuckets, panHistogram, bIncludeOutOfRange, bApproxOK, pfnProgress, pProgressData ); /* -------------------------------------------------------------------- */ /* Save an XML description of this histogram. */ /* -------------------------------------------------------------------- */ if( eErr == CE_None ) { CPLXMLNode *psXMLHist; psXMLHist = PamHistogramToXMLTree( dfMin, dfMax, nBuckets, panHistogram, bIncludeOutOfRange, bApproxOK ); if( psXMLHist != NULL ) { psPam->poParentDS->MarkPamDirty(); if( psPam->psSavedHistograms == NULL ) psPam->psSavedHistograms = CPLCreateXMLNode( NULL, CXT_Element, "Histograms" ); CPLAddXMLChild( psPam->psSavedHistograms, psXMLHist ); } } return eErr; }