MCPcopy Create free account
hub / github.com/OSGeo/gdal / GDALResampleChunk_ModeT

Function GDALResampleChunk_ModeT

gcore/overview.cpp:2341–2612  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2339
2340template <class T>
2341static CPLErr GDALResampleChunk_ModeT(const GDALOverviewResampleArgs &args,
2342 const T *pChunk, T *const pDstBuffer)
2343
2344{
2345 const double dfXRatioDstToSrc = args.dfXRatioDstToSrc;
2346 const double dfYRatioDstToSrc = args.dfYRatioDstToSrc;
2347 const double dfSrcXDelta = args.dfSrcXDelta;
2348 const double dfSrcYDelta = args.dfSrcYDelta;
2349 const GByte *pabyChunkNodataMask = args.pabyChunkNodataMask;
2350 const int nChunkXOff = args.nChunkXOff;
2351 const int nChunkXSize = args.nChunkXSize;
2352 const int nChunkYOff = args.nChunkYOff;
2353 const int nChunkYSize = args.nChunkYSize;
2354 const int nDstXOff = args.nDstXOff;
2355 const int nDstXOff2 = args.nDstXOff2;
2356 const int nDstYOff = args.nDstYOff;
2357 const int nDstYOff2 = args.nDstYOff2;
2358 const bool bHasNoData = args.bHasNoData;
2359 const GDALColorTable *poColorTable = args.poColorTable;
2360 const int nDstXSize = nDstXOff2 - nDstXOff;
2361
2362 T tNoDataValue;
2363 if constexpr (std::is_same<T, ComplexFloat16>::value)
2364 {
2365 tNoDataValue.r = cpl::NumericLimits<GFloat16>::quiet_NaN();
2366 tNoDataValue.i = cpl::NumericLimits<GFloat16>::quiet_NaN();
2367 }
2368 else if constexpr (std::is_same<T, std::complex<float>>::value ||
2369 std::is_same<T, std::complex<double>>::value)
2370 {
2371 using BaseT = typename T::value_type;
2372 tNoDataValue =
2373 std::complex<BaseT>(std::numeric_limits<BaseT>::quiet_NaN(),
2374 std::numeric_limits<BaseT>::quiet_NaN());
2375 }
2376 else if (!bHasNoData || !GDALIsValueInRange<T>(args.dfNoDataValue))
2377 tNoDataValue = 0;
2378 else
2379 tNoDataValue = static_cast<T>(args.dfNoDataValue);
2380
2381 using CountType = uint32_t;
2382 CountType nMaxNumPx = 0;
2383 T *paVals = nullptr;
2384 CountType *panCounts = nullptr;
2385
2386 const int nChunkRightXOff = nChunkXOff + nChunkXSize;
2387 const int nChunkBottomYOff = nChunkYOff + nChunkYSize;
2388 std::vector<int> anVals(256, 0);
2389
2390 /* ==================================================================== */
2391 /* Loop over destination scanlines. */
2392 /* ==================================================================== */
2393 for (int iDstLine = nDstYOff; iDstLine < nDstYOff2; ++iDstLine)
2394 {
2395 const double dfSrcYOff = dfSrcYDelta + iDstLine * dfYRatioDstToSrc;
2396 int nSrcYOff = static_cast<int>(dfSrcYOff + 1e-8);
2397#ifdef only_pixels_with_more_than_10_pct_participation
2398 // When oversampling, don't take into account pixels that have a tiny

Callers 1

GDALResampleChunk_ModeFunction · 0.85

Calls 6

CPLErrorFunction · 0.85
GetColorEntryCountMethod · 0.80
maxFunction · 0.70
IsSameFunction · 0.70
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected