feat(文字编辑): 优化文字编辑内存占用
build.yaml / build (push) Successful in 46s

This commit is contained in:
xiaoqidun committed 2026-10-10 13:48:10 +08:00
1 parent ffba4adc43
commit 5545c3d4b5
1 file changed
+29 -14
+29 -14
View File
@@ -305,22 +305,23 @@ func missingGlyphError(id string, characters []rune) error {
return &MissingGlyphError{FontID: id, Characters: value.String()} return &MissingGlyphError{FontID: id, Characters: value.String()}
} }
// rewriteTextDeltas 局部替换字符步进,保留未修改字符及末尾附加位移 // rewriteTextDeltas 按需读取并局部替换字符步进,保留末尾附加位移及其重复编码
// 入参: value 原位移, old 原字符, replacement 替换字符, start 起点, end 终点, advance 字体步进 // 入参: value 原位移, old 原字符, replacement 替换字符, start 起点, end 终点, advance 字体步进
// 返回: string 更新后的位移数组 // 返回: string 更新后的位移数组
func rewriteTextDeltas(value string, old, replacement []rune, start, end int, advance func(rune) float64) string { func rewriteTextDeltas(value string, old, replacement []rune, start, end int, advance func(rune) float64) string {
deltas := parseFloatsWithG(value) deltas := textPositionValues{data: value, compressed: true}
steps := make([]float64, len(old)) steps := make([]float64, len(old))
complete := len(old) == 0
for i, char := range old { for i, char := range old {
steps[i] = advance(char) steps[i] = advance(char)
if i < len(old)-1 || len(deltas) >= len(old) { delta, ok := deltas.next()
if delta, ok := textDelta(deltas, i); ok { if ok || i < len(old)-1 && deltas.present {
steps[i] = delta steps[i] = delta
}
} }
complete = ok
} }
tracking := 0.0 tracking := 0.0
if len(old) > 0 && (len(old) > 1 || len(deltas) != 0) { if len(old) > 0 && (len(old) > 1 || deltas.present) {
index := min(start, max(0, len(old)-2)) index := min(start, max(0, len(old)-2))
tracking = steps[index] - advance(old[index]) tracking = steps[index] - advance(old[index])
} }
@@ -329,16 +330,30 @@ func rewriteTextDeltas(value string, old, replacement []rune, start, end int, ad
result = append(result, advance(char)+tracking) result = append(result, advance(char)+tracking)
} }
result = append(result, steps[end:]...) result = append(result, steps[end:]...)
if len(deltas) < len(old) { if !complete {
result = result[:len(result)-1] result = result[:len(result)-1]
} else {
result = append(result, deltas[len(old):]...)
} }
numbers := make([]string, len(result)) var output strings.Builder
for i, delta := range result { write := func(field string) {
numbers[i] = ofdNumber(delta) if output.Len() != 0 {
output.WriteByte(' ')
}
output.WriteString(field)
} }
return strings.Join(numbers, " ") for _, delta := range result {
write(ofdNumber(delta))
}
if deltas.repeat > 0 {
if deltas.repeat > 1 {
write("g")
write(strconv.Itoa(deltas.repeat))
}
write(ofdNumber(deltas.value))
}
if tail := strings.TrimSpace(deltas.data); tail != "" {
write(tail)
}
return output.String()
} }
// styleTextObjects 生成文字样式副本,不提交文档或历史 // styleTextObjects 生成文字样式副本,不提交文档或历史