void setFormatDimensions()

in torchvision/csrc/io/decoder/util.cpp [323:400]


void setFormatDimensions(
    size_t& destW,
    size_t& destH,
    size_t userW,
    size_t userH,
    size_t srcW,
    size_t srcH,
    size_t minDimension,
    size_t maxDimension,
    size_t cropImage) {
  // rounding rules
  // int -> double -> round up
  // if fraction is >= 0.5 or round down if fraction is < 0.5
  // int result = double(value) + 0.5
  // here we rounding double to int according to the above rule

  // #1, #6, #7 and #8
  if (userW == 0 && userH == 0) {
    if (minDimension > 0 && maxDimension == 0) { // #6
      if (srcW > srcH) {
        // landscape
        destH = minDimension;
        destW = round(double(srcW * minDimension) / srcH);
      } else {
        // portrait
        destW = minDimension;
        destH = round(double(srcH * minDimension) / srcW);
      }
    } else if (minDimension == 0 && maxDimension > 0) { // #7
      if (srcW > srcH) {
        // landscape
        destW = maxDimension;
        destH = round(double(srcH * maxDimension) / srcW);
      } else {
        // portrait
        destH = maxDimension;
        destW = round(double(srcW * maxDimension) / srcH);
      }
    } else if (minDimension > 0 && maxDimension > 0) { // #8
      if (srcW > srcH) {
        // landscape
        destW = maxDimension;
        destH = minDimension;
      } else {
        // portrait
        destW = minDimension;
        destH = maxDimension;
      }
    } else { // #1
      destW = srcW;
      destH = srcH;
    }
  } else if (userW != 0 && userH == 0) { // #2
    destW = userW;
    destH = round(double(srcH * userW) / srcW);
  } else if (userW == 0 && userH != 0) { // #3
    destW = round(double(srcW * userH) / srcH);
    destH = userH;
  } else { // userW != 0 && userH != 0
    if (cropImage == 0) { // #4
      destW = userW;
      destH = userH;
    } else { // #5
      double userSlope = double(userH) / userW;
      double srcSlope = double(srcH) / srcW;
      if (srcSlope < userSlope) {
        destW = round(double(srcW * userH) / srcH);
        destH = userH;
      } else {
        destW = userW;
        destH = round(double(srcH * userW) / srcW);
      }
    }
  }
  // prevent zeros
  destW = std::max(destW, size_t(1UL));
  destH = std::max(destH, size_t(1UL));
}