applyBoxFit function
Implementation
FittedSizes applyBoxFit(BoxFit fit, PdfPoint inputSize, PdfPoint outputSize) {
if (inputSize.y <= 0.0 ||
inputSize.x <= 0.0 ||
outputSize.y <= 0.0 ||
outputSize.x <= 0.0) {
return const FittedSizes(PdfPoint.zero, PdfPoint.zero);
}
PdfPoint? sourceSize, destinationSize;
switch (fit) {
case BoxFit.fill:
sourceSize = inputSize;
destinationSize = outputSize;
break;
case BoxFit.contain:
sourceSize = inputSize;
if (outputSize.x / outputSize.y > sourceSize.x / sourceSize.y) {
destinationSize =
PdfPoint(sourceSize.x * outputSize.y / sourceSize.y, outputSize.y);
} else {
destinationSize =
PdfPoint(outputSize.x, sourceSize.y * outputSize.x / sourceSize.x);
}
break;
case BoxFit.cover:
if (outputSize.x / outputSize.y > inputSize.x / inputSize.y) {
sourceSize =
PdfPoint(inputSize.x, inputSize.x * outputSize.y / outputSize.x);
} else {
sourceSize =
PdfPoint(inputSize.y * outputSize.x / outputSize.y, inputSize.y);
}
destinationSize = outputSize;
break;
case BoxFit.fitWidth:
sourceSize =
PdfPoint(inputSize.x, inputSize.x * outputSize.y / outputSize.x);
destinationSize =
PdfPoint(outputSize.x, sourceSize.y * outputSize.x / sourceSize.x);
break;
case BoxFit.fitHeight:
sourceSize =
PdfPoint(inputSize.y * outputSize.x / outputSize.y, inputSize.y);
destinationSize =
PdfPoint(sourceSize.x * outputSize.y / sourceSize.y, outputSize.y);
break;
case BoxFit.none:
sourceSize = PdfPoint(math.min(inputSize.x, outputSize.x),
math.min(inputSize.y, outputSize.y));
destinationSize = sourceSize;
break;
case BoxFit.scaleDown:
sourceSize = inputSize;
destinationSize = inputSize;
final aspectRatio = inputSize.x / inputSize.y;
if (destinationSize.y > outputSize.y) {
destinationSize = PdfPoint(outputSize.y * aspectRatio, outputSize.y);
}
if (destinationSize.x > outputSize.x) {
destinationSize = PdfPoint(outputSize.x, outputSize.x / aspectRatio);
}
break;
}
return FittedSizes(sourceSize, destinationSize);
}