A maintainer-filed bug, a fix in Kotlin and Java, and a merge about four hours later.
Short answer
In GanttProject, a tall custom logo was drawn at full size in PDF exports, which made the timeline taller instead of scaling the logo down as the app window does. The fix caps the logo at the default logo height, computes a matching width, and has both the PDF and raster exporters draw the logo into that box. It was merged as PR #2824 for issue #2613.
The problem
GanttProject is an open-source desktop project scheduling app. Issue #2613, filed by a maintainer, described it: choose a logo taller than about 300 px, export to PDF, and "the logo is not scaled down. Instead, the timeline height grows."
The fix
ChartDimensions now derives the logo box from the source image:
val logoHeight: Int =
if (logoSourceWidth <= 0 || logoSourceHeight <= 0) 0
else min(logoSourceHeight, UIFacade.DEFAULT_LOGO.iconHeight)
val logoWidth: Int =
if (logoHeight == 0) 0
else (logoSourceWidth.toDouble() * logoHeight / logoSourceHeight).roundToInt()
Both export paths then draw the logo scaled into that box, and skip it when no logo is set:
if (logo != null && d.getLogoWidth() > 0 && d.getLogoHeight() > 0) {
g.drawImage(logo, 0, 0, d.getLogoWidth(), d.getLogoHeight(), null);
}
By the numbers
- Repository: bardsoftware/ganttproject, 1,117 stars (Nov 3, 2026), Java and Kotlin, GPL-3.0
- Files changed: 3
- Lines: +19 / -5
- Commits: 1
- Opened: Aug 21, 2026. Merged: Aug 21, 2026. Time to merge: 3 hours, 57 minutes
- Review: approved and merged by a maintainer, with a follow-up commit from the maintainer
How the review went
The maintainer approved and merged it the same day:
Thanks for contributing! I left a few non-blocking comments below, but I'm going ahead and merging this now.
They added that they would follow up with "a few quick tweaks upstream".
Their inline suggestion was to pass the logo image to the constructor instead of reading DEFAULT_LOGO directly, and to use constructor-local variables instead of private fields. They pushed a follow-up commit that night, titled "Follow-up for #2824 (logo is not scaled down)", which replaced the private fields with constructor-local values.
FAQ
Did the merged change add a unit test?
The PR description claimed one, but no test is present in the merged diff. The later maintainer follow-up and reopened issue remain part of the outcome.
Is the issue closed?
The issue was closed when the PR merged. The maintainer reopened it shortly afterwards and added a milestone, and it is open as of Nov 3, 2026.
Where can I read more?
See the pull request and the original issue.
The goal
A fix that is right in substance can still be merged quickly, even when a maintainer wants to adjust the style. This PR merged quickly, but the reopened issue means the merge should not be read as complete resolution.