feat(转换渲染): 保留PDF结构并优化渲染
build.yaml / build (push) Successful in 2m37s

This commit is contained in:
xiaoqidun committed 2026-10-18 18:08:52 +08:00
1 parent 627a06cda3
commit a2de650b52
31 files changed
+2166 -249

No files matched your search

+22 -1
View File
@@ -177,7 +177,7 @@ func (CanvasBackend) Stroke(path GeometryPath, options StrokeOptions) (result Ge
style.applyLineJoin(options.Join, options.MiterLimit, options.MiterLimitSet)
style.lineCap = pathLineCap(options.Cap, style.lineCap)
p = p.Dash(options.DashOffset, options.Dashes...)
p = p.Flatten(tolerance)
p = flattenCanvasPath(p, tolerance)
p = p.Stroke(options.Width, style.lineCap, style.lineJoin, tolerance)
return *geometryFromCanvasPath(p), nil
}
@@ -199,6 +199,27 @@ func (CanvasBackend) Clip(r *Renderer, clips *Clips, matrix Matrix, parent *Geom
return geometryFromCanvasPath(r.intersectCachedClipPath(p, clip)), nil
}
// flattenCanvasPath 按子路径展开曲线,避免每次替换都复制后续独立轮廓
// 入参: path 原始路径, tolerance 展开误差
// 返回: *canvas.Path 直线路径,不修改原始路径
func flattenCanvasPath(path *canvas.Path, tolerance float64) *canvas.Path {
if path.IsFlat() {
return path
}
if data := path.Data(); len(data) > 0 && data[len(data)-1] == canvas.MoveToCmd {
return path.Flatten(tolerance)
}
parts := path.Split()
if len(parts) <= 1 {
return path.Flatten(tolerance)
}
data := make([]float64, 0, len(path.Data()))
for _, part := range parts {
data = append(data, part.Flatten(tolerance).Data()...)
}
return canvas.NewPathFromData(data)
}
// canvasNativeStroke 判断描边是否由Canvas提供
// 入参: geometry 几何后端
// 返回: bool 是否采用原生描边