mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
+40
-9
@@ -1074,21 +1074,34 @@ func (r *Renderer) renderText(ctx *canvas.Context, obj TextObject, pageH float64
|
|||||||
if fillColorNode != nil && fillColorNode.AxialShd != nil {
|
if fillColorNode != nil && fillColorNode.AxialShd != nil {
|
||||||
glyphFillPaint = parseFillPaint(fillColorNode, bx, by, pageH, canvasX, canvasY)
|
glyphFillPaint = parseFillPaint(fillColorNode, bx, by, pageH, canvasX, canvasY)
|
||||||
}
|
}
|
||||||
|
advanceLimit := textGlyphAdvanceLimit(dxs, dys, xs, i, len(runes), cx)
|
||||||
if glyphFillPaint != nil {
|
if glyphFillPaint != nil {
|
||||||
ctx.SetFill(glyphFillPaint)
|
ctx.SetFill(glyphFillPaint)
|
||||||
drawGlyph := func(x, y float64) {
|
drawGlyph := func(x, y float64) {
|
||||||
if hScale != 1 {
|
|
||||||
ctx.Push()
|
|
||||||
ctx.Translate(x, y)
|
|
||||||
ctx.Scale(hScale, 1)
|
|
||||||
x, y = 0, 0
|
|
||||||
defer ctx.Pop()
|
|
||||||
}
|
|
||||||
if drawAsPath {
|
if drawAsPath {
|
||||||
path, width := face.ToPath(str)
|
path, width := face.ToPath(str)
|
||||||
textWidth = width * hScale
|
scaleX := hScale
|
||||||
ctx.DrawPath(x, y, path)
|
if advanceLimit > 0 && width*scaleX > advanceLimit {
|
||||||
|
scaleX = advanceLimit / width
|
||||||
|
}
|
||||||
|
textWidth = width * scaleX
|
||||||
|
if scaleX != 1 {
|
||||||
|
ctx.Push()
|
||||||
|
ctx.Translate(x, y)
|
||||||
|
ctx.Scale(scaleX, 1)
|
||||||
|
ctx.DrawPath(0, 0, path)
|
||||||
|
ctx.Pop()
|
||||||
|
} else {
|
||||||
|
ctx.DrawPath(x, y, path)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if hScale != 1 {
|
||||||
|
ctx.Push()
|
||||||
|
ctx.Translate(x, y)
|
||||||
|
ctx.Scale(hScale, 1)
|
||||||
|
x, y = 0, 0
|
||||||
|
defer ctx.Pop()
|
||||||
|
}
|
||||||
textFace := face
|
textFace := face
|
||||||
if fillColorNode != nil && fillColorNode.AxialShd != nil {
|
if fillColorNode != nil && fillColorNode.AxialShd != nil {
|
||||||
textFace = ff.Face(sizePt, glyphFillPaint, fontStyle, canvas.FontNormal)
|
textFace = ff.Face(sizePt, glyphFillPaint, fontStyle, canvas.FontNormal)
|
||||||
@@ -1131,6 +1144,24 @@ func (r *Renderer) renderText(ctx *canvas.Context, obj TextObject, pageH float64
|
|||||||
ctx.Pop()
|
ctx.Pop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// textGlyphAdvanceLimit 获取显式字形推进宽度
|
||||||
|
// 入参: dxs X方向偏移, dys Y方向偏移, xs X坐标列表, index 字形索引, count 字形数量, currentX 当前X坐标
|
||||||
|
// 返回: float64 推进宽度
|
||||||
|
func textGlyphAdvanceLimit(dxs, dys, xs []float64, index int, count int, currentX float64) float64 {
|
||||||
|
if index+1 >= count || len(dys) > 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if index+1 < len(xs) {
|
||||||
|
if advance := xs[index+1] - currentX; advance > 0 {
|
||||||
|
return advance
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if advance, ok := textDelta(dxs, index); ok && advance > 0 {
|
||||||
|
return advance
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
// textCodePositioned 判断文本编码是否带显式定位
|
// textCodePositioned 判断文本编码是否带显式定位
|
||||||
// 入参: textCode 文本编码
|
// 入参: textCode 文本编码
|
||||||
// 返回: bool 是否带显式定位
|
// 返回: bool 是否带显式定位
|
||||||
|
|||||||
Reference in New Issue
Block a user