| 2339 | |
| 2340 | template <class T> |
| 2341 | static 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 |
no test coverage detected