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