Exemplo n.º 1
0
CPLErr GDALProxyDataset::IRasterIO( GDALRWFlag eRWFlag,
                        int nXOff, int nYOff, int nXSize, int nYSize,
                        void * pData, int nBufXSize, int nBufYSize,
                        GDALDataType eBufType,
                        int nBandCount, int *panBandMap,
                        GSpacing nPixelSpace, GSpacing nLineSpace, GSpacing nBandSpace,
                        GDALRasterIOExtraArg* psExtraArg)
{
    CPLErr ret;
    GDALDataset* poUnderlyingDataset = RefUnderlyingDataset();
    if (poUnderlyingDataset)
    {
/* -------------------------------------------------------------------- */
/*      Do some validation of parameters.                               */
/* -------------------------------------------------------------------- */
        if( nXOff + nXSize > poUnderlyingDataset->GetRasterXSize() ||
            nYOff + nYSize > poUnderlyingDataset->GetRasterYSize() )
        {
            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,
                         poUnderlyingDataset->GetRasterXSize(),
                         poUnderlyingDataset->GetRasterYSize() );
            ret = CE_Failure;
        }
        else if( panBandMap == NULL && nBandCount > poUnderlyingDataset->GetRasterCount() )
        {
            ReportError( CE_Failure, CPLE_IllegalArg,
                        "%s: nBandCount cannot be greater than %d",
                        "IRasterIO", poUnderlyingDataset->GetRasterCount() );
            ret = CE_Failure;
        }
        else
        {
            ret = CE_None;
            for( int i = 0; i < nBandCount && ret == CE_None; ++i )
            {
                int iBand = (panBandMap != NULL) ? panBandMap[i] : i + 1;
                if( iBand < 1 || iBand > poUnderlyingDataset->GetRasterCount() )
                {
                    ReportError( CE_Failure, CPLE_IllegalArg,
                              "%s: panBandMap[%d] = %d, this band does not exist on dataset.",
                              "IRasterIO", i, iBand );
                    ret = CE_Failure;
                }

                if( ret == CE_None && poUnderlyingDataset->GetRasterBand( iBand ) == NULL )
                {
                    ReportError( CE_Failure, CPLE_IllegalArg,
                              "%s: panBandMap[%d]=%d, this band should exist but is NULL!",
                              "IRasterIO", i, iBand );
                    ret = CE_Failure;
                }
            }
            if( ret != CE_Failure )
            {
                ret = poUnderlyingDataset->IRasterIO( eRWFlag, nXOff, nYOff, nXSize, nYSize,
                                pData, nBufXSize, nBufYSize,
                                eBufType, nBandCount, panBandMap,
                                nPixelSpace, nLineSpace, nBandSpace, psExtraArg );
            }
        }
        UnrefUnderlyingDataset(poUnderlyingDataset);
    }
    else
    {
        ret = CE_Failure;
    }
    return ret;
}