Skip to content
Open
38 changes: 18 additions & 20 deletions megameklab/src/megameklab/printing/InventoryWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public class InventoryWriter {
/**
* The minimum font size to use when scaling inventory text to fit into available space
*/
private static final float MIN_FONT_SIZE = 4.5f;
static final float MIN_FONT_SIZE = 4.5f;
private static final float QUIRKS_FONT_SCALING = 0.9f;
private static final float FOOTER_TEXT_WIDTH_RATIO = 0.95f;

Expand Down Expand Up @@ -440,12 +440,11 @@ private void parseBays() {
standardWeapons.add(m);
}
}
List<AmmoMounted> ammoMountedList = sheet.getEntity().getAmmo();
List<WeaponBayText> list = computeWeaponBayTexts(capitalWeapons, ammoMountedList);
List<WeaponBayText> list = computeWeaponBayTexts(capitalWeapons);
for (WeaponBayText text : list) {
capitalBays.add(new WeaponBayInventoryEntry((Aero) sheet.getEntity(), ++weaponBayIndex, text, true));
}
list = computeWeaponBayTexts(standardWeapons, ammoMountedList);
list = computeWeaponBayTexts(standardWeapons);
boolean artemisIV = false;
boolean artemisV = false;
boolean apollo = false;
Expand Down Expand Up @@ -476,16 +475,15 @@ private void parseBays() {
*
* @return A list of bays condensed by weapon type and symmetric location
*/
private List<WeaponBayText> computeWeaponBayTexts(List<WeaponMounted> weapons, List<AmmoMounted> ammoMountedList) {
static List<WeaponBayText> computeWeaponBayTexts(List<WeaponMounted> weapons) {
List<WeaponBayText> weaponBayTexts = new ArrayList<>();
// Collection info on weapons to print
for (WeaponMounted bay : weapons) {
WeaponBayText wbt = new WeaponBayText(bay.getLocation(), bay.isRearMounted());
for (WeaponMounted weaponMounted : bay.getBayWeapons()) {
if (!wbt.addBayWeapon(weaponMounted)) {continue;}
for (AmmoMounted ammo : ammoMountedList) {
if (ammo.getLocation() == weaponMounted.getLocation()
&& weaponMounted.getType().getAmmoType() == ammo.getType().getAmmoType()) {
for (AmmoMounted ammo : bay.getBayAmmo()) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a way for us to avoid nesting a loop within a loop within a loop?

if (AmmoType.isAmmoValid(ammo.getType(), weaponMounted.getType())) {
wbt.addBayAmmo(weaponMounted.getType(), ammo);
}
}
Expand Down Expand Up @@ -661,7 +659,7 @@ private boolean hasFooterContent() {
static private final float INITIAL_LINE_SPACING = 1.2f; // the initial line spacing factor
static private final float LINE_SPACING_REDUCTION_STEP = 0.01f; // tiny spacing steps avoid visual jumps
static private final float FONT_SIZE_REDUCTION_STEP = 0.05f; // small steps keep font changes visually smooth
static private final float MIN_LINE_HEIGHT_TO_FONT_SIZE = 0.93f;
static final float MIN_LINE_HEIGHT_TO_FONT_SIZE = 0.93f;
static private final float MAX_LINE_HEIGHT_TO_FONT_SIZE = 1.35f;

/**
Expand All @@ -679,10 +677,16 @@ public float[] scaleText(double height, Function<Float, Integer> calcLines) {

private float[] scaleText(double height, Function<Float, Integer> calcLines,
Function<Float, Double> calcLinePadding) {
return scaleText(height, calcLines, calcLinePadding, sheet::getFontHeight);
}

/** Also used to plan continuation pages before a sheet's SVG drawing context exists. */
static float[] scaleText(double height, Function<Float, Integer> calcLines,
Function<Float, Double> calcLinePadding, Function<Float, Float> fontHeights) {
float fontSize = FONT_SIZE_MEDIUM;
while (true) {
double lineCount = scaledLineCount(fontSize, calcLines, calcLinePadding);
float fontHeight = sheet.getFontHeight(fontSize);
double lineCount = calcLines.apply(fontSize) + calcLinePadding.apply(fontSize);
float fontHeight = fontHeights.apply(fontSize);
float minLineSpacing = minLineSpacing(fontSize, fontHeight);
float maxLineSpacing = maxLineSpacing(fontSize, fontHeight, minLineSpacing);

Expand All @@ -702,27 +706,21 @@ private float[] scaleText(double height, Function<Float, Integer> calcLines,
}
}

private boolean fits(double height, float fontHeight, double lineCount, float lineSpacing) {
private static boolean fits(double height, float fontHeight, double lineCount, float lineSpacing) {
return (lineCount <= 0) || (fontHeight * lineSpacing * lineCount <= height);
}

private float minLineSpacing(float fontSize, float fontHeight) {
private static float minLineSpacing(float fontSize, float fontHeight) {
// One font size needs at least about one font-size of baseline distance. Convert that real distance to a factor.
return fontSize * MIN_LINE_HEIGHT_TO_FONT_SIZE / fontHeight;
}

private float maxLineSpacing(float fontSize, float fontHeight, float minLineSpacing) {
private static float maxLineSpacing(float fontSize, float fontHeight, float minLineSpacing) {
// Small fonts should not get huge airy rows, so cap max spacing by the font's own size too.
float fontSizedMaxSpacing = (fontSize * MAX_LINE_HEIGHT_TO_FONT_SIZE) / fontHeight;
return Math.max(minLineSpacing, Math.min(INITIAL_LINE_SPACING, fontSizedMaxSpacing));
}

private double scaledLineCount(float fontSize, Function<Float, Integer> calcLines,
Function<Float, Double> calcLinePadding) {
// Most callers count whole rows. Inventory can also reserve half-row visual padding.
return calcLines.apply(fontSize) + calcLinePadding.apply(fontSize);
}

/**
* Displays ammo, fuel, features, and quirks as free-flowing text at the bottom of the inventory box
*
Expand Down
Loading
Loading