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)
|
||||
if rectPath := r.buildTinyFillRectPath(obj, pageH, ctm, bx, by); rectPath != nil {
|
||||
p = rectPath
|
||||
}
|
||||
shouldFill := true
|
||||
if obj.Fill != nil {
|
||||
shouldFill = *obj.Fill
|
||||
@@ -1155,6 +1158,49 @@ func (r *Renderer) buildPath(obj PathObject, pageH float64, ctm Matrix) *canvas.
|
||||
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 解析索引字形
|
||||
// 入参: indexStr 索引字符串, fontID 字体ID
|
||||
// 返回: []rune 字形列表
|
||||
|
||||
Reference in New Issue
Block a user