feat(后端结构): 完善多后端解耦,清理遗留代码
build.yaml / build (push) Successful in 40s

This commit is contained in:
xiaoqidun committed 2026-09-23 17:20:25 +08:00
1 parent 77ffbe6a72
commit c15547f0d2
27 files changed
+1166 -465

No files matched your search

+26 -62
View File
@@ -15,10 +15,9 @@
package ofdgo
import (
"bufio"
"bytes"
"fmt"
"image"
"io"
"math"
"github.com/tdewolff/canvas"
@@ -90,12 +89,35 @@ func (r *Renderer) renderImage(ctx *canvas.Context, obj ImageObject, pageH float
m[0][2] -= m[0][0]*p + m[0][1]*p
m[1][2] -= m[1][0]*p + m[1][1]*p
}
ctx.RenderImage(img, ctx.CoordSystemView().Mul(ctx.View()).Mul(m))
ctx.RenderImage(r.canvasEncodedImage(img), ctx.CoordSystemView().Mul(ctx.View()).Mul(m))
if obj.Border != nil {
r.renderImageBorder(ctx, obj, box, pageH, parentCTM, boundaryInCTM, clipPath)
}
}
// canvasEncodedImage 在Canvas输出边界保留原始编码,不重新压缩图片
// 入参: img 库图片
// 返回: image.Image Canvas可直接嵌入的图片
func (r *Renderer) canvasEncodedImage(img image.Image) image.Image {
source, ok := img.(*EncodedImage)
if !ok {
return img
}
state := r.canvasState()
if encoded, ok := state.images[source]; ok {
return encoded
}
var encoded *canvasimage.Image
if source.format == "jpeg" {
encoded, _ = canvasimage.NewJPEGImage(bytes.NewReader(source.Bytes()))
} else {
encoded, _ = canvasimage.NewPNGImage(bytes.NewReader(source.Bytes()))
}
encoded.Bytes = source.Bytes()
state.images[source] = encoded
return encoded
}
// renderImageBorder 渲染图像边框
// 入参: ctx 画布上下文, obj 图片对象, box 图像边界, pageH 页面高度, parentCTM 父级CTM, boundaryInCTM 边界是否参与父级CTM, clipPath 裁剪路径
func (r *Renderer) renderImageBorder(ctx *canvas.Context, obj ImageObject, box Box, pageH float64, parentCTM *Matrix, boundaryInCTM bool, clipPath *canvas.Path) {
@@ -166,7 +188,7 @@ func (r *Renderer) imageWithClip(img image.Image, clipPath *canvas.Path, m canva
bounds, w, h = resized.Bounds(), nw, nh
}
clip := clipPath.Copy().Transform(m.Inv())
compiler := &canvasPageCompiler{page: &RasterPage{Width: float64(w), Height: float64(h), DPI: 25.4}}
compiler := &canvasPageCompiler{page: &RasterPage{Width: float64(w), Height: float64(h), DPI: 25.4}, geometry: r.backends.Geometry}
ctx := canvas.NewContext(compiler)
ctx.SetFillColor(canvas.White)
ctx.SetStrokeColor(canvas.Transparent)
@@ -216,61 +238,3 @@ func (r *Renderer) imageWithClip(img image.Image, clipPath *canvas.Path, m canva
}
return out
}
// decodeImageResource 解码图片资源
// 入参: resPath 图片资源路径
// 返回: image.Image 图片对象, error 错误信息
func (r *Renderer) decodeImageResource(resPath string) (image.Image, error) {
resPath = cleanPackagePath(r.Reader.ResPath(resPath))
img, ok := r.imageCache[resPath]
if !ok {
var err error
img, err = r.readImageResource(resPath)
if err != nil {
return nil, err
}
if r.imageCache == nil {
r.imageCache = make(map[string]image.Image)
}
r.imageCache[resPath] = img
}
if r.decodeImages {
if source, ok := img.(*canvasimage.Image); ok {
return source.Image()
}
}
return img, nil
}
// readImageResource 读取图片资源并保留可直接嵌入的原始编码
// 入参: resPath 图片资源路径
// 返回: image.Image 图片对象, error 错误信息
func (r *Renderer) readImageResource(resPath string) (image.Image, error) {
rc, err := r.Reader.openFile(resPath)
if err != nil {
return nil, err
}
defer rc.Close()
reader := bufio.NewReaderSize(rc, 8)
header, _ := reader.Peek(8)
if isJPEGData(header) {
img, err := canvasimage.NewJPEGImage(reader)
if err != nil {
return nil, err
}
return img, nil
}
if isPNGData(header) {
img, err := canvasimage.NewPNGImage(reader)
if err != nil {
return nil, err
}
return img, nil
}
data, err := io.ReadAll(reader)
if err != nil {
return nil, err
}
img, _, err := decodeImageData(data)
return img, err
}