Skip to content

Commit

Permalink
Avoid GDALRefreshGenImgProjTransformer() to do useless work
Browse files Browse the repository at this point in the history
Helps decreasing the gdalwarp time of OSGeo#3470 from 135 ms to 123 ms.
  • Loading branch information
rouault committed Mar 18, 2021
1 parent 901a201 commit 9438b89
Showing 1 changed file with 50 additions and 28 deletions.
78 changes: 50 additions & 28 deletions gdal/alg/gdaltransformer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -957,8 +957,53 @@ typedef struct {
void *pDstTransformArg;
GDALTransformerFunc pDstTransformer;

// Memorize the value of the CHECK_WITH_INVERT_PROJ at the time we
// instanciated the object, to be able to decide if
// GDALRefreshGenImgProjTransformer() must do something or not.
bool bCheckWithInvertPROJ;

} GDALGenImgProjTransformInfo;

/************************************************************************/
/* GetCurrentCheckWithInvertPROJ() */
/************************************************************************/

static bool GetCurrentCheckWithInvertPROJ()
{
return CPLTestBool(CPLGetConfigOption( "CHECK_WITH_INVERT_PROJ", "NO" ));
}

/************************************************************************/
/* GDALCreateGenImgProjTransformerInternal() */
/************************************************************************/

static void *
GDALCreateSimilarGenImgProjTransformer( void *hTransformArg,
double dfRatioX, double dfRatioY );

static GDALGenImgProjTransformInfo* GDALCreateGenImgProjTransformerInternal()
{
/* -------------------------------------------------------------------- */
/* Initialize the transform info. */
/* -------------------------------------------------------------------- */
GDALGenImgProjTransformInfo* psInfo =
static_cast<GDALGenImgProjTransformInfo *>(
CPLCalloc(sizeof(GDALGenImgProjTransformInfo), 1));

memcpy( psInfo->sTI.abySignature,
GDAL_GTI2_SIGNATURE,
strlen(GDAL_GTI2_SIGNATURE) );
psInfo->sTI.pszClassName = "GDALGenImgProjTransformer";
psInfo->sTI.pfnTransform = GDALGenImgProjTransform;
psInfo->sTI.pfnCleanup = GDALDestroyGenImgProjTransformer;
psInfo->sTI.pfnSerialize = GDALSerializeGenImgProjTransformer;
psInfo->sTI.pfnCreateSimilar = GDALCreateSimilarGenImgProjTransformer;

psInfo->bCheckWithInvertPROJ = GetCurrentCheckWithInvertPROJ();

return psInfo;
}

/************************************************************************/
/* GDALCreateSimilarGenImgProjTransformer() */
/************************************************************************/
Expand All @@ -974,11 +1019,12 @@ GDALCreateSimilarGenImgProjTransformer( void *hTransformArg,
static_cast<GDALGenImgProjTransformInfo *>(hTransformArg);

GDALGenImgProjTransformInfo *psClonedInfo =
static_cast<GDALGenImgProjTransformInfo *>(
CPLMalloc(sizeof(GDALGenImgProjTransformInfo)));
GDALCreateGenImgProjTransformerInternal();

memcpy(psClonedInfo, psInfo, sizeof(GDALGenImgProjTransformInfo));

psClonedInfo->bCheckWithInvertPROJ = GetCurrentCheckWithInvertPROJ();

if( psClonedInfo->pSrcTransformArg )
psClonedInfo->pSrcTransformArg =
GDALCreateSimilarTransformer( psInfo->pSrcTransformArg,
Expand Down Expand Up @@ -1156,31 +1202,6 @@ static void InsertCenterLong( GDALDatasetH hDS, OGRSpatialReference* poSRS,
CPLSPrintf("%g", dfCenterLong));
}

/************************************************************************/
/* GDALCreateGenImgProjTransformerInternal() */
/************************************************************************/

static GDALGenImgProjTransformInfo* GDALCreateGenImgProjTransformerInternal()
{
/* -------------------------------------------------------------------- */
/* Initialize the transform info. */
/* -------------------------------------------------------------------- */
GDALGenImgProjTransformInfo* psInfo =
static_cast<GDALGenImgProjTransformInfo *>(
CPLCalloc(sizeof(GDALGenImgProjTransformInfo), 1));

memcpy( psInfo->sTI.abySignature,
GDAL_GTI2_SIGNATURE,
strlen(GDAL_GTI2_SIGNATURE) );
psInfo->sTI.pszClassName = "GDALGenImgProjTransformer";
psInfo->sTI.pfnTransform = GDALGenImgProjTransform;
psInfo->sTI.pfnCleanup = GDALDestroyGenImgProjTransformer;
psInfo->sTI.pfnSerialize = GDALSerializeGenImgProjTransformer;
psInfo->sTI.pfnCreateSimilar = GDALCreateSimilarGenImgProjTransformer;

return psInfo;
}

/************************************************************************/
/* GDALComputeAreaOfInterest() */
/************************************************************************/
Expand Down Expand Up @@ -2014,7 +2035,8 @@ void GDALRefreshGenImgProjTransformer( void* hTransformArg )
GDALGenImgProjTransformInfo *psInfo =
static_cast<GDALGenImgProjTransformInfo *>( hTransformArg );

if( psInfo->pReprojectArg )
if( psInfo->pReprojectArg &&
psInfo->bCheckWithInvertPROJ != GetCurrentCheckWithInvertPROJ() )
{
CPLXMLNode* psXML =
GDALSerializeTransformer(psInfo->pReproject,
Expand Down

0 comments on commit 9438b89

Please sign in to comment.