feat(编辑能力): 完善复合对象编辑,修复撤销后的粘贴路径和裁剪状态
build.yaml / build (push) Successful in 37s

This commit is contained in:
xiaoqidun committed 2026-09-17 18:05:16 +08:00
1 parent 2ddde73b65
commit fa8fec9830
9 files changed
+737 -71

No files matched your search

+46
View File
@@ -196,6 +196,11 @@ func (e *Editor) subsetFonts(progress editorProgress) (map[string][]byte, error)
used[resource.font.ID] = make(map[uint16]bool)
}
}
if len(used) == 0 {
return nil, progress.report("fonts", 0, 0)
}
refs := editorResourceRefs{ids: make(map[string]bool), files: make(map[string]bool)}
composite := false
total := len(e.pages) + len(e.resources)
for i, page := range e.pages {
if err := progress.report("fonts", i, total); err != nil {
@@ -203,6 +208,23 @@ func (e *Editor) subsetFonts(progress editorProgress) (map[string][]byte, error)
}
for _, layer := range page.Content.Layer {
for _, object := range layer.Objects {
if object.Type == "CompositeObject" || object.Type == "CompositeGraphicUnit" {
composite = true
origin := e.objectOrigin(editorObjectID(object))
if origin == nil {
return nil, nil
}
data, err := editorXMLObject(origin.data, origin.node, origin.object, object)
if err == nil {
data, err = editorXMLStandalone(data, origin.node)
}
if err != nil {
return nil, err
}
if _, safe := refs.scan(bytes.NewReader(data), "Page.xml"); !safe {
return nil, nil
}
}
if object.Type != "TextObject" {
continue
}
@@ -219,6 +241,30 @@ func (e *Editor) subsetFonts(progress editorProgress) (map[string][]byte, error)
}
}
}
if composite {
_, _, _, files := e.usedResources()
for i, resource := range e.resources {
if resource.composite == "" || !slices.Contains(files, resource.name) {
continue
}
if err := progress.report("fonts", len(e.pages)+i, total); err != nil {
return nil, err
}
if _, safe := refs.scan(bytes.NewReader(resource.data), resource.name); !safe {
return nil, nil
}
}
for id, usage := range refs.fonts {
glyphs := used[id]
if usage.unsafe || len(usage.glyphs) != 0 {
delete(used, id)
} else if glyphs != nil {
for char := range usage.chars {
glyphs[e.fonts[id].GlyphIndex(char)] = true
}
}
}
}
result := make(map[string][]byte)
for i := range e.resources {
if err := progress.report("fonts", len(e.pages)+i, total); err != nil {