mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
feat(图像渲染): 强化图像渲染
This commit is contained in:
@@ -554,6 +554,9 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
p := r.buildPath(obj, pageH, ctm)
|
p := r.buildPath(obj, pageH, ctm)
|
||||||
|
if rectPath := r.buildTinyFillRectPath(obj, pageH, ctm, bx, by); rectPath != nil {
|
||||||
|
p = rectPath
|
||||||
|
}
|
||||||
shouldFill := true
|
shouldFill := true
|
||||||
if obj.Fill != nil {
|
if obj.Fill != nil {
|
||||||
shouldFill = *obj.Fill
|
shouldFill = *obj.Fill
|
||||||
@@ -1155,6 +1158,49 @@ func (r *Renderer) buildPath(obj PathObject, pageH float64, ctm Matrix) *canvas.
|
|||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// buildTinyFillRectPath 构建微小填充矩形路径
|
||||||
|
// 入参: obj 路径对象, pageH 页面高度, ctm 变换矩阵, bx 边界X坐标, by 边界Y坐标
|
||||||
|
// 返回: *canvas.Path 路径对象
|
||||||
|
func (r *Renderer) buildTinyFillRectPath(obj PathObject, pageH float64, ctm Matrix, bx, by float64) *canvas.Path {
|
||||||
|
if obj.Fill == nil || !*obj.Fill || obj.Stroke == nil || *obj.Stroke {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
box, err := ParseBox(obj.Boundary)
|
||||||
|
if err != nil || box.W <= 0 || box.H <= 0 || box.W > 0.6 || box.H > 0.6 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tokens := strings.Fields(obj.AbbreviatedData)
|
||||||
|
if len(tokens) != 11 || tokens[0] != "M" || tokens[3] != "L" || tokens[6] != "L" || tokens[9] != "L" || tokens[10] != "C" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
points := make([][2]float64, 0, 4)
|
||||||
|
for i := 1; i < 10; i += 3 {
|
||||||
|
x, errX := strconv.ParseFloat(tokens[i], 64)
|
||||||
|
y, errY := strconv.ParseFloat(tokens[i+1], 64)
|
||||||
|
if errX != nil || errY != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
tx, ty := ctm.Transform(x, y)
|
||||||
|
points = append(points, [2]float64{tx + bx, pageH - (ty + by)})
|
||||||
|
}
|
||||||
|
minX, maxX := points[0][0], points[0][0]
|
||||||
|
minY, maxY := points[0][1], points[0][1]
|
||||||
|
for _, point := range points[1:] {
|
||||||
|
minX = math.Min(minX, point[0])
|
||||||
|
maxX = math.Max(maxX, point[0])
|
||||||
|
minY = math.Min(minY, point[1])
|
||||||
|
maxY = math.Max(maxY, point[1])
|
||||||
|
}
|
||||||
|
expand := math.Min(box.W, box.H) * 0.08
|
||||||
|
p := &canvas.Path{}
|
||||||
|
p.MoveTo(minX-expand, minY-expand)
|
||||||
|
p.LineTo(maxX+expand, minY-expand)
|
||||||
|
p.LineTo(maxX+expand, maxY+expand)
|
||||||
|
p.LineTo(minX-expand, maxY+expand)
|
||||||
|
p.Close()
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
// parseIndexRunes 解析索引字形
|
// parseIndexRunes 解析索引字形
|
||||||
// 入参: indexStr 索引字符串, fontID 字体ID
|
// 入参: indexStr 索引字符串, fontID 字体ID
|
||||||
// 返回: []rune 字形列表
|
// 返回: []rune 字形列表
|
||||||
|
|||||||
Reference in New Issue
Block a user