From b5a2a4e52d5251ad3875d76eac2fcad3c1977c69 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Mon, 17 Mar 2025 22:03:38 +0300 Subject: [PATCH 1/4] Render no-break space in books, don't consider narrow NBSP breaking --- apps/openmw/mwgui/bookpage.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwgui/bookpage.cpp b/apps/openmw/mwgui/bookpage.cpp index 1966442513..2984f035a4 100644 --- a/apps/openmw/mwgui/bookpage.cpp +++ b/apps/openmw/mwgui/bookpage.cpp @@ -1343,12 +1343,13 @@ namespace MWGui return codePoint == '\r'; } + // Normal no-break space (0x00A0) is ignored here + // because Morrowind compatibility requires us to render its glyph static bool ucsSpace(int codePoint) { switch (codePoint) { case 0x0020: // SPACE - case 0x00A0: // NO-BREAK SPACE case 0x1680: // OGHAM SPACE MARK case 0x180E: // MONGOLIAN VOWEL SEPARATOR case 0x2000: // EN QUAD @@ -1373,12 +1374,13 @@ namespace MWGui } } + // No-break spaces (0x00A0, 0x202F, 0xFEFF - normal, narrow, zero width) + // are ignored here for obvious reasons static bool ucsBreakingSpace(int codePoint) { switch (codePoint) { case 0x0020: // SPACE - // case 0x00A0: // NO-BREAK SPACE case 0x1680: // OGHAM SPACE MARK case 0x180E: // MONGOLIAN VOWEL SEPARATOR case 0x2000: // EN QUAD @@ -1393,10 +1395,8 @@ namespace MWGui case 0x2009: // THIN SPACE case 0x200A: // HAIR SPACE case 0x200B: // ZERO WIDTH SPACE - case 0x202F: // NARROW NO-BREAK SPACE case 0x205F: // MEDIUM MATHEMATICAL SPACE case 0x3000: // IDEOGRAPHIC SPACE - // case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE return true; default: return false; From 8d0dcb774f60321b881063be5c4fe8f5d6008eb1 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 18 Mar 2025 00:34:14 +0300 Subject: [PATCH 2/4] Add no-break space to MysticCards --- files/data/fonts/MysticCards.omwfont | 2 +- files/data/fonts/MysticCards.ttf | Bin 33108 -> 33140 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/files/data/fonts/MysticCards.omwfont b/files/data/fonts/MysticCards.omwfont index 3458614ddc..de4ffaff39 100644 --- a/files/data/fonts/MysticCards.omwfont +++ b/files/data/fonts/MysticCards.omwfont @@ -8,7 +8,7 @@ - + diff --git a/files/data/fonts/MysticCards.ttf b/files/data/fonts/MysticCards.ttf index 1b93f5aadc264fdc1f5c3f634d702e8f6a06ac85..c98597d74974209c923ce3f830a1ea8bcbc36672 100644 GIT binary patch delta 3481 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 M{z5BE9{>OGUjl2gtN;K2 delta 3482 zcma)9eN>cH8h@TUUyTnDJX2q5EXSJl;boa|}>N#B7fjO6tBBrNx`IG%ex`Bh$tGlE)0Dz^GFQNj3SGSh^9oF@$P>ts{?ow78! z?*wH<3^0Hk4$|lVGtEL^GPJ_0@CN(^_QBh55L?+GJIPMVQNBq27}sTg&p&Z~sT2}f{(nCHoxzjPR|`);9W=l*&;}deMc4!#&iI zZYe%P>nd0U>mdLFHee&J#b#WCP4F5aZ%UnUx60V61{$Fn)<8Y1g=Tmfn!pF^2x^6A z;W_v%oRw&$=#s`t+Fm!JlYc$rW8ZaEuu7@Ysb;DgRU1|BtAxS9GI#rVsV$IsIyVtA3+?tG-*` zt3RwC)Su9g=&$K-7~}?}fiuJy5)A2v97DdL%FtwJH*^}d8+r_VhQo$I!wJKP;hHhm zSZJ&j~mYzuNX%;;O^seTqGCIrEr;C9#_h(=32Rp+*Yoe>*Wq{r?^Ypw_L!K zYVu{7R+vgnt4*z@ji#-pZd0%6kZFK=FWsDD&No+?o6POzPV-LlwQxuH^zfAM%<#PM z%JAm!tCmztmSu&d($Z*YvvgQ?TJ~5DSdLkSET=4&EZAvTrGW{bDYwk@#b+WKsV>2Ekf9-)lTM6^V- zM|>Emi8MzZv~%`Id%QitzTLjd{)W9TibaJ)g+=M2(xV2VhN4x`dC_|v3P+x!+;PMi z<=o^Pb>56gidh%)p)14{=4x^cx{kYT?mYJ<_i+#Ngm@A>DW1dyo~@oP&&^nQY-VhG z?1i|Dxc0bz#odUHiEoR4FMhxq;6{1+v08ac6xUK`1eje?euS( zm4re4umk5{0e>oCH&*a%i3_oqA4*hXng3Fv39*t_JnSVPfu6;DjWq9;=Kp@UNR-bO z6`q}aj^?FvyslyhU}cyBW&zN3;TCSO`LYelGN`~LT#*b3k%T=gVR?Z3z?^qQr^$=7 z#f4FX%oDqu^sIt_pR;F_kx=HpnmkbqWAst<$>k+b}!6un(KIK&7ehL+7GQ^gN@L{vIRGN7xMy~>{Fhf>}myRDBb67zl}0!#SO zM?N9Rz+6vsapMfq`1N>Dvjh`hpA!bf&7c&QbcdA&y)4 z8|#F&A1_jju$%3W4N7UW zV*Ne*Rxu4eFKrGU=Xa!i7G94p<7;9H;1M1lvqDjf*%%{`ygHn>;=6@%9PDUpJo$w`=+++Vm%G4S6 zlxW?5GP40`=Q9_p=eVpMGMqi$FNwl;GL7u47z)ah-iO)>+=8`4nl6#-bY1w_b`j=lvZxrS3H089#-pE3pjg;0LY?qF{^kx;z<;te zVyyg7mfBc>58y~Lc={;r8IpB3mAaO_ARQc*y^!vr%xv-@9FaC}sl*8q23e2nkkqoR z*~SN)mzGF!Cd9LI>>J5JtK3{=vkAa)|M_P zCHCzbXd3O?Wmyk-aq(S*x*T!8K%XFAW&BW%+E@0ZgL1fA_am`J@B>zfBkrQ{_Ek-9 zcX*L)lkjygO~Qj=`j~xc>uEwgyUf0j+WH;ou+rU2@<^c#uiz_^{HRdz6W_rXFIh`> z>hKb=rg3;68RAY-JhLUOhlJDk7271$G%R-^I{hnhO*lb|b~whjEnPIRn7Vysm;$Hy zPc2Q96Ruibr@##V#=>`%xXqthhiuA3mNNeCsDMeVn9psPHzka@#g|<9L{NZ=W%&0r z%wd!0WagHvuB%v8W9GkE6J-G=b{_?@8?Ez!#Xr>zWM~=!1Q@5Hs*m%)~{w7$3td%*Gt} z5pKdo_%ANumo+;y@Gh>zDy+sDxCEEsJg$P%FoL!Gj^>Rz*bja<0R8l?{th0%et0ve zp{61>Hg>K*{ps@)<|Az(ld5 Date: Tue, 18 Mar 2025 00:46:52 +0300 Subject: [PATCH 3/4] Change substitute character in Mystic Cards from question mark to underscore --- files/data/fonts/MysticCards.omwfont | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/data/fonts/MysticCards.omwfont b/files/data/fonts/MysticCards.omwfont index de4ffaff39..b0dccb1445 100644 --- a/files/data/fonts/MysticCards.omwfont +++ b/files/data/fonts/MysticCards.omwfont @@ -2,7 +2,7 @@ - + From cd3980eca4e4d7ba3f68f2c4afe68ec0dc74beb0 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 18 Mar 2025 10:29:29 +0300 Subject: [PATCH 4/4] Make figure space non-breaking --- apps/openmw/mwgui/bookpage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwgui/bookpage.cpp b/apps/openmw/mwgui/bookpage.cpp index 2984f035a4..47e85b1f4b 100644 --- a/apps/openmw/mwgui/bookpage.cpp +++ b/apps/openmw/mwgui/bookpage.cpp @@ -1376,6 +1376,7 @@ namespace MWGui // No-break spaces (0x00A0, 0x202F, 0xFEFF - normal, narrow, zero width) // are ignored here for obvious reasons + // Figure space (0x2007) is not a breaking space either static bool ucsBreakingSpace(int codePoint) { switch (codePoint) @@ -1390,7 +1391,6 @@ namespace MWGui case 0x2004: // THREE-PER-EM SPACE case 0x2005: // FOUR-PER-EM SPACE case 0x2006: // SIX-PER-EM SPACE - case 0x2007: // FIGURE SPACE case 0x2008: // PUNCTUATION SPACE case 0x2009: // THIN SPACE case 0x200A: // HAIR SPACE