Dituon / petpet

根据模板生成图像
http://d2n.moe/petpet/
GNU Affero General Public License v3.0
310 stars 81 forks source link

fix line break misalignment when inserting newlines in wrapped text #118

Closed Natsukage closed 2 months ago

Natsukage commented 2 months ago

在原有的 while 循环中,每次插入换行符后,字符的位置发生了偏移,导致后续的换行符插入位置错位。

具体表现为:原本应在固定位置插入换行符,但由于每次插入都会影响后续字符的位置,最终导致文本分割不正确。

在原有代码中,插入换行符时会导致字符位置错位。例如,假设我们有字符串 为什么我不是JBB,希望在第 3 和第 6 个位置插入换行符,结果应为:

为什么
我不是
JBB

然而,在原代码中,第一次在第 3 个字符后插入换行符后,字符串变成了 为什么\n我不是JBB。此时,第 6 个字符已经变成了 ,导致第二次插入换行符时,结果变成了:

为什么
我不
是...

通过将 while 循环改为从后向前插入换行符的 for 循环,避免了字符位置的偏移问题,确保了每个换行符都能正确插入到预期的位置。

vercel[bot] commented 2 months ago

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
petpet ✅ Ready (Inspect) Visit Preview 💬 Add feedback Sep 6, 2024 5:38am
Natsukage commented 2 months ago

原代码使用 fm.getAscent() - fm.getDescent() - fm.getLeading()来计算字体的高度,但这种计算方式并不准确。它仅计算了从基线到顶部的高度,减去了下降部分和行距,无法完整反映字体的实际行高,尤其是在处理多行文本时。

直接使用fm.getHeight() 方法会返回完整的行高,包括上升、下降和行间距部分。因此,使用 fm.getHeight() 更符合计算文本高度的预期,尤其是当需要渲染多行文本时,getHeight() 返回的值更能反映文本占据的总空间。