mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 16:07:05 +08:00
1 parent
12aaada982
commit
7a23dcc6dd
10 files changed
+574
-77
No files matched your search
@@ -24,8 +24,71 @@ import (
|
||||
)
|
||||
|
||||
// FontFace 字体文件中的字体名称与零起始索引,不依赖文件名
|
||||
// Family和Style保留排版族,MenuFamily和MenuStyle提供兼容四款式的菜单名称
|
||||
// FamilyKey用于同来源内的族关联,Bold和Italic表示字体固有样式
|
||||
type FontFace = basefont.Face
|
||||
|
||||
// FontFamilyIndexes 按兼容字体族、版本及来源分组,同款式重复时整族保留独立入口
|
||||
// 入参: faces 字体信息, sources 每项的来源标识,空列表表示同一来源
|
||||
// 返回: [][]int 按首次出现顺序分组的候选索引
|
||||
func FontFamilyIndexes(faces []FontFace, sources []string) [][]int {
|
||||
groups := make([][]int, 0, len(faces))
|
||||
keys := make([]string, len(faces))
|
||||
styles := make(map[string]map[[2]bool]bool)
|
||||
ambiguous := make(map[string]bool)
|
||||
for index, face := range faces {
|
||||
key := face.FamilyKey
|
||||
if len(sources) > index {
|
||||
key += "\x00" + sources[index]
|
||||
}
|
||||
keys[index] = key
|
||||
if styles[key] == nil {
|
||||
styles[key] = make(map[[2]bool]bool)
|
||||
}
|
||||
style := [2]bool{face.Bold, face.Italic}
|
||||
ambiguous[key] = ambiguous[key] || styles[key][style]
|
||||
styles[key][style] = true
|
||||
}
|
||||
indexes := make(map[string]int)
|
||||
for index, face := range faces {
|
||||
key := keys[index]
|
||||
if face.FamilyKey == "" || ambiguous[key] {
|
||||
groups = append(groups, []int{index})
|
||||
continue
|
||||
}
|
||||
group, exists := indexes[key]
|
||||
if !exists {
|
||||
group, indexes[key] = len(groups), len(groups)
|
||||
groups = append(groups, nil)
|
||||
}
|
||||
groups[group] = append(groups[group], index)
|
||||
}
|
||||
return groups
|
||||
}
|
||||
|
||||
// FontStyleIndex 选择同族候选中最接近的真实款式,允许补充合成样式但不抵消固有样式
|
||||
// 入参: faces 同来源同族候选, bold 粗体, italic 斜体
|
||||
// 返回: int 候选索引,无可用款式时为-1
|
||||
func FontStyleIndex(faces []FontFace, bold, italic bool) int {
|
||||
selected, best := -1, -1
|
||||
for index, face := range faces {
|
||||
if face.Bold && !bold || face.Italic && !italic {
|
||||
continue
|
||||
}
|
||||
score := 0
|
||||
if face.Bold == bold {
|
||||
score++
|
||||
}
|
||||
if face.Italic == italic {
|
||||
score++
|
||||
}
|
||||
if score > best {
|
||||
selected, best = index, score
|
||||
}
|
||||
}
|
||||
return selected
|
||||
}
|
||||
|
||||
// FontPreferenceOrder 按字体族偏好排列候选索引,同族优先常规样式,其余保持原顺序
|
||||
// 入参: faces 候选字体, families 按优先级排列的字体族别名组
|
||||
// 返回: []int 候选字体的零起始索引,不修改输入列表
|
||||
|
||||
Reference in new issue
Block a user