From aedc1493fba2f7b5a16536fed69e968074953d38 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Tue, 13 Oct 2026 19:47:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=BC=96=E8=BE=91=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=97=E4=BD=93=E5=88=87=E6=8D=A2=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=AE=8B=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_editor_font_binding.go | 6 ++++++ ofdgo_editor_resource.go | 27 +++++++++++++++++++++------ ofdgo_editor_resource_style.go | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ofdgo_editor_font_binding.go b/ofdgo_editor_font_binding.go index d4d2ede..6f80ce6 100644 --- a/ofdgo_editor_font_binding.go +++ b/ofdgo_editor_font_binding.go @@ -62,6 +62,7 @@ type FontProcessOptions struct { type editorFontChange struct { patches map[string][]editorXMLPatch files map[string][]byte + fonts []string } // editorBindingFontCache 仅保留当前文档最近读取的字体文件及最近解析结果,操作结束后释放 @@ -197,6 +198,7 @@ func (e *Editor) ProcessFontsWithOptions(ctx context.Context, options FontProces pending.patches[name] = append(pending.patches[name], patches...) } maps.Copy(pending.files, change.files) + pending.fonts = append(pending.fonts, change.fonts...) } report = append(report, item) if err := progress("fonts", len(report), total); err != nil { @@ -378,6 +380,7 @@ func (e *Editor) prepareFontBinding(ctx context.Context, scan *editorFontDocumen return nil, err } change.patches[declaration.file.name] = append(change.patches[declaration.file.name], editorXMLPatch{node.start, node.end, fragment}) + change.fonts = append(change.fonts, editorResourceID(id)) return change, nil } @@ -398,6 +401,9 @@ func (c *editorFontChange) apply(ctx context.Context, scan *editorFontDocument) } changes[name] = editorPatchXML(scan.files[name].data, patches) } + if err := invalidateResourcePreviews(ctx, scan, changes, c.fonts...); err != nil { + return err + } return scan.apply(ctx, changes) } diff --git a/ofdgo_editor_resource.go b/ofdgo_editor_resource.go index 879c86d..715f7fb 100644 --- a/ofdgo_editor_resource.go +++ b/ofdgo_editor_resource.go @@ -274,7 +274,7 @@ func (e *Editor) changeResource(ctx context.Context, kind, id string, replace fu return nil } if replace != nil && kind == "Image" { - if err := invalidateResourcePreviews(ctx, catalog.scan, item.ID, changes); err != nil { + if err := invalidateResourcePreviews(ctx, catalog.scan, changes, item.ID); err != nil { return err } } @@ -346,16 +346,30 @@ func validateResourceImageMask(ctx context.Context, catalog *resourceCatalog, id return ctx.Err() } -// invalidateResourcePreviews 沿颜色、绘制参数和复合引用移除资源变化后失效的替换图及底纹预览 -// 入参: ctx 取消上下文, scan 当前文档结构, id 资源标识, changes 待提交文件 +// invalidateResourcePreviews 沿字体、颜色、绘制参数和复合引用移除资源变化后失效的替换图及底纹预览 +// 入参: ctx 取消上下文, scan 当前文档结构, changes 待提交文件, ids 资源标识 // 返回: error 解析或取消错误 -func invalidateResourcePreviews(ctx context.Context, scan *editorFontDocument, id string, changes map[string][]byte) error { - doc, err := scan.reader.DocContext(ctx) +func invalidateResourcePreviews(ctx context.Context, scan *editorFontDocument, changes map[string][]byte, ids ...string) error { + if len(ids) == 0 { + return ctx.Err() + } + reader := scan.reader + if scan.index != reader.DocumentIndex() { + var err error + reader, err = reader.DocumentContext(ctx, scan.index) + if err != nil { + return err + } + } + doc, err := reader.DocContext(ctx) if err != nil { return err } defaultCS := strconv.Itoa(doc.CommonData.DefaultCS) - affected := map[string]bool{id: true} + affected := make(map[string]bool, len(ids)) + for _, id := range ids { + affected[editorResourceID(id)] = true + } for { count := len(affected) for name, file := range scan.files { @@ -378,6 +392,7 @@ func invalidateResourcePreviews(ctx context.Context, scan *editorFontDocument, i } primary := affected[editorResourceID(node.attr("ResourceID"))] || affected[editorResourceID(node.attr("ImageMask"))] changed := primary || affected[editorResourceID(node.attr("Substitution"))] || affected[editorResourceID(node.attr("DrawParam"))] || affected[editorResourceID(node.attr("ColorSpace"))] + changed = changed || affected[editorResourceID(node.attr("Font"))] if resourceColorNode(node) && node.attr("ColorSpace") == "" { changed = changed || affected[defaultCS] } diff --git a/ofdgo_editor_resource_style.go b/ofdgo_editor_resource_style.go index 1c93302..29bdc0b 100644 --- a/ofdgo_editor_resource_style.go +++ b/ofdgo_editor_resource_style.go @@ -431,7 +431,7 @@ func replaceResourceStyle(ctx context.Context, catalog *resourceCatalog, item Re if err := validateResourceStyleGraph(ctx, catalog, item.ID, changes); err != nil { return err } - return invalidateResourcePreviews(ctx, catalog.scan, item.ID, changes) + return invalidateResourcePreviews(ctx, catalog.scan, changes, item.ID) } // resourceColorNode 判断可携带基本颜色或复杂填充的标准节点