ResizeDecision calculateResizeDecision()

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;
}