Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug in font charset detection causing memory leak #4778

Closed
vakhoir opened this issue Jan 28, 2020 · 6 comments · Fixed by #4779
Closed

Bug in font charset detection causing memory leak #4778

vakhoir opened this issue Jan 28, 2020 · 6 comments · Fixed by #4779

Comments

@vakhoir
Copy link
Contributor

vakhoir commented Jan 28, 2020

Detected while testing #4695

Observed behaviour

Certain unicode characters are not displayed properly with some of the fonts, even when the font contains the character. This leads to constant re-baking of the font, and a huge (~100MB/s) memory leak.

Expected behaviour

Characters that are in a font are rendered correctly. If they aren't handled by the font, a fallback is used or an error is thrown. In either case, there should be no memory leaks.

Steps to reproduce

  1. Set language to German

  2. Start new game

  3. Open the Equipment Market (or any view that displays a formatted money amount > $1 000). The formatted amount of money displayed should contain a '?' like in the following screenshot:

FontBug

Causes

This is one of those bugs where a number of things has to happen at the same time for it to come up. First of all in the format_money function, if the locale has a white space set as the thousand-separator, we overwrite that with a unicode fixed space:

pioneer/src/utils.cpp

Lines 43 to 45 in 99a2e0b

std::string groupSep = std::string(Lang::NUMBER_GROUP_SEP) == " " ?
"\u00a0" :
Lang::NUMBER_GROUP_SEP; // space should be fixed space

That's why it's necessary to switch to German, or another language that use a white space as the thousand-separator, in order to reproduce the bug.

When we try to render the character ImGui's FindGlyph function says it's not there, so a fallback character is displayed instead, and the fixed space is "reported missing", therefore PiGui tries to add it explicitly to the font, and rebake it. The twist is that PiGui says PionilliumText22L-Medium.ttf contains the \u00a0 fixed space, so it wants to keep using that font:

pioneer/src/PiGui.cpp

Lines 139 to 146 in 99a2e0b

PiFont &pifont = pifont_iter->second;
for (PiFace &face : pifont.faces()) {
if (face.containsGlyph(glyph)) {
face.addGlyph(glyph);
m_should_bake_fonts = true;
return;
}
}

But when ImGui calls stbtt_FindGlyphIndex it can't find it, 0 is returned and the whole thing starts over in the next frame

while (entrySelector) {
stbtt_uint16 end;
searchRange >>= 1;
end = ttUSHORT(data + search + searchRange*2);
if (unicode_codepoint > end)
search += searchRange*2;
--entrySelector;
}
search += 2;
{
stbtt_uint16 offset, start;
stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1);
STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item));
start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);
if (unicode_codepoint < start)
return 0;

So is it a Pioneer bug or an ImGui bug? A quick test seems to indicate that the "fixed space" character is indeed defined in the Pionillium font:

$ hb-shape PionilliumText22L-Medium.ttf `echo -ne "\u00a0"`
[space=0+235]

So it seems the problem is on ImGui side, but at the moment I can't make heads or tails out of what's going on in stbtt_FindGlyphIndex. Maybe someone else knows off the top of their head, if not I'll resume work on this later.

P.S.

I'm pretty sure the bug is in font-parsing now. When I was debugging this I originally misunderstood the meaning of the containsGlyph function here:

pioneer/src/PiGui.cpp

Lines 139 to 146 in 99a2e0b

PiFont &pifont = pifont_iter->second;
for (PiFace &face : pifont.faces()) {
if (face.containsGlyph(glyph)) {
face.addGlyph(glyph);
m_should_bake_fonts = true;
return;
}
}

So I thought "Wait, why are we adding a glyph when the font already contains it? Shouldn't it be the other way around?" and added a negation. It actually helped! Kind of. The character ranges on Pigui-side are hardcoded (we should probably have to (see below) change that somehow, as well as the name of the containsGlyph function and m_ranges variable), so the alternative fallback fonts like DejaVuSans.ttf jumped into the AddGlyph block. On ImGui side the fixed space was also detected and displayed correctly, that's valid because that font also contains the character:

$ hb-shape DejaVuSansMono.ttf `echo -ne "\u00a0"`
[nonbreakingspace=0+1233]
$ hb-shape DejaVuSans.ttf `echo -ne "\u00a0"`
[nonbreakingspace=0+651]

Although it looks like it's defined differently, maybe that has something to do with it? Can't say I know much about the ttf format.

P.P.S

After thinking about it more, I guess the bug is also on the Pioneer side.

pioneer/src/PiGui.cpp

Lines 745 to 748 in 99a2e0b

PiFont uiheading("orbiteer", {
PiFace("DejaVuSans.ttf", /*18.0/20.0*/ 1.2, { { 0x400, 0x4ff }, { 0x500, 0x527 } }), PiFace("wqy-microhei.ttc", 1.0, { { 0x4e00, 0x9fff }, { 0x3400, 0x4dff } }), PiFace("Orbiteer-Bold.ttf", 1.0, { { 0, 0xffff } }) // imgui only supports 0xffff, not 0x10ffff
});
PiFont guifont("pionillium", { PiFace("DejaVuSans.ttf", 13.0 / 14.0, { { 0x400, 0x4ff }, { 0x500, 0x527 } }), PiFace("wqy-microhei.ttc", 1.0, { { 0x4e00, 0x9fff }, { 0x3400, 0x4dff } }), PiFace("PionilliumText22L-Medium.ttf", 1.0, { { 0, 0xffff } }) });

This is the bit I mentioned, where the charsets are hardcoded, the last argument in each PiFace constructor is the range of valid characters the font is supposed to support, and Orbiteer and Pionillium have it set to from 0x0000 to 0xffff. Even if the fonts contained every single unicode character, this would still be wrong to have the range hardcoded. But since they don't have every character, this means we're treating that range as a preference - "ImGui, try to use this font to handle these characters, if you can, please". In that case we need to also handle the case when ImGui tells us it cannot handle that character with that font.

Conclusions

  • We need to remove the hardcoding of m_ranges in PiFace. Either try to read the valid character ranges from the file directly, or to save the glyphs we already tried loading with ImGui in a variable, and use it to return false in containsGlyph the next time the same glyph comes up.

  • Should we drop that whitespace / unicode fixed space replacement in format_money? We seem to be able to render whitespaces just fine.

  • (Optional) figure out why ImGui can't read the fixed space character for Pionillium

  • (Optional) Rename m_ranges to something like m_valid_ranges and containsGlyph to canHandleGlyph, or describe what they do in comments. It's hard to figure out what these are actually for at first glance.

@Bodasey
Copy link

Bodasey commented Jan 31, 2020

Just notice that the leak starts when you keep open the language select menu for a while yet, and this whatever your actual/new chosen language is.

Also, the ship market tab is not affected (does not use decimal separator, but space as thousand separator is displayed correctly)

@Bodasey
Copy link

Bodasey commented Jan 31, 2020

FIX FAILED?

Complete Console log of self-compiled program execution:
(lua did not return messages also appear on version 20191117)

bodasey@linux-mnav:~/pioneer-master> ./pioneer
[  8%] Built target lua
[ 92%] Built target pioneerLib
[ 93%] Built target lz4
[ 93%] Built target glew
[ 94%] Built target imgui
[ 95%] Built target jenkins
[ 95%] Built target picodds
[ 96%] Built target profiler
[ 97%] Built target pioneer
[ 97%] Built target modelcompiler
[100%] Built target savegamedump
ver 20200131 on: Linux

System Name: Linux
Host Name: linux-mnav
Release(Kernel) Version: 4.12.14-lp151.28.36-default
Kernel Build Timestamp: #1 SMP Fri Dec 6 13:50:27 UTC 2019 (8f4a495)
Machine Arch: x86_64
Domain Name: (none)



--------------------
SDL Version (build) 2.0.10
SDL Version (dynamic) 2.0.10
SDL Versions match
SDL_image Version (build): 2.0.5
SDL_image Version (dynamic): 2.0.5
SDL_image Versions match
Assimp Version: 4.1.0
FreeType Version: 2.9.0
GLEW dynamic version: 2.0.0
--------------------

Initialized OpenGL 3.1, with extensions, renderer
Initializing joystick subsystem.
started 1 worker threads
ShipType::Init()
Lua::Init()
font orbiteer:
- DejaVuSans.ttf 1.200000
- wqy-microhei.ttc 1.000000
- Orbiteer-Bold.ttf 1.000000
font pionillium:
- DejaVuSans.ttf 0.928571
- wqy-microhei.ttc 1.000000
- PionilliumText22L-Medium.ttf 1.000000
import [libs/autoload.lua]: libs/autoload.lua did not return anything
import [ui/GalacticView.lua]: ui/GalacticView.lua did not return anything
nanosvg: /home/romaschw/pioneer-master/data/icons/icons.svg 1024x1024
import [ui/InfoView.lua]: ui/InfoView.lua did not return anything
import [ui/StationView.lua]: ui/StationView.lua did not return anything
import [pigui/modules/flight-ui/hyperspace.lua]: pigui/modules/flight-ui/hyperspace.lua did not return anything
import [pigui/modules/flight-ui/indicators.lua]: pigui/modules/flight-ui/indicators.lua did not return anything
import [pigui/modules/flight-ui/reticule.lua]: pigui/modules/flight-ui/reticule.lua did not return anything
import [pigui/modules/flight-ui/target-scanner.lua]: pigui/modules/flight-ui/target-scanner.lua did not return anything
import [pigui/modules/info-view/01-ship-info.lua]: pigui/modules/info-view/01-ship-info.lua did not return anything
import [pigui/modules/info-view/02-personal-info.lua]: pigui/modules/info-view/02-personal-info.lua did not return anything
import [pigui/modules/info-view/03-econ-trade.lua]: pigui/modules/info-view/03-econ-trade.lua did not return anything
import [pigui/modules/info-view/04-missions.lua]: pigui/modules/info-view/04-missions.lua did not return anything
import [pigui/modules/info-view/05-crew.lua]: pigui/modules/info-view/05-crew.lua did not return anything
WARNING: texture 'icons/goods/Hydrogen.png' is not power-of-two and may not display correctly
import [pigui/modules/station-view/01-lobby.lua]: pigui/modules/station-view/01-lobby.lua did not return anything
import [pigui/modules/station-view/02-bulletinBoard.lua]: pigui/modules/station-view/02-bulletinBoard.lua did not return anything
import [pigui/modules/station-view/03-commodityMarket.lua]: pigui/modules/station-view/03-commodityMarket.lua did not return anything
import [pigui/modules/station-view/04-shipMarket.lua]: pigui/modules/station-view/04-shipMarket.lua did not return anything
import [pigui/modules/station-view/05-equipmentMarket.lua]: pigui/modules/station-view/05-equipmentMarket.lua did not return anything
import [pigui/modules/station-view/06-shipRepairs.lua]: pigui/modules/station-view/06-shipRepairs.lua did not return anything
import [pigui/modules/station-view/07-police.lua]: pigui/modules/station-view/07-police.lua did not return anything
nanosvg: /home/romaschw/pioneer-master/data/icons/logo.svg 512x512
import [pigui/views/init.lua]: pigui/views/init.lua did not return anything
import [pigui/views/mainmenu.lua]: pigui/views/mainmenu.lua did not return anything
import [modules/AIWarning/AIWarning.lua]: modules/AIWarning/AIWarning.lua did not return anything
import [modules/Advice/Advice.lua]: modules/Advice/Advice.lua did not return anything
import [modules/Assassination/Assassination.lua]: modules/Assassination/Assassination.lua did not return anything
import [modules/AutoSave/AutoSave.lua]: modules/AutoSave/AutoSave.lua did not return anything
import [modules/BreakdownServicing/BreakdownServicing.lua]: modules/BreakdownServicing/BreakdownServicing.lua did not return anything
import [modules/BulkShips.lua]: modules/BulkShips.lua did not return anything
import [modules/CargoRun/CargoRun.lua]: modules/CargoRun/CargoRun.lua did not return anything
import [modules/Combat/Combat.lua]: modules/Combat/Combat.lua did not return anything
import [modules/CrewContracts/CrewContracts.lua]: modules/CrewContracts/CrewContracts.lua did not return anything
import [modules/CrimeTracking/CrimeTracking.lua]: modules/CrimeTracking/CrimeTracking.lua did not return anything
Ship Def found: kanara_civ
Ship Def found: missile_smart
Ship Def found: pumpkinseed
Ship Def found: lunarshuttle
Ship Def found: bowfin
Ship Def found: amphiesma
Ship Def found: nerodia
Ship Def found: venturestar
Ship Def found: molamola
Ship Def found: wave
Ship Def found: missile_unguided
Ship Def found: xylophis
Ship Def found: pumpkinseed_police
Ship Def found: dsminer
Ship Def found: kanara
Ship Def found: vatakara
Ship Def found: varada
Ship Def found: ac33
Ship Def found: storeria
Ship Def found: sinonatrix_police
Ship Def found: malabar
Ship Def found: sinonatrix
Ship Def found: missile_guided
Ship Def found: natrix
Ship Def found: missile_naval
Ship Def found: bluenose
Ship Def found: molaramsayi
Ship Def found: lodos
Ship Def found: deneb
29
import [modules/DebugShipSpawn/DebugShipSpawn.lua]: modules/DebugShipSpawn/DebugShipSpawn.lua did not return anything
import [modules/DeliverPackage/DeliverPackage.lua]: modules/DeliverPackage/DeliverPackage.lua did not return anything
import [modules/DonateToCranks/DonateToCranks.lua]: modules/DonateToCranks/DonateToCranks.lua did not return anything
import [modules/EasterEgg/Message.lua]: modules/EasterEgg/Message.lua did not return anything
import [modules/FuelClub/FuelClub.lua]: modules/FuelClub/FuelClub.lua did not return anything
import [modules/GoodsTrader/GoodsTrader.lua]: modules/GoodsTrader/GoodsTrader.lua did not return anything
import [modules/Mining.lua]: modules/Mining.lua did not return anything
import [modules/MusicPlayer.lua]: modules/MusicPlayer.lua did not return anything
import [modules/NewsEventCommodity/NewsEventCommodity.lua]: modules/NewsEventCommodity/NewsEventCommodity.lua did not return anything
import [modules/Pirates.lua]: modules/Pirates.lua did not return anything
import [modules/PolicePatrol/PolicePatrol.lua]: modules/PolicePatrol/PolicePatrol.lua did not return anything
import [modules/SearchRescue/SearchRescue.lua]: modules/SearchRescue/SearchRescue.lua did not return anything
import [modules/SecondHand/SecondHand.lua]: modules/SecondHand/SecondHand.lua did not return anything
import [modules/StationRefuelling/StationRefuelling.lua]: modules/StationRefuelling/StationRefuelling.lua did not return anything
import [modules/StatsTracking/StatsTracking.lua]: modules/StatsTracking/StatsTracking.lua did not return anything
import [modules/System/Explore.lua]: modules/System/Explore.lua did not return anything
import [modules/System/OutOfFuel.lua]: modules/System/OutOfFuel.lua did not return anything
import [modules/Taxi/Taxi.lua]: modules/Taxi/Taxi.lua did not return anything
import [modules/TradeShips.lua]: modules/TradeShips.lua did not return anything
GalaxyGenerator::Init()
Creating new galaxy generator 'legacy' version 1
Warning: 'mass' is 0.000000 for body 'Themisto'
Warning: 'mass' is 0.000000 for body 'Lucksmall'
Number of factions added: 103
StarSystemCache: misses: 0, slave hits: 0, master hits: 0
SectorCache: misses: 101, slave hits: 0, master hits: 2
FaceParts::Init()
Face Generation source images loaded.
new ModelCache
Shields::Init
BaseSphere::Init
GenerateIndices: triangles count = 648, mid indexes = 1728, hi edges = 54
CityOnPlanet::Init
decompressed model file Dome1.sgm (151.98 KB) -> 354.15 KB
decompressed model file Dome2.sgm (72.57 KB) -> 166.11 KB
decompressed model file Library.sgm (218.91 KB) -> 461.80 KB
decompressed model file Mall.sgm (170.04 KB) -> 409.88 KB
decompressed model file Tower1.sgm (140.63 KB) -> 349.18 KB
decompressed model file Tower2.sgm (84.37 KB) -> 183.86 KB
decompressed model file kbuilding01.sgm (27.70 KB) -> 86.38 KB
decompressed model file kbuilding02.sgm (49.97 KB) -> 171.00 KB
decompressed model file kbuilding03.sgm (66.16 KB) -> 214.84 KB
decompressed model file newbuilding1.sgm (51.75 KB) -> 123.32 KB
decompressed model file newbuilding10.sgm (80.18 KB) -> 184.71 KB
decompressed model file newbuilding11.sgm (30.34 KB) -> 76.66 KB
decompressed model file newbuilding2.sgm (42.63 KB) -> 92.07 KB
decompressed model file newbuilding3.sgm (47.11 KB) -> 110.95 KB
decompressed model file newbuilding4.sgm (70.17 KB) -> 159.83 KB
decompressed model file newbuilding5.sgm (49.23 KB) -> 114.50 KB
decompressed model file newbuilding6.sgm (44.14 KB) -> 101.05 KB
decompressed model file newbuilding7.sgm (48.66 KB) -> 109.56 KB
decompressed model file newbuilding8.sgm (48.31 KB) -> 107.77 KB
decompressed model file newbuilding9.sgm (27.44 KB) -> 76.75 KB
Got 20 buildings of tag city_building
 - Dome1: 39.626175
 - Dome2: 48.596382
 - Library: 64.693522
 - Mall: 26.159388
 - Tower1: 33.094160
 - Tower2: 34.924003
 - kbuilding01: 29.664692
 - kbuilding02: 46.268344
 - kbuilding03: 41.542333
 - newbuilding1: 36.202756
 - newbuilding10: 16.297418
 - newbuilding11: 34.961034
 - newbuilding2: 22.822782
 - newbuilding3: 22.649894
 - newbuilding4: 25.978193
 - newbuilding5: 22.908506
 - newbuilding6: 29.817877
 - newbuilding7: 22.674426
 - newbuilding8: 23.154979
 - newbuilding9: 36.528138
End of buildings.
SpaceStation::Init
decompressed model file ground_station.sgm (2302.86 KB) -> 5648.29 KB
ground_station has:
 14 entrances,
 14 pads,
 0 exits
decompressed model file new_ground.sgm (2462.98 KB) -> 6064.31 KB
new_ground has:
 6 entrances,
 6 pads,
 0 exits
decompressed model file orbital_station_2-10k.sgm (10955.50 KB) -> 23713.89 KB
orbital_station_2-10k has:
 5 entrances,
 64 pads,
 5 exits
decompressed model file orbital_station_2-2k.sgm (5881.25 KB) -> 12619.41 KB
orbital_station_2-2k has:
 4 entrances,
 18 pads,
 4 exits
decompressed model file orbital_station_2-5k.sgm (10627.48 KB) -> 22965.61 KB
orbital_station_2-5k has:
 5 entrances,
 64 pads,
 5 exits
decompressed model file orbital_station_2-5k10k.sgm (11414.50 KB) -> 24666.79 KB
orbital_station_2-5k10k has:
 5 entrances,
 64 pads,
 5 exits
NavLights::Init
Sfx::Init
Sound::Init


Loading took: 25043.047442 milliseconds
Stars picked from galaxy: 0
Final stars number: 500000
Stars picked from galaxy: 0
Final stars number: 500000
decompressed model file ac33.sgm (649.16 KB) -> 1196.80 KB
decompressed model file amphiesma.sgm (203.52 KB) -> 535.87 KB
decompressed model file bluenose.sgm (988.22 KB) -> 2001.10 KB
decompressed model file bowfin.sgm (687.00 KB) -> 1297.14 KB
decompressed model file deneb.sgm (509.23 KB) -> 978.45 KB
decompressed model file dsminer.sgm (849.14 KB) -> 1717.14 KB
decompressed model file kanara_civ.sgm (495.30 KB) -> 901.43 KB
decompressed model file lodos.sgm (409.04 KB) -> 750.58 KB
decompressed model file lunarshuttle.sgm (303.21 KB) -> 825.83 KB
decompressed model file malabar.sgm (903.44 KB) -> 1785.79 KB
decompressed model file molamola.sgm (638.42 KB) -> 1146.34 KB
decompressed model file molaramsayi.sgm (735.96 KB) -> 1453.92 KB
decompressed model file natrix.sgm (76.87 KB) -> 193.34 KB
decompressed model file nerodia.sgm (258.73 KB) -> 527.23 KB
decompressed model file pumpkinseed.sgm (801.62 KB) -> 1541.73 KB
decompressed model file sinonatrix.sgm (96.52 KB) -> 220.04 KB
decompressed model file storeria.sgm (322.28 KB) -> 658.97 KB
decompressed model file varada.sgm (354.84 KB) -> 676.39 KB
decompressed model file vatakara.sgm (843.64 KB) -> 1688.42 KB
decompressed model file venturestar.sgm (584.70 KB) -> 1083.24 KB
decompressed model file wave.sgm (386.94 KB) -> 717.74 KB
decompressed model file xylophis.sgm (125.83 KB) -> 275.90 KB
Game::LoadGame('ger-Barnard')
savefile version: 86
Creating new galaxy generator 'legacy' version 1
Clearing and re-using previous Galaxy object
StarSystemCache: misses: 0, slave hits: 0, master hits: 0
SectorCache: misses: 101, slave hits: 0, master hits: 1
Stars picked from galaxy: 0
Final stars number: 500000
Stars picked from galaxy: 0
Final stars number: 500000
Barnard's Star:
    height fractal: Ellipsoid
    colour fractal: StarG
    seed: 289261998
Formations:
    height fractal: Barren Rock
    colour fractal: Rock
    seed: 42
Ignorance:
    height fractal: MountainsCraters
    colour fractal: Ice
    seed: 42312
Consciousness:
    height fractal: MountainsCraters2
    colour fractal: Rock
    seed: 1913859659
Death:
    height fractal: RuggedDesert
    colour fractal: Ice
    seed: 2972902831
Name and Form:
    height fractal: Asteroid
    colour fractal: Asteroid
    seed: 4285154954
Six sense spheres:
    height fractal: Asteroid4
    colour fractal: Asteroid
    seed: 4278653315
Sensation:
    height fractal: Asteroid4
    colour fractal: BandedRock
    seed: 4284986054
Longings:
    height fractal: Asteroid3
    colour fractal: Rock
    seed: 3148470292
Clinging:
    height fractal: Asteroid4
    colour fractal: BandedRock
    seed: 515932
Emotion:
    height fractal: Asteroid4
    colour fractal: BandedRock
    seed: 2153883034
Birth:
    height fractal: MountainsCraters2
    colour fractal: Rock
    seed: 22312521
Stars picked from galaxy: 16644
Final stars number: 500000
Stars picked from galaxy: 16644
Final stars number: 500000
Color Fractal name: GGNeptune
KO-6162 enters frame Clinging
molamola jump status is not OK
StarSystemCache: misses: 210, slave hits: 0, master hits: 4944
SectorCache: misses: 26185, slave hits: 0, master hits: 13806
Stars picked from galaxy: 0
Final stars number: 500000
Stars picked from galaxy: 0
Final stars number: 500000
StarSystemCache: misses: 0, slave hits: 0, master hits: 0
SectorCache: misses: 0, slave hits: 0, master hits: 0
romaschw@linux-mnav:~/pioneer-master> 

MADE EVEN WORSE?

As mentioned above, this has been displayed correctly in Version 20191117, now there are also question marks and data are written to the swap partition:

shipmarket_20200131

@Web-eWorks
Copy link
Member

@Bodasey please remember to use the <details> tag and code formatting via wrapping your log in three backticks (```) to keep this issue from becoming unmanageable.

@impaktor
Copy link
Member

@Web-eWorks I took the liberty to edit his post.

@vakhoir
Copy link
Contributor Author

vakhoir commented Jan 31, 2020

linux-mnav:~/pioneer-master> ./pioneer

Does this mean you're on the master branch? The fix hasn't been merged yet, and is only available on my fork: https://github.com/vakhoir/pioneer/tree/bugfix/font_bake_memory_leak

It should fix both the question marks and the memory leak (although a backup font is likely to be used, since ImGui doesn't detect a character that should be handled by the font).

MADE EVEN WORSE?

As mentioned above, this has been displayed correctly in Version 20191117, now there are also question marks and data are written to the swap partition:

Yeah, this is a PiGui bug. The version you had previously didn't have the ship market ported to PiGui yet, so that view was still fine.

@Bodasey
Copy link

Bodasey commented Jan 31, 2020

FIX CONFIRMED for vakhoir's version and German language

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants