mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
1 parent
ffba4adc43
commit
5545c3d4b5
1 file changed
+29
-14
+29
-14
@@ -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 生成文字样式副本,不提交文档或历史
|
||||||
|
|||||||
Reference in new issue
Block a user