From 89dfb12296cbcf6d28159eaf284a06ecf1519f52 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Thu, 25 Jun 2026 15:12:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=9B=BE=E5=83=8F=E6=B8=B2=E6=9F=93):=20?= =?UTF-8?q?=E5=BC=BA=E5=8C=96=E5=9B=BE=E5=83=8F=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_renderer.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/ofdgo_renderer.go b/ofdgo_renderer.go index efd1774..e681896 100644 --- a/ofdgo_renderer.go +++ b/ofdgo_renderer.go @@ -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 字形列表