From 5c6da36fa8f22c65f0e79a56af4406815e722e88 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 1 Mar 2026 14:23:36 +0900 Subject: [PATCH] fix: tamil uu-matra is disjoined by one pixel --- OTFbuild/calligra_font_tests.odt | Bin 15729 -> 15737 bytes OTFbuild/font_builder.py | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OTFbuild/calligra_font_tests.odt b/OTFbuild/calligra_font_tests.odt index bc51ce2a2fce1b0b7a193c14d96db1059e56dba2..1964d3983c3c7b03c9c3996a17401611c0a67d32 100644 GIT binary patch delta 2528 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 delta 2491 zcmV;s2}Jh!dhvP;P)h>@6aWAK007}`kqk=$;cl^6;{pQVZnHiEdKL-cZed(O-o>Pg zlffAme@k=QHW0q&S8&)<4;1zCLmJDOK9cFdnI4>;I-Lwef)W~%-~eE3^-uKJ|JPsA zB|uUj#Rq87?!>JRnHczhUF?3lz=H72+s7!hzF@`)jW_meGPNxnd(fG98^^^|2m}1F|z6t=84zpakoq1Ii-P!5LN`%RNRCW6=s-8J}_3cz6cZN5^Tj zf5pt$YDl1yDIz5H8+$KAvUc5vhlk0-VnW%@ovl{a?g!|U|9rSB75-vObbvY@jS_Hm zjdlSwo#T;*PC#3xK`}9QT!ua29FIt7yc)o^=;5I-Bs+#Gb}SmDHRsdmg=<$*6{WPq zXW~?AfnK@l_cA(gD5~?z7U-OSPHxOyf5DLV*#UCLJIr0#>&W#a=r|2eLLvrCBk`xx zAaB4NNC-x@sla)QK3$%NwcI~1SA3L_q%4$%@jVxZICBbjXOmfJ(Z`U)pIcbGa%Hc5 z`^GAE5VdhYgLR|g!N&ng!+b}vR9k?+;fIZ#Acnw=$v&H*9Fe7ACt=_?CJ1aoe*uNO z9#V+KZ>I9c&YA)W+f*^pJ&L(?j~NM$eVqIO(Lb9{rq!QB*sj#iZBS5CTvs?V>&E^8 zrp@g0X+FKQ^B$joAJM_7BCN8%d#Pn>ZM_jdY=jf9KAY($5C0 z(P2aRQfF(*1&uCDs9Hr1mHQ6PfS4hH{m#^NggrHJEnhfs{g@xWU|AoD2wS4QKv@;c znE}^EQ@Lmar#d*PcpwxrwJ5_tT|QT!*0>kJDIX40VvpfWYrw!p{7@ch$)bhzWwPkt z`ru@-7=dXu^O4vvT~vW*e;91lW3bhT2D@xx;dus2<0OR!zQ?|S)f&)4O;-kOqqKVO z;Dh|giL7QVs7?&5q@jlI2!2dOOTMginkUL(+h0VuXOej|*wAIZr&P4Bv)=n$3st*! z%PFv7pYJ#m4l^){Q={6b3Opl8&89tB>IfJiO%z`bEEayY($fd zUx9-#5990_-sBk3fIgGt$=)|U#GGIU%TB`(i_Sx|f;{yAefjV1JBrjTgqQfr6zv3aWMAHg;~!-|$SXgv!u=tF2|DXTtBNU>oat^@mi5RfV50~^f3dfxtVd84R1wtW9=(-v zqFy@iG%4=>p5lNmeG3P?n7Z;o$?>#WQTeXrDzE&CbsQ`ss9?W*mSD+FE?|RnzMwG0 z@@t7~EM}8~xb_tVM#5@vKpvqG*V=d*$hL3w#_TNyf@nbbtmP+}>{G9H3RkLWMyhLF zSjvHLb>x?6e}EC=b*u-tUE$J*B*oe`zmF zn!GT3?Otg4oL<&-%_6s|W|W=k|JgGLwz2>I>(8&iVoK#FTCC;v<8JmpZ(oqNEk!Q0 zkLrc_m|mE_Ixn;wEuno>FD%CN!s4s-LUFD?b;QrQf4wWm{~Y`u&N~g}xE;e#uP!w_ zm!V!=^fnpl7`c@wJqB-9|8Pe=lTVp^v}=_eju#>hrV7dre6q_U>P2~_{?${y+d-tD1B69o%Sw)4jU^=I@Gq3TVOYDw zD~IbrUc5tJ^8|YYgHNmA&~Djw9agG{F9_27LY}yo`4*{vR|kbV@Jjb=~=2?u%{?E zK%1;8d4WCi%{(j@`&(<0EBH=3Tc$K4e`x|%I;Cw>ric0s<>|g!74CS{61Z~m(t-`B zg&>jvwH?1pWqR?JJJIQmThT(tgXHcEc1HMLH;+a4lQHVQ^ys~_Q_i2s*&L{3nZAc` z<`|zZ-ek@vjns2w9usBf^m*iMATrHXylA~cUR#VD1l#|U= z^yr&<<~eKk{q=bjM#X~P=?naD6rs!Z;eA!BA5cpJ1QY-O00;o#ZnNSd)E5HbZnL;L z7Xbp{Zj;eFGy>snlLtIF0^x3xK|D7J;cj7ELEgori<5yoFCXD z000O80000000000005+cVUy217XsmKljuAg0nU>JJtqR;Zj&xO908=0OFbwCyE^~? F002VTt8)MV diff --git a/OTFbuild/font_builder.py b/OTFbuild/font_builder.py index f75d928..260ea49 100644 --- a/OTFbuild/font_builder.py +++ b/OTFbuild/font_builder.py @@ -169,10 +169,11 @@ def build_font(assets_dir, output_path, no_bitmap=False, no_features=False): x += tg.props.width continue cols = min(tg.props.width, len(tg.bitmap[0])) if tg.props.width > 0 else len(tg.bitmap[0]) + nudge = tg.props.nudge_x for row in range(min(len(tg.bitmap), bm_height)): for col in range(cols): - dst_col = x + col - if dst_col < total_width and tg.bitmap[row][col]: + dst_col = x + col - nudge + if 0 <= dst_col < total_width and tg.bitmap[row][col]: composite[row][dst_col] = 1 if tg.props.width > 0: x += tg.props.width