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