const char *GDALProxyPoolRasterBand::GetMetadataItem( const char * pszName, const char * pszDomain ) { if (metadataItemSet == NULL) metadataItemSet = CPLHashSetNew(hash_func_get_metadata_item, equal_func_get_metadata_item, free_func_get_metadata_item); GDALRasterBand* poUnderlyingRasterBand = RefUnderlyingRasterBand(); if (poUnderlyingRasterBand == NULL) return NULL; const char* pszUnderlyingMetadataItem = poUnderlyingRasterBand->GetMetadataItem(pszName, pszDomain); GetMetadataItemElt* pElt = (GetMetadataItemElt*) CPLMalloc(sizeof(GetMetadataItemElt)); pElt->pszName = (pszName) ? CPLStrdup(pszName) : NULL; pElt->pszDomain = (pszDomain) ? CPLStrdup(pszDomain) : NULL; pElt->pszMetadataItem = (pszUnderlyingMetadataItem) ? CPLStrdup(pszUnderlyingMetadataItem) : NULL; CPLHashSetInsert(metadataItemSet, pElt); UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return pElt->pszMetadataItem; }
GDALRasterBand *GDALProxyPoolRasterBand::GetOverview(int nOverviewBand) { if (nOverviewBand >= 0 && nOverviewBand < nSizeProxyOverviewRasterBand) { if (papoProxyOverviewRasterBand[nOverviewBand]) return papoProxyOverviewRasterBand[nOverviewBand]; } GDALRasterBand* poUnderlyingRasterBand = RefUnderlyingRasterBand(); if (poUnderlyingRasterBand == NULL) return NULL; GDALRasterBand* poOverviewRasterBand = poUnderlyingRasterBand->GetOverview(nOverviewBand); if (poOverviewRasterBand == NULL) { UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return NULL; } if (nOverviewBand >= nSizeProxyOverviewRasterBand) { int i; papoProxyOverviewRasterBand = (GDALProxyPoolOverviewRasterBand**) CPLRealloc(papoProxyOverviewRasterBand, sizeof(GDALProxyPoolOverviewRasterBand*) * (nOverviewBand + 1)); for(i=nSizeProxyOverviewRasterBand; i<nOverviewBand + 1;i++) papoProxyOverviewRasterBand[i] = NULL; nSizeProxyOverviewRasterBand = nOverviewBand + 1; } papoProxyOverviewRasterBand[nOverviewBand] = new GDALProxyPoolOverviewRasterBand((GDALProxyPoolDataset*)poDS, poOverviewRasterBand, this, nOverviewBand); UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return papoProxyOverviewRasterBand[nOverviewBand]; }
const char *GDALProxyPoolRasterBand::GetUnitType() { GDALRasterBand* poUnderlyingRasterBand = RefUnderlyingRasterBand(); if (poUnderlyingRasterBand == NULL) return NULL; CPLFree(pszUnitType); pszUnitType = NULL; const char* pszUnderlyingUnitType = poUnderlyingRasterBand->GetUnitType(); if (pszUnderlyingUnitType) pszUnitType = CPLStrdup(pszUnderlyingUnitType); UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return pszUnitType; }
GDALColorTable *GDALProxyPoolRasterBand::GetColorTable() { GDALRasterBand* poUnderlyingRasterBand = RefUnderlyingRasterBand(); if (poUnderlyingRasterBand == NULL) return NULL; if (poColorTable) delete poColorTable; poColorTable = NULL; GDALColorTable* poUnderlyingColorTable = poUnderlyingRasterBand->GetColorTable(); if (poUnderlyingColorTable) poColorTable = poUnderlyingColorTable->Clone(); UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return poColorTable; }
GDALRasterBand *GDALProxyPoolRasterBand::GetMaskBand() { if (poProxyMaskBand) return poProxyMaskBand; GDALRasterBand* poUnderlyingRasterBand = RefUnderlyingRasterBand(); if (poUnderlyingRasterBand == NULL) return NULL; GDALRasterBand* poMaskBand = poUnderlyingRasterBand->GetMaskBand(); poProxyMaskBand = new GDALProxyPoolMaskBand((GDALProxyPoolDataset*)poDS, poMaskBand, this); UnrefUnderlyingRasterBand(poUnderlyingRasterBand); return poProxyMaskBand; }
CPLErr GDALProxyRasterBand::FlushCache() { // We need to make sure that all cached bocks at the proxy level are // first flushed CPLErr ret = GDALRasterBand::FlushCache(); if( ret == CE_None ) { GDALRasterBand* poSrcBand = RefUnderlyingRasterBand(); if (poSrcBand) { ret = poSrcBand->FlushCache(); UnrefUnderlyingRasterBand(poSrcBand); } else { ret = CE_Failure; } } return ret; }
CPLErr GDALProxyRasterBand::IRasterIO( GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize, void * pData, int nBufXSize, int nBufYSize, GDALDataType eBufType, GSpacing nPixelSpace, GSpacing nLineSpace, GDALRasterIOExtraArg* psExtraArg ) { CPLErr ret; GDALRasterBand* poSrcBand = RefUnderlyingRasterBand(); if (poSrcBand) { /* -------------------------------------------------------------------- */ /* Do some validation of parameters. */ /* -------------------------------------------------------------------- */ if( nXOff + nXSize > poSrcBand->GetXSize() || nYOff + nYSize > poSrcBand->GetYSize() ) { ReportError( CE_Failure, CPLE_IllegalArg, "Access window out of range in RasterIO(). Requested\n" "(%d,%d) of size %dx%d on raster of %dx%d.", nXOff, nYOff, nXSize, nYSize, poSrcBand->GetXSize(), poSrcBand->GetYSize() ); ret = CE_Failure; } else { ret = poSrcBand->IRasterIO(eRWFlag, nXOff, nYOff, nXSize, nYSize, pData, nBufXSize, nBufYSize, eBufType, nPixelSpace, nLineSpace, psExtraArg ); } UnrefUnderlyingRasterBand(poSrcBand); } else { ret = CE_Failure; } return ret; }