From c5ef7c4eae5561e0fe063218b029216eacb13873 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Thu, 10 Sep 2026 00:38:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B8=B2=E6=9F=93=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=A1=B5=E9=9D=A2=E4=B8=8E=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E5=B1=82=E5=8F=A0=E6=94=BE=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_object.go | 1 + ofdgo_page.go | 1 + ofdgo_renderer.go | 27 +++++++++++---------------- ofdgo_renderer_layer.go | 25 +++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/ofdgo_object.go b/ofdgo_object.go index 0c515c5..2b87217 100644 --- a/ofdgo_object.go +++ b/ofdgo_object.go @@ -119,6 +119,7 @@ func decodeObjectContainer(d *xml.Decoder, start xml.StartElement, decode func(* func (l *Layer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { *l = Layer{} l.ID = attrValue(start, "ID") + l.Type = attrValue(start, "Type") l.DrawParam = attrValue(start, "DrawParam") return decodeObjectContainer(d, start, l.decodeObject) } diff --git a/ofdgo_page.go b/ofdgo_page.go index af1c13a..39b7aad 100644 --- a/ofdgo_page.go +++ b/ofdgo_page.go @@ -41,6 +41,7 @@ type Content struct { // Layer 图层 type Layer struct { ID string `xml:"ID,attr"` + Type string `xml:"Type,attr"` DrawParam string `xml:"DrawParam,attr"` Objects []GraphicObject `xml:"-"` TextObject []TextObject `xml:"TextObject"` diff --git a/ofdgo_renderer.go b/ofdgo_renderer.go index bcc105f..c7b012a 100644 --- a/ofdgo_renderer.go +++ b/ofdgo_renderer.go @@ -118,24 +118,19 @@ func (r *Renderer) renderPageToContext(ctx *canvas.Context, page *PageContent, d ctx.SetFillColor(canvas.White) ctx.DrawPath(0, 0, canvas.Rectangle(box.W, box.H)) } - if len(page.Template) > 0 && r.Reader.doc != nil { - for _, tplRef := range page.Template { - if tplRef.ZOrder != "Foreground" { - r.renderTemplate(ctx, tplRef.TemplateID, pageH) - } - } - } - if page.Content.Layer != nil { - for _, layer := range page.Content.Layer { - r.renderLayer(ctx, layer, pageH, nil, nil) - } - } - if len(page.Template) > 0 && r.Reader.doc != nil { - for _, tplRef := range page.Template { - if tplRef.ZOrder == "Foreground" { - r.renderTemplate(ctx, tplRef.TemplateID, pageH) + for order := range 3 { + if r.Reader.doc != nil { + for _, tplRef := range page.Template { + kind := tplRef.ZOrder + if kind == "" { + kind = "Background" + } + if layerOrder(kind) == order { + r.renderTemplate(ctx, tplRef.TemplateID, pageH) + } } } + r.renderLayers(ctx, page.Content.Layer, pageH, order) } if r.RenderAnnotations { r.renderAnnotations(ctx, page.ID, pageH) diff --git a/ofdgo_renderer_layer.go b/ofdgo_renderer_layer.go index f6cfb64..50faf82 100644 --- a/ofdgo_renderer_layer.go +++ b/ofdgo_renderer_layer.go @@ -53,8 +53,29 @@ func (r *Renderer) renderTemplate(ctx *canvas.Context, templateID string, pageH } r.templatePageCache[templateID] = tplContent } - if tplContent.Content.Layer != nil { - for _, layer := range tplContent.Content.Layer { + for order := range 3 { + r.renderLayers(ctx, tplContent.Content.Layer, pageH, order) + } +} + +// layerOrder 获取图层类型的绘制顺序 +// 入参: kind 图层类型 +// 返回: int 绘制顺序 +func layerOrder(kind string) int { + switch kind { + case "Background": + return 0 + case "Foreground": + return 2 + } + return 1 +} + +// renderLayers 按原顺序渲染指定类型的图层 +// 入参: ctx 画布上下文, layers 图层列表, pageH 页面高度, order 图层类型顺序 +func (r *Renderer) renderLayers(ctx *canvas.Context, layers []Layer, pageH float64, order int) { + for _, layer := range layers { + if layerOrder(layer.Type) == order { r.renderLayer(ctx, layer, pageH, nil, nil) } }