Skip to content
This repository has been archived by the owner on Dec 8, 2023. It is now read-only.

增加autoHeightAlign自动高度校准对齐功能 #8

Closed
wants to merge 1 commit into from

Conversation

Angluca
Copy link
Contributor

@Angluca Angluca commented May 9, 2023

如果该字体底部大于lineheight并且头部是空白的, 就可以自动修复成和其它字体同样的高度.

比如 设置quan 7x7 时 俄语和其它符号是7x8的高度并且头部有空白区域,
结果该类字体就显示不了h8的字尾, 因为高度只有7,
这个功能就是修复h8的俄语和符号去掉头部空白上移变为h7,
变成和其它字体一样可以完美显示的7x7字体了

如果该字体底部大于lineheight并且头部是空白的, 就可以自动对齐和其它字同样高度
比如 quan 7x7 时 俄语和其它符号是7x8的高度并且头部是空白 结果就显示不了8的字尾了.
这个功能就是修复h8的俄语和符号去掉头空白上移变为h7, 和其它字体一样变成7x7完美大小的字体了
@Angluca Angluca changed the title 增加autoHeightAlign校准空白对齐功能 增加autoHeightAlign自动高度校准对齐功能 May 9, 2023
@TakWolf
Copy link
Collaborator

TakWolf commented May 10, 2023

这样的算法是有问题的。

为什么不能这么计算?

因为这相当于改变了个别字形的纵向位置,使原本处于基线对齐的字形不再按照基线对齐。实际字体中,字形边框超过 ascent 和 descent 是可能的而且实际存在(例如:有些字符有上下装饰器,他们可以在行高内,也可以超过,这取决字体的风格)。

全小素有更实际的问题。他的汉字字形设计为 77,添加 11 边框,实际占用尺寸为 8*8。而它的行高也设计为 8px。这就意味着,所有装饰性字形都会超过行高。另外俄语字形实际高度占用为8px。因为 nico 有问题 ftsf/nico#115 的存在,为了显示正确的行距而裁剪 1px,一定会切掉字形的。

这是全小素自己字形和字体参数设定的问题,需要字体方面来解决。这不是字体工具的问题。

那正确的解决方式是什么?

nico 需要修复 ftsf/nico#115 , 把排版参数交还给字体自身。这样本质上所有字体都不需要进行偏移修正了。

而行高的部分,则需要开发者自己来做决策。
要么调整一个足够大的行高,来保证包含所有像素尺寸(nico 目前字体打印没有动态行高参数,这实际会影响没关系)。
要么使用美观行距,接受字形裁剪。

@Angluca
Copy link
Contributor Author

Angluca commented May 10, 2023

你说的没错, 只是像素游戏大都字体简单对齐显示, 毕竟空间太小, 要么只能选对字体(字全都对等), 要么只能靠自己修复生成 或者 游戏里再算一次高底修复.

像素游戏一般都是 wh512像素内, 基本靠字体宽高来判断对齐显示, 所以看到的所有像素字体的高底基本都不会相差大于2像素, 也许h7h8的像素字体看不出多大的差距, 但一用到>8像素的字体基本空白间隙就非常显眼, 所有这优化只是为了给这些像素游戏用, 让所有的字都差不多间距

其实全小素全中日韩文都是对等的h7, 但那些俄语和一些字符等却是完全不和群的h8, 可能就是原8像素原字体拷贝的没改动, 导致上排为空显示出来非常别扭.

默认代码只要adjustHeight = -1, 所有字体都全部成 lineHeight - adjustHeight = 8-1 = 7h高度了, 结果只能用7x7的字体, 里面7x8的俄语等字符 都成占位的畸形字了, 看上去有种bug感.

这些全是在nico384x384大小内的截图, 看看像素大小的差别, 用这个unicode例子可以测试全部字体
ftsf/nico#116

看看qu原来的7x7 和 qu0是修复过的7x7 的区别
bbb

其它字体都是用你的test代码生成的, 没有使用过修复没改过, 看看高像素空白多的字体在像素游戏窗口内的间隙 和 缺失的像素底部 的感觉.

nico font:
ft

ChillPixell 寒蝉 像素字体:
ch

unifont:
uf2
uf

fusion pp:
fp2
fusion pm:
fpm

这个修复功能只会在 adjustHeight < 0, lineHeightMax > lineHeight 时生效 , 你这个算法有些 字高度height > lineheight 了导致不能显示下面,变成畸形了, 但这功能 就是修复对齐下 让那些畸形字体不再畸形缺失, 当然如果不想用这个功能 只要adjustHeight=0 或者 直接autoHeightAlign=false就行了, 只是为了方便那些显示字体方便简单的 项目哈

@TakWolf
Copy link
Collaborator

TakWolf commented May 10, 2023

所以,这是全小素字体自身的问题,应该由字体方面来解决。不应该由处理工具通过特例算法来解决,也不应该在游戏中通过特例算法来解决。(因为使用算法不通用,或者并非解决通用性问题)

当前算法的问题是:只能解决个别字形的偏移为题(代价是破坏了基线对齐)。并不能整体让例如俄语字形整体性平移,也不能解决目前俄语字符和拉丁字符不适配的问题。虽然你让他们看起来好像是都能完整显示了,但其实布局是不对的。

方舟包含一个比【例模】和【等宽】模式。参考 10px:
等宽模式
比例模式

其中等宽模式就是尺寸严格的紧凑排列,所有字符一定保证在 10 * 10 格子内部,没有例外。因为宽度不够,所以 10px 干脆抛弃了俄语字符。这里设计者必须做出取舍,要么抛弃美观性,保证参数严格;要么破坏工整性。

全小素是一个相当不严谨的补丁字体,制作过程就是几种字体暴力合并。项目里只是用它做个例子,不会期望它能成为 nico 8px 的最终解决方案。
不如考虑重新工整的合成一个 8像素,根本解决问题。

@Angluca
Copy link
Contributor Author

Angluca commented May 10, 2023

恩... 这只是个人化简单修复小功能.
最终还是得看 像素字体作者来整合了, 像寒蝉 像素字体 对齐还不错哈 7x7都可以用所有字,
如果你们的像素字体出了应该会很香, 看上去蛮有爱 期待哈.

@Angluca Angluca closed this May 10, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants