This does not actually add SDL3 support but adds enough
CMake stuff to make the following succeed:
```bash
cmake -S. -Bbuild-sdl3 -DUSE_SDL3=ON -DDEVILUTIONX_SYSTEM_SDL3=OFF -DDEVILUTIONX_STATIC_SDL3=ON -DNOSOUND=ON
```
`NOSOUND` is needed because `SDL_audiolib` does not support SDL3.
Previously, an override font had to contain all the 256 glyphs in the
row that it was overriding. Experiments have shown that this would
cause huge file increase in CJK scripts (+200MiB or so).
Instead, allows the override font to only override some glyphs in a row.
For all glyphs (sprites) that have width 0, we now fall back to
the base font.
When rendering directly to output surface, PalSurface may need to be
updated after a flip. This is not actually needed on DOS but may be
needed on other platforms in the future.
I tried the interrupt handler approach but couldn't get it to work,
so for now we're back to loading and updating the progress bar
synchronously on DOS.
Now that the DOS SDL supports CMake, this is a much better option that
`configure`, because it lets us easily test out local changes to SDL,
e.g.:
```bash
cmake -S. -Bbuild-dos -DCMAKE_TOOLCHAIN_FILE=CMake/platforms/djcpp.toolchain.cmake \
-DTARGET_PLATFORM="dos" -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF \
-DFETCHCONTENT_SOURCE_DIR_SDL2="${HOME}/diasurgical-SDL"
```
When compiling with clang, the compiler warns about the lack of return
statement in the non-void function fmt::format.
This fixes it by returning a default error string.
Texts adapted to fit well in different menu options where the space is limited.
Some changes are made to be consistent with the rest of the translation.
Tricks the compiler into skipping expensive
`uninit var analysis` (`-Wmaybe-uninitialized`) by using
a struct with state rather than separate variables for `best` /
`bestDiff`.
This has no performance impact.
Also optimizes lookup a bit further and moves some code that
does not need to be inlined to the cpp file.
```
Benchmark Time CPU Time Old Time New CPU Old CPU New
-----------------------------------------------------------------------------------------------------------------------------------
BM_GenerateBlendedLookupTable_pvalue 0.0002 0.0002 U Test, Repetitions: 10 vs 10
BM_GenerateBlendedLookupTable_mean +0.0237 +0.0237 2092090 2141601 2091732 2141291
BM_GenerateBlendedLookupTable_median +0.0237 +0.0237 2092104 2141662 2091669 2141319
BM_GenerateBlendedLookupTable_stddev -0.6414 -0.5834 664 238 538 224
BM_GenerateBlendedLookupTable_cv -0.6497 -0.5930 0 0 0 0
BM_BuildTree_pvalue 0.0002 0.0002 U Test, Repetitions: 10 vs 10
BM_BuildTree_mean +0.0410 +0.0410 4495 4679 4494 4678
BM_BuildTree_median +0.0403 +0.0402 4494 4675 4493 4674
BM_BuildTree_stddev +0.9515 +0.9359 7 14 7 14
BM_BuildTree_cv +0.8746 +0.8596 0 0 0 0
BM_FindNearestNeighbor_pvalue 0.0002 0.0002 U Test, Repetitions: 10 vs 10
BM_FindNearestNeighbor_mean -0.0399 -0.0398 1964257108 1885966812 1963954917 1885694336
BM_FindNearestNeighbor_median -0.0397 -0.0396 1963969748 1886074435 1963650984 1885803182
BM_FindNearestNeighbor_stddev -0.3380 -0.3443 1217360 805946 1225442 803469
BM_FindNearestNeighbor_cv -0.3105 -0.3171 0 0 0 0
OVERALL_GEOMEAN +0.0077 +0.0077 0 0 0 0
```