From ffcf2262b27b0fcbbdf30e68e6b31992196b6f1f Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Thu, 25 Jun 2026 14:54:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=A8=AA=E7=BA=BF=E6=B8=B2=E6=9F=93):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A8=AA=E7=BA=BF=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_renderer.go | 35 ++++++++++++++++++++++++++++++----- ofdgo_text.go | 18 +++++++++++++++++- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/ofdgo_renderer.go b/ofdgo_renderer.go index 8661071..efd1774 100644 --- a/ofdgo_renderer.go +++ b/ofdgo_renderer.go @@ -462,12 +462,20 @@ func (r *Renderer) renderImage(ctx *canvas.Context, obj ImageObject, pageH float // 入参: ctx 画布上下文, obj 路径对象, pageH 页面高度, defaultFill 默认填充色, defaultStroke 默认描边色, defaultLW 默认线宽, parentCTM 父级CTM func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64, defaultFill, defaultStroke color.Color, defaultLW float64, parentCTM *Matrix) { ctx.Push() + bx, by := 0.0, 0.0 + if obj.Boundary != "" { + if box, err := ParseBox(obj.Boundary); err == nil { + bx, by = box.X, box.Y + } + } ctm := NewMatrix(obj.CTM) if parentCTM != nil { ctm = parentCTM.Multiply(ctm) } r.applyClips(ctx, obj.Clips, pageH, &ctm) fillColor, strokeColor := defaultFill, defaultStroke + var fillPaint any = fillColor + var strokePaint any = strokeColor lineWidth := defaultLW if lineWidth == 0 { lineWidth = 0.353 @@ -483,9 +491,11 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64 } if dp.FillColor != nil { fillColor = parseFillColor(dp.FillColor) + fillPaint = parseFillPaint(dp.FillColor, bx, by, pageH, 0, 0) } if dp.StrokeColor != nil { strokeColor = parseStrokeColor(dp.StrokeColor) + strokePaint = parseStrokePaint(dp.StrokeColor, bx, by, pageH, 0, 0) } if dp.Cap == "Round" { lineCap = canvas.RoundCap @@ -508,9 +518,11 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64 } if obj.FillColor != nil { fillColor = parseFillColor(obj.FillColor) + fillPaint = parseFillPaint(obj.FillColor, bx, by, pageH, 0, 0) } if obj.StrokeColor != nil { strokeColor = parseStrokeColor(obj.StrokeColor) + strokePaint = parseStrokePaint(obj.StrokeColor, bx, by, pageH, 0, 0) } if obj.Cap != "" { if obj.Cap == "Round" { @@ -534,13 +546,23 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64 dashPattern = parseFloats(obj.DashPattern) dashOffset = obj.DashOffset } + if scale := math.Sqrt(math.Abs(ctm.a*ctm.d - ctm.b*ctm.c)); scale > 0 { + lineWidth *= scale + dashOffset *= scale + for i := range dashPattern { + dashPattern[i] *= scale + } + } p := r.buildPath(obj, pageH, ctm) shouldFill := true if obj.Fill != nil { shouldFill = *obj.Fill } - if shouldFill && fillColor != nil { - ctx.SetFillColor(fillColor) + if fillPaint == nil { + fillPaint = fillColor + } + if shouldFill && fillPaint != nil { + ctx.SetFill(fillPaint) ctx.SetStrokeColor(canvas.Transparent) ctx.DrawPath(0, 0, p) } @@ -549,11 +571,14 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64 shouldStroke = *obj.Stroke } if shouldStroke { - if strokeColor == nil { - strokeColor = color.Transparent + if strokePaint == nil { + strokePaint = strokeColor + } + if strokePaint == nil { + strokePaint = color.Transparent } ctx.SetFillColor(canvas.Transparent) - ctx.SetStrokeColor(strokeColor) + ctx.SetStroke(strokePaint) ctx.SetStrokeWidth(lineWidth) ctx.SetStrokeCapper(lineCap) ctx.SetStrokeJoiner(lineJoin) diff --git a/ofdgo_text.go b/ofdgo_text.go index 5d15b1f..f5437e0 100644 --- a/ofdgo_text.go +++ b/ofdgo_text.go @@ -15,10 +15,10 @@ package ofdgo import ( + "github.com/tdewolff/canvas" "image/color" "strconv" "strings" - "github.com/tdewolff/canvas" ) // parseColor 解析颜色字符串 @@ -88,6 +88,22 @@ func parseStrokeColor(strokeColor *StrokeColor) color.Color { return parseAxialShdColor(strokeColor.AxialShd, strokeColor.Alpha) } +// parseStrokePaint 解析勾边画刷 +// 入参: strokeColor 勾边颜色节点, x X坐标, y Y坐标, pageH 页面高度, originX 原点X坐标, originY 原点Y坐标 +// 返回: any 勾边画刷 +func parseStrokePaint(strokeColor *StrokeColor, x, y, pageH, originX, originY float64) any { + if strokeColor == nil { + return nil + } + if strings.TrimSpace(strokeColor.Value) != "" { + return parseColorWithAlpha(strokeColor.Value, strokeColor.Alpha) + } + if gradient := parseAxialShdGradient(strokeColor.AxialShd, strokeColor.Alpha, x, y, pageH, originX, originY); gradient != nil { + return gradient + } + return parseAxialShdColor(strokeColor.AxialShd, strokeColor.Alpha) +} + // parseAxialShdColor 解析轴向渐变颜色 // 入参: axialShd 轴向渐变节点, alpha 透明度 // 返回: color.Color 颜色对象