in cpp/spectrum/core/ResizeUtil.cpp [256:299]
ResizeDecision calculateResizeDecision(
const image::Size& inputSize,
const folly::Optional<requirements::Resize>& resizeRequirement,
const std::vector<image::Ratio>& samplingRatios,
const folly::Optional<requirements::Crop>& cropRequirement,
const float thresholdForSkippingScaling) {
// quick return: if not allowed to resize, then return empty resize decision
if (!resizeRequirement.hasValue()) {
auto result = ResizeDecision(inputSize);
if (cropRequirement.hasValue()) {
result.cropping(cropRequirement, cropRequirement->apply(inputSize).size);
}
return result;
}
// Start with a variant that does not sample
ResizeDecision bestResizeDecision = calculateResizeDecisionWithSampling(
inputSize,
folly::none,
cropRequirement,
resizeRequirement,
thresholdForSkippingScaling);
// then try the provided sampling ratios (if any)
for (auto& ratio : samplingRatios) {
// don't allow upscaling
if (ratio.numerator > ratio.denominator) {
continue;
}
const auto candidateResizeDecision = calculateResizeDecisionWithSampling(
inputSize,
ratio,
cropRequirement,
resizeRequirement,
thresholdForSkippingScaling);
// smaller values indicate better solutions
if (candidateResizeDecision.getRating() < bestResizeDecision.getRating()) {
bestResizeDecision = candidateResizeDecision;
}
}
return bestResizeDecision;
}