From 4652f2f52df6167cd2cb8502ddf2a4de2a77f30d Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Tue, 22 Oct 2024 22:59:36 +0900 Subject: [PATCH 1/3] support image rendering --- .gitignore | 1 + cdt/link.go | 12 + cgraph/cgraph.go | 49 +++- graphviz.go | 6 + graphviz_test.go | 55 +++++ gvc/gvc.go | 39 +-- gvc/image_plugin.go | 94 ++++++++ gvc/image_renderer.go | 21 ++ gvc/init.go | 72 +++--- gvc/link.go | 7 + gvc/plugin.go | 5 + gvc/render_plugin.go | 263 +++++++++++++++++++++ internal/tools/nori/templates/bind.go.tmpl | 21 +- internal/wasm/bind.go | 21 +- internal/wasm/bind.proto | 4 +- internal/wasm/build/bind.c | 4 +- internal/wasm/ext.go | 47 ++-- internal/wasm/graphviz.wasm | Bin 1507196 -> 1507186 bytes 18 files changed, 605 insertions(+), 116 deletions(-) create mode 100644 cdt/link.go create mode 100644 gvc/image_plugin.go diff --git a/.gitignore b/.gitignore index 9fb747b..d30eea5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ *.jpg .DS_Store bin +internal/wasm/build/graphviz diff --git a/cdt/link.go b/cdt/link.go new file mode 100644 index 0000000..cdaa882 --- /dev/null +++ b/cdt/link.go @@ -0,0 +1,12 @@ +package cdt + +import ( + "github.com/goccy/go-graphviz/internal/wasm" +) + +func toLinkWasm(v *Link) *wasm.DictLink { + if v == nil { + return nil + } + return v.wasm +} diff --git a/cgraph/cgraph.go b/cgraph/cgraph.go index 7e18880..b7b3146 100644 --- a/cgraph/cgraph.go +++ b/cgraph/cgraph.go @@ -298,7 +298,11 @@ func ParseBytes(bytes []byte) (*Graph, error) { if graph == nil { return nil, lastError() } - return toGraph(graph), nil + g := toGraph(graph) + if err := setupNodeLabelIfEmpty(g); err != nil { + return nil, err + } + return g, nil } func ParseFile(path string) (*Graph, error) { @@ -317,7 +321,48 @@ func Open(name string, desc *Desc, disc *Disc) (*Graph, error) { if graph == nil { return nil, lastError() } - return toGraph(graph), nil + g := toGraph(graph) + if err := setupNodeLabelIfEmpty(g); err != nil { + return nil, err + } + return g, nil +} + +func setupNodeLabelIfEmpty(g *Graph) error { + n, err := g.FirstNode() + if err != nil { + return err + } + if n == nil { + return nil + } + if err := setLabelIfEmpty(n); err != nil { + return err + } + for { + n, err = g.NextNode(n) + if err != nil { + return err + } + if n == nil { + break + } + if err := setLabelIfEmpty(n); err != nil { + return err + } + } + return nil +} + +func setLabelIfEmpty(n *Node) error { + label, err := n.Label() + if err != nil { + return err + } + if label == "" { + n.SetLabel("\\N") + } + return nil } type ObjectTag int diff --git a/graphviz.go b/graphviz.go index d20371d..0231cef 100644 --- a/graphviz.go +++ b/graphviz.go @@ -4,9 +4,11 @@ import ( "context" "image" "io" + "io/fs" "github.com/goccy/go-graphviz/cgraph" "github.com/goccy/go-graphviz/gvc" + "github.com/goccy/go-graphviz/internal/wasm" ) type Graphviz struct { @@ -133,3 +135,7 @@ func (g *Graphviz) Graph(option ...GraphOption) (*Graph, error) { } return graph, nil } + +func SetFileSystem(fs fs.FS) { + wasm.SetWasmFileSystem(fs) +} diff --git a/graphviz_test.go b/graphviz_test.go index c1de535..cadedc6 100644 --- a/graphviz_test.go +++ b/graphviz_test.go @@ -3,7 +3,10 @@ package graphviz_test import ( "bytes" "context" + "embed" + "io/fs" "os" + "path/filepath" "testing" "github.com/goccy/go-graphviz" @@ -160,6 +163,58 @@ func TestParseFile(t *testing.T) { } } +//go:embed testdata/logo.png +var logoFS embed.FS + +type imageFS struct{} + +func (fs *imageFS) Open(name string) (fs.File, error) { + return logoFS.Open(filepath.Join("testdata", name)) +} + +func TestImageRender(t *testing.T) { + ctx := context.Background() + graphviz.SetFileSystem(new(imageFS)) + + g, err := graphviz.New(ctx) + if err != nil { + t.Fatal(err) + } + graph, err := g.Graph() + if err != nil { + t.Fatalf("%+v", err) + } + defer func() { + graph.Close() + g.Close() + }() + n, err := graph.CreateNodeByName("n") + if err != nil { + t.Fatalf("%+v", err) + } + n.SetLabel("") + + // specify dummy image path. + // Normally, a path to `testdata` would be required before `logo.png`, + // but we confirm that the image can be loaded by appending the path to `testdata` within the `imageFS` specified by graphviz.SetFileSystem function. + // This test is to verify that images can be loaded relative to the specified FileSystem. + n.SetImage("logo.png") + m, err := graph.CreateNodeByName("m") + if err != nil { + t.Fatalf("%+v", err) + } + if _, err := graph.CreateEdgeByName("e", n, m); err != nil { + t.Fatalf("%+v", err) + } + var buf bytes.Buffer + if err := g.Render(ctx, graph, "png", &buf); err != nil { + t.Fatal(err) + } + if len(buf.Bytes()) == 0 { + t.Fatal("failed to render image") + } +} + func TestNodeDegree(t *testing.T) { type test struct { nodeName string diff --git a/gvc/gvc.go b/gvc/gvc.go index 37c11c0..d190f54 100644 --- a/gvc/gvc.go +++ b/gvc/gvc.go @@ -50,9 +50,6 @@ func (c *Context) Close() error { } func (c *Context) Layout(ctx context.Context, g *cgraph.Graph, engine string) error { - if err := c.setupNodeLabelIfEmpty(g); err != nil { - return err - } res, err := c.gvc.Layout(ctx, toGraphWasm(g), engine) if err != nil { return err @@ -114,40 +111,6 @@ func (c *Context) FreeClonedContext(ctx context.Context) error { return c.gvc.FreeClonedContext(ctx) } -func (c *Context) setupNodeLabelIfEmpty(g *cgraph.Graph) error { - n, err := g.FirstNode() - if err != nil { - return err - } - if err := c.setLabelIfEmpty(n); err != nil { - return err - } - for { - n, err = g.NextNode(n) - if err != nil { - return err - } - if n == nil { - break - } - if err := c.setLabelIfEmpty(n); err != nil { - return err - } - } - return nil -} - -func (c *Context) setLabelIfEmpty(n *cgraph.Node) error { - label, err := n.Label() - if err != nil { - return err - } - if label == "" { - n.SetLabel("\\N") - } - return nil -} - func newPlugins(ctx context.Context, plugins ...Plugin) ([]*wasm.SymList, error) { defaults, err := wasm.DefaultSymList(ctx) if err != nil { @@ -190,7 +153,7 @@ func newPlugins(ctx context.Context, plugins ...Plugin) ([]*wasm.SymList, error) if err != nil { return nil, err } - return append(defaults, sym, symTerm), nil + return append(append([]*wasm.SymList{sym}, defaults...), symTerm), nil } func toError(result int) error { diff --git a/gvc/image_plugin.go b/gvc/image_plugin.go new file mode 100644 index 0000000..dab99f9 --- /dev/null +++ b/gvc/image_plugin.go @@ -0,0 +1,94 @@ +package gvc + +import ( + "context" + + "github.com/goccy/go-graphviz/internal/wasm" +) + +type LoadImagePlugin struct { + plugin *wasm.PluginAPI +} + +func (p *LoadImagePlugin) raw() *wasm.PluginAPI { + return p.plugin +} + +type loadImageConfig struct { + Type string + Engine LoadImageEngine +} + +type LoadImageEngine interface { + LoadImage(ctx context.Context, job *Job, shape *UserShape, bf *BoxFloat, filled bool) error +} + +type DefaultLoadImageEngine struct { +} + +func NewLoadImagePlugin(ctx context.Context, typ string, engine LoadImageEngine) (*LoadImagePlugin, error) { + cfg := defaultLoadImagePluginConfig(typ, engine) + return newLoadImagePlugin(ctx, cfg) +} + +func PNGLoadImagePlugin(ctx context.Context, engine LoadImageEngine) (*LoadImagePlugin, error) { + return NewLoadImagePlugin(ctx, "png:png", engine) +} + +func defaultLoadImagePluginConfig(typ string, engine LoadImageEngine) *loadImageConfig { + return &loadImageConfig{ + Type: typ, + Engine: engine, + } +} + +func newLoadImagePlugin(ctx context.Context, cfg *loadImageConfig) (*LoadImagePlugin, error) { + plg, err := wasm.NewPluginAPI(ctx) + if err != nil { + return nil, err + } + if err := plg.SetApi(wasm.API_LOADIMAGE); err != nil { + return nil, err + } + types, err := wasm.NewPluginInstalled(ctx) + if err != nil { + return nil, err + } + if err := types.SetType(cfg.Type); err != nil { + return nil, err + } + if err := types.SetQuality(1); err != nil { + return nil, err + } + engine, err := newLoadImageEngine(ctx, cfg.Engine) + if err != nil { + return nil, err + } + if err := types.SetEngine(engine); err != nil { + return nil, err + } + term, err := wasm.PluginInstalledZero(ctx) + if err != nil { + return nil, err + } + if err := plg.SetTypes([]*wasm.PluginInstalled{types, term}); err != nil { + return nil, err + } + return &LoadImagePlugin{ + plugin: plg, + }, nil +} + +func newLoadImageEngine(ctx context.Context, engine LoadImageEngine) (*wasm.LoadImageEngine, error) { + e, err := wasm.NewLoadImageEngine(ctx) + if err != nil { + return nil, err + } + ptr := wasm.WasmPtr(e) + if err := e.SetLoadImage(ctx, wasm.CreateCallbackFunc(func(ctx context.Context, job *wasm.Job, shape *wasm.UserShape, bf *wasm.BoxFloat, filled bool) error { + return engine.LoadImage(ctx, toJob(job), toUserShape(shape), toBoxFloat(bf), filled) + }, ptr)); err != nil { + return nil, err + } + return e, nil +} diff --git a/gvc/image_renderer.go b/gvc/image_renderer.go index f9e960d..b6a1294 100644 --- a/gvc/image_renderer.go +++ b/gvc/image_renderer.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "fmt" + "image" "image/jpeg" "io" "os" @@ -12,6 +13,7 @@ import ( "github.com/flopp/go-findfont" "github.com/fogleman/gg" + "github.com/goccy/go-graphviz/internal/wasm" "github.com/golang/freetype/truetype" "golang.org/x/image/font" "golang.org/x/image/font/gofont/goregular" @@ -360,6 +362,25 @@ func (r *ImageRenderer) BezierCurve(ctx context.Context, job *Job, a []*PointFlo return nil } +func (r *ImageRenderer) LoadImage(ctx context.Context, job *Job, shape *UserShape, bf *BoxFloat, filled bool) error { + r.ctx.Push() + defer r.ctx.Pop() + + fs := wasm.FileSystem() + f, err := fs.Open(shape.Name()) + if err != nil { + return err + } + var buf bytes.Buffer + io.Copy(&buf, f) + img, _, err := image.Decode(&buf) + if err != nil { + return err + } + r.ctx.DrawImageAnchored(img, int(job.Scale().X()*bf.LL().X()), -int(job.Scale().Y()*bf.LL().Y()), 0, 1) + return nil +} + type FontLoader func(ctx context.Context, job *Job, font *TextFont) (font.Face, error) var ( diff --git a/gvc/init.go b/gvc/init.go index 2a77b23..197f48b 100644 --- a/gvc/init.go +++ b/gvc/init.go @@ -5,47 +5,57 @@ import ( ) func init() { - getEnginePtr := func(job *wasm.Job) uint64 { + getRenderEnginePtr := func(job *wasm.Job) uint64 { return job.GetGvc().GetApi()[wasm.API_RENDER].GetTypeptr().GetEngine().(uint64) } - wasm.Register_RenderEngine_BeginJob(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndJob(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginGraph(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndGraph(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginLayer(func(job *wasm.Job, _ string, _ int, _ int) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndLayer(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginPage(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndPage(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginCluster(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndCluster(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginNodes(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndNodes(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginEdges(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndEdges(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginNode(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndNode(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginEdge(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndEdge(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) + getLoadImageEnginePtr := func(job *wasm.Job) uint64 { + return job.GetGvc().GetApi()[wasm.API_LOADIMAGE].GetTypeptr().GetEngine().(uint64) + } + + wasm.Register_RenderEngine_BeginJob(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndJob(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginGraph(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndGraph(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginLayer(func(job *wasm.Job, _ string, _ int, _ int) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndLayer(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginPage(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndPage(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginCluster(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndCluster(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginNodes(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndNodes(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginEdges(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndEdges(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginNode(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndNode(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginEdge(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndEdge(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) wasm.Register_RenderEngine_BeginAnchor(func(job *wasm.Job, _ string, _ string, _ string, _ string) (uint64, error) { - return getEnginePtr(job), nil + return getRenderEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndAnchor(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_BeginLabel(func(job *wasm.Job, _ wasm.LabelType) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_EndLabel(func(job *wasm.Job) (uint64, error) { return getEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndAnchor(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_BeginLabel(func(job *wasm.Job, _ wasm.LabelType) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_EndLabel(func(job *wasm.Job) (uint64, error) { return getRenderEnginePtr(job), nil }) wasm.Register_RenderEngine_Textspan(func(job *wasm.Job, _ *wasm.PointFloat, _ *wasm.Textspan) (uint64, error) { - return getEnginePtr(job), nil + return getRenderEnginePtr(job), nil }) - wasm.Register_RenderEngine_ResolveColor(func(job *wasm.Job, _ *wasm.Color) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_Ellipse(func(job *wasm.Job, _ []*wasm.PointFloat, _ int) (uint64, error) { return getEnginePtr(job), nil }) + wasm.Register_RenderEngine_ResolveColor(func(job *wasm.Job, _ *wasm.Color) (uint64, error) { return getRenderEnginePtr(job), nil }) + wasm.Register_RenderEngine_Ellipse(func(job *wasm.Job, _ []*wasm.PointFloat, _ int) (uint64, error) { return getRenderEnginePtr(job), nil }) wasm.Register_RenderEngine_Polygon(func(job *wasm.Job, _ []*wasm.PointFloat, _ uint32, _ int) (uint64, error) { - return getEnginePtr(job), nil + return getRenderEnginePtr(job), nil }) wasm.Register_RenderEngine_Beziercurve(func(job *wasm.Job, _ []*wasm.PointFloat, _ uint32, _ int) (uint64, error) { - return getEnginePtr(job), nil + return getRenderEnginePtr(job), nil + }) + wasm.Register_RenderEngine_Polyline(func(job *wasm.Job, _ []*wasm.PointFloat, _ uint32) (uint64, error) { + return getRenderEnginePtr(job), nil }) - wasm.Register_RenderEngine_Polyline(func(job *wasm.Job, _ []*wasm.PointFloat, _ uint32) (uint64, error) { return getEnginePtr(job), nil }) - wasm.Register_RenderEngine_Comment(func(job *wasm.Job, _ string) (uint64, error) { return getEnginePtr(job), nil }) + wasm.Register_RenderEngine_Comment(func(job *wasm.Job, _ string) (uint64, error) { return getRenderEnginePtr(job), nil }) wasm.Register_RenderEngine_LibraryShape(func(job *wasm.Job, _ string, _ []*wasm.PointFloat, _ uint32, _ int) (uint64, error) { - return getEnginePtr(job), nil + return getRenderEnginePtr(job), nil + }) + + wasm.Register_LoadImageEngine_LoadImage(func(job *wasm.Job, shape *wasm.UserShape, bf *wasm.BoxFloat, filled bool) (uint64, error) { + return getLoadImageEnginePtr(job), nil }) } diff --git a/gvc/link.go b/gvc/link.go index 6ecafea..c3d8c57 100644 --- a/gvc/link.go +++ b/gvc/link.go @@ -3,9 +3,16 @@ package gvc import ( _ "unsafe" + "github.com/goccy/go-graphviz/cdt" "github.com/goccy/go-graphviz/cgraph" "github.com/goccy/go-graphviz/internal/wasm" ) //go:linkname toGraphWasm github.com/goccy/go-graphviz/cgraph.toGraphWasm func toGraphWasm(*cgraph.Graph) *wasm.Graph + +//go:linkname toDictLink github.com/goccy/go-graphviz/cdt.toLink +func toDictLink(*wasm.DictLink) *cdt.Link + +//go:linkname toDictLinkWasm github.com/goccy/go-graphviz/cdt.toLinkWasm +func toDictLinkWasm(*cdt.Link) *wasm.DictLink diff --git a/gvc/plugin.go b/gvc/plugin.go index 6527aff..08694ee 100644 --- a/gvc/plugin.go +++ b/gvc/plugin.go @@ -27,10 +27,15 @@ func DefaultPlugins(ctx context.Context) ([]Plugin, error) { if err != nil { return nil, err } + pngLoadImagePlugin, err := PNGLoadImagePlugin(ctx, pngRenderPlugin.RenderEngine()) + if err != nil { + return nil, err + } return []Plugin{ pngRenderPlugin, pngDevicePlugin, jpgRenderPlugin, jpgDevicePlugin, + pngLoadImagePlugin, }, nil } diff --git a/gvc/render_plugin.go b/gvc/render_plugin.go index 6af01f1..e40c88b 100644 --- a/gvc/render_plugin.go +++ b/gvc/render_plugin.go @@ -3,17 +3,23 @@ package gvc import ( "context" + "github.com/goccy/go-graphviz/cdt" "github.com/goccy/go-graphviz/internal/wasm" ) type RenderPlugin struct { plugin *wasm.PluginAPI + engine RenderEngine } func (p *RenderPlugin) raw() *wasm.PluginAPI { return p.plugin } +func (p *RenderPlugin) RenderEngine() RenderEngine { + return p.engine +} + type RenderEngine interface { BeginJob(ctx context.Context, job *Job) error EndJob(ctx context.Context, job *Job) error @@ -45,6 +51,7 @@ type RenderEngine interface { Polyline(ctx context.Context, job *Job, points []*PointFloat) error Comment(ctx context.Context, job *Job, comment string) error LibraryShape(ctx context.Context, job *Job, s string, points []*PointFloat, filled bool) error + LoadImage(ctx context.Context, job *Job, shape *UserShape, box *BoxFloat, filled bool) error } type DefaultRenderEngine struct { @@ -170,6 +177,10 @@ func (e *DefaultRenderEngine) LibraryShape(_ context.Context, _ *Job, _ string, return nil } +func (e *DefaultRenderEngine) LoadImage(_ context.Context, _ *Job, _ *UserShape, _ *BoxFloat, _ bool) error { + return nil +} + type RenderFeature int64 var ( @@ -320,6 +331,7 @@ func newRenderPlugin(ctx context.Context, cfg *renderConfig) (*RenderPlugin, err } return &RenderPlugin{ plugin: plg, + engine: cfg.RenderEngine, }, nil } @@ -527,6 +539,40 @@ func (j *Job) getWasm() *wasm.Job { return j.wasm } +type Point struct { + wasm *wasm.Point +} + +func toPoint(v *wasm.Point) *Point { + if v == nil { + return nil + } + return &Point{wasm: v} +} + +func (p *Point) getWasm() *wasm.Point { + if p == nil { + return nil + } + return p.wasm +} + +func (p *Point) X() int { + return int(p.wasm.GetX()) +} + +func (p *Point) SetX(x int) { + p.wasm.SetX(int64(x)) +} + +func (p *Point) Y() int { + return int(p.wasm.GetY()) +} + +func (p *Point) SetY(y int) { + p.wasm.SetY(int64(y)) +} + type PointFloat struct { wasm *wasm.PointFloat } @@ -1036,3 +1082,220 @@ func (c *Color) Type() ColorType { func (c *Color) SetType(v ColorType) { c.wasm.SetType(wasm.ColorType(v)) } + +type UserShape struct { + wasm *wasm.UserShape +} + +func toUserShape(v *wasm.UserShape) *UserShape { + if v == nil { + return nil + } + return &UserShape{wasm: v} +} + +func (s *UserShape) getWasm() *wasm.UserShape { + if s == nil { + return nil + } + return s.wasm +} + +func (s *UserShape) Link() *cdt.Link { + return toDictLink(s.wasm.GetLink()) +} + +func (s *UserShape) SetLink(v *cdt.Link) { + s.wasm.SetLink(toDictLinkWasm(v)) +} + +func (s *UserShape) Name() string { + return s.wasm.GetName() +} + +func (s *UserShape) SetName(v string) { + s.wasm.SetName(v) +} + +func (s *UserShape) MacroID() int { + return int(s.wasm.GetMacroId()) +} + +func (s *UserShape) SetMacroID(v int) { + s.wasm.SetMacroId(int64(v)) +} + +func (s *UserShape) MustInline() bool { + return s.wasm.GetMustInline() +} + +func (s *UserShape) SetMustInline(v bool) { + s.wasm.SetMustInline(v) +} + +func (s *UserShape) NoCache() bool { + return s.wasm.GetNocache() +} + +func (s *UserShape) SetNoCache(v bool) { + s.wasm.SetNocache(v) +} + +func (s *UserShape) ImageType() ImageType { + return ImageType(s.wasm.GetType()) +} + +func (s *UserShape) SetImageType(v ImageType) { + s.wasm.SetType(wasm.ImageType(v)) +} + +func (s *UserShape) StringType() string { + return s.wasm.GetStringtype() +} + +func (s *UserShape) SetStringType(v string) { + s.wasm.SetStringtype(v) +} + +func (s *UserShape) X() int { + return int(s.wasm.GetX()) +} + +func (s *UserShape) SetX(v int) { + s.wasm.SetX(int64(v)) +} + +func (s *UserShape) Y() int { + return int(s.wasm.GetY()) +} + +func (s *UserShape) SetY(v int) { + s.wasm.SetY(int64(v)) +} + +func (s *UserShape) Width() int { + return int(s.wasm.GetW()) +} + +func (s *UserShape) SetWidth(v int) { + s.wasm.SetW(int64(v)) +} + +func (s *UserShape) Height() int { + return int(s.wasm.GetH()) +} + +func (s *UserShape) SetHeight(v int) { + s.wasm.SetH(int64(v)) +} + +func (s *UserShape) DPI() int { + return int(s.wasm.GetDpi()) +} + +func (s *UserShape) SetDPI(v int) { + s.wasm.SetDpi(int64(v)) +} + +func (s *UserShape) Data() []byte { + return s.wasm.GetData().([]byte) +} + +func (s *UserShape) SetData(v []byte) { + s.wasm.SetData(v) +} + +func (s *UserShape) DataSize() uint { + return uint(s.wasm.GetDatasize()) +} + +func (s *UserShape) SetDataSize(v uint) { + s.wasm.SetDatasize(uint64(v)) +} + +type ImageType int + +var ( + ImageTypeNull ImageType = ImageType(wasm.IMAGE_TYPE_NULL) + ImageTypeBMP ImageType = ImageType(wasm.IMAGE_TYPE_BMP) + ImageTypeGIF ImageType = ImageType(wasm.IMAGE_TYPE_GIF) + ImageTypePNG ImageType = ImageType(wasm.IMAGE_TYPE_PNG) + ImageTypeJPEG ImageType = ImageType(wasm.IMAGE_TYPE_JPEG) + ImageTypePDF ImageType = ImageType(wasm.IMAGE_TYPE_PDF) + ImageTypePS ImageType = ImageType(wasm.IMAGE_TYPE_PS) + ImageTypeEPS ImageType = ImageType(wasm.IMAGE_TYPE_EPS) + ImageTypeSVG ImageType = ImageType(wasm.IMAGE_TYPE_SVG) + ImageTypeXML ImageType = ImageType(wasm.IMAGE_TYPE_XML) + ImageTypeRIFF ImageType = ImageType(wasm.IMAGE_TYPE_RIFF) + ImageTypeWEBP ImageType = ImageType(wasm.IMAGE_TYPE_WEBP) + ImageTypeICO ImageType = ImageType(wasm.IMAGE_TYPE_ICO) + ImageTypeTIFF ImageType = ImageType(wasm.IMAGE_TYPE_TIFF) +) + +type Box struct { + wasm *wasm.Box +} + +func toBox(v *wasm.Box) *Box { + if v == nil { + return nil + } + return &Box{wasm: v} +} + +func (b *Box) getWasm() *wasm.Box { + if b == nil { + return nil + } + return b.wasm +} + +func (b *Box) LL() *Point { + return toPoint(b.wasm.GetLl()) +} + +func (b *Box) SetLL(v *Point) { + b.wasm.SetLl(v.getWasm()) +} + +func (b *Box) UR() *Point { + return toPoint(b.wasm.GetUr()) +} + +func (b *Box) SetUR(v *Point) { + b.wasm.SetUr(v.getWasm()) +} + +type BoxFloat struct { + wasm *wasm.BoxFloat +} + +func toBoxFloat(v *wasm.BoxFloat) *BoxFloat { + if v == nil { + return nil + } + return &BoxFloat{wasm: v} +} + +func (f *BoxFloat) getWasm() *wasm.BoxFloat { + if f == nil { + return nil + } + return f.wasm +} + +func (f *BoxFloat) LL() *PointFloat { + return toPointFloat(f.wasm.GetLl()) +} + +func (f *BoxFloat) SetLL(v *PointFloat) { + f.wasm.SetLl(v.getWasm()) +} + +func (f *BoxFloat) UR() *PointFloat { + return toPointFloat(f.wasm.GetUr()) +} + +func (f *BoxFloat) SetUR(v *PointFloat) { + f.wasm.SetUr(v.getWasm()) +} diff --git a/internal/tools/nori/templates/bind.go.tmpl b/internal/tools/nori/templates/bind.go.tmpl index 651f011..27e6375 100644 --- a/internal/tools/nori/templates/bind.go.tmpl +++ b/internal/tools/nori/templates/bind.go.tmpl @@ -6,6 +6,7 @@ import ( "context" _ "embed" "fmt" + "io/fs" "os" "path/filepath" "unsafe" @@ -24,10 +25,22 @@ var wasmFile []byte type WasmModule struct { mod api.Module + fs *WasmFileSystem lookupFuncMap *LookupFuncMap callbackFuncMap *CallbackFuncMap } +type WasmFileSystem struct { + subFS fs.FS +} + +func (fs *WasmFileSystem) Open(name string) (fs.File, error) { + if fs.subFS != nil { + return fs.subFS.Open(name) + } + return os.Open(name) +} + type LookupFuncMap struct { {{- range .ExportCallbackFunctions }} {{ .Name }} func({{- range .Args }}{{ .Value.GoType }},{{- end }}) (uint64, error) @@ -130,15 +143,12 @@ func init() { if err != nil { panic(err) } - dir, err := os.MkdirTemp("", "graphviz") - if err != nil { - panic(err) - } + fs := &WasmFileSystem{} m, err := r.InstantiateModule( ctx, compiled, wazero.NewModuleConfig(). - WithFSConfig(wazero.NewFSConfig().WithDirMount(dir, "/")). + WithFSConfig(wazero.NewFSConfig().WithFSMount(fs, "/")). WithStdout(os.Stdout). WithName("wasi"), ) @@ -147,6 +157,7 @@ func init() { } mod = &WasmModule{ mod: m, + fs: fs, lookupFuncMap: &LookupFuncMap{}, callbackFuncMap: &CallbackFuncMap{ {{- range .ExportCallbackFunctions }} diff --git a/internal/wasm/bind.go b/internal/wasm/bind.go index 3ee5ba2..216acb1 100644 --- a/internal/wasm/bind.go +++ b/internal/wasm/bind.go @@ -6,6 +6,7 @@ import ( "context" _ "embed" "fmt" + "io/fs" "os" "path/filepath" "reflect" @@ -24,10 +25,22 @@ var wasmFile []byte type WasmModule struct { mod api.Module + fs *WasmFileSystem lookupFuncMap *LookupFuncMap callbackFuncMap *CallbackFuncMap } +type WasmFileSystem struct { + subFS fs.FS +} + +func (fs *WasmFileSystem) Open(name string) (fs.File, error) { + if fs.subFS != nil { + return fs.subFS.Open(name) + } + return os.Open(name) +} + type LookupFuncMap struct { IDAllocator_Open func(*Graph, *ClientDiscipline) (uint64, error) IDAllocator_Map func(any, int, string, *uint64, int) (uint64, error) @@ -2784,15 +2797,12 @@ func init() { if err != nil { panic(err) } - dir, err := os.MkdirTemp("", "graphviz") - if err != nil { - panic(err) - } + fs := &WasmFileSystem{} m, err := r.InstantiateModule( ctx, compiled, wazero.NewModuleConfig(). - WithFSConfig(wazero.NewFSConfig().WithDirMount(dir, "/")). + WithFSConfig(wazero.NewFSConfig().WithFSMount(fs, "/")). WithStdout(os.Stdout). WithName("wasi"), ) @@ -2801,6 +2811,7 @@ func init() { } mod = &WasmModule{ mod: m, + fs: fs, lookupFuncMap: &LookupFuncMap{}, callbackFuncMap: &CallbackFuncMap{ IDAllocator_Open: make(map[uint64]func(context.Context, *Graph, *ClientDiscipline) (any, error)), diff --git a/internal/wasm/bind.proto b/internal/wasm/bind.proto index b9534a8..5f72dab 100644 --- a/internal/wasm/bind.proto +++ b/internal/wasm/bind.proto @@ -1639,12 +1639,12 @@ message Context { repeated PluginAvailable apis = 5 [(nori.field).type = { pointer: 1 array: true - array_num: 4 + array_num: 5 }]; repeated PluginAvailable api = 6 [(nori.field).type = { pointer: 1 array: true - array_num: 4 + array_num: 5 }]; } diff --git a/internal/wasm/build/bind.c b/internal/wasm/build/bind.c index 50299bd..17aa686 100644 --- a/internal/wasm/build/bind.c +++ b/internal/wasm/build/bind.c @@ -2473,7 +2473,7 @@ void wasm_bridge_set_Context_input_filenames(GVC_t *recv, GoSlice * v) { } void wasm_bridge_get_Context_apis(GVC_t *recv, GoSlice ** ret) {GoSlice *v = (GoSlice *)malloc(sizeof(GoSlice)); - int v_length = 4; + int v_length = 5; v->len = v_length; void **v_data = (void **)malloc(8 * v_length); v->data = v_data; @@ -2493,7 +2493,7 @@ void wasm_bridge_set_Context_apis(GVC_t *recv, GoSlice * v) { } void wasm_bridge_get_Context_api(GVC_t *recv, GoSlice ** ret) {GoSlice *v = (GoSlice *)malloc(sizeof(GoSlice)); - int v_length = 4; + int v_length = 5; v->len = v_length; void **v_data = (void **)malloc(8 * v_length); v->data = v_data; diff --git a/internal/wasm/ext.go b/internal/wasm/ext.go index 0bb64fc..9505f7f 100644 --- a/internal/wasm/ext.go +++ b/internal/wasm/ext.go @@ -2,6 +2,8 @@ package wasm import ( "context" + "io/fs" + "sync" ) func DefaultSymList(ctx context.Context) ([]*SymList, error) { @@ -68,35 +70,18 @@ func SymListZero(ctx context.Context) (*SymList, error) { return newSymList(ptr), nil } -type RenderEngineInterface interface { - BeginJob(context.Context, *Job) error - EndJob(context.Context, *Job) error - BeginGraph(context.Context, *Job) error - EndGraph(context.Context, *Job) error - BeginLayer(context.Context, *Job, string, int, int) error - EndLayer(context.Context, *Job) error - BeginPage(context.Context, *Job) error - EndPage(context.Context, *Job) error - BeginCluster(context.Context, *Job) error - EndCluster(context.Context, *Job) error - BeginNodes(context.Context, *Job) error - EndNodes(context.Context, *Job) error - BeginEdges(context.Context, *Job) error - EndEdges(context.Context, *Job) error - BeginNode(context.Context, *Job) error - EndNode(context.Context, *Job) error - BeginEdge(context.Context, *Job) error - EndEdge(context.Context, *Job) error - BeginAnchor(context.Context, *Job, string, string, string, string) error - EndAnchor(context.Context, *Job) error - BeginLabel(context.Context, *Job, LabelType) error - EndLabel(context.Context, *Job) error - Textspan(context.Context, *Job, *PointFloat, *Textspan) error - ResolveColor(context.Context, *Job, *Color) error - Ellipse(context.Context, *Job, []*PointFloat, int) error - Polygon(context.Context, *Job, []*PointFloat, int) error - Beziercurve(context.Context, *Job, []*PointFloat, int, int) error - Polyline(context.Context, *Job, []*PointFloat) error - Comment(context.Context, *Job, string) error - LibraryShape(context.Context, *Job, string, *PointFloat, int, int) error +var ( + fsMu sync.Mutex +) + +func SetWasmFileSystem(fs fs.FS) { + fsMu.Lock() + mod.fs.subFS = fs + fsMu.Unlock() +} + +func FileSystem() fs.FS { + fsMu.Lock() + defer fsMu.Unlock() + return mod.fs } diff --git a/internal/wasm/graphviz.wasm b/internal/wasm/graphviz.wasm index 6c10eb8d4945aeb6b9d6b61eb504988fe79d3a42..5476b24098b98addacc26cfde4e1b8f6abae5aa8 100755 GIT binary patch delta 161 zcmezKFZ$EJ=!PwffrgA{+Jg)kftU%1nSq!Eh*^P{4T#x+m}7g8A!o2A?XqBxCN zofyoSRN7xeaRMpo3$tW=0 rk4Zpw`a(_tSBU60P5~`Ofp$eM5EcYtAs`k8Vi6z~-LA+b7Wfqac?>hP From 3299cdaaa8bf6f96cb0e538d643d873a1e916bef Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Wed, 23 Oct 2024 12:13:43 +0900 Subject: [PATCH 2/3] support fixedsize attr --- cgraph/attribute.go | 32 +++++++++++++++++++++++++++----- cgraph/cgraph.go | 21 ++++++++++----------- cmd/dot/go.mod | 1 + cmd/dot/go.sum | 4 ++++ go.mod | 1 + go.sum | 4 ++++ gvc/image_renderer.go | 31 ++++++++++++++++++++++++++++++- gvc/link.go | 9 +++++++++ gvc/render_plugin.go | 30 ++++++++++++++++++++++++++++++ 9 files changed, 116 insertions(+), 17 deletions(-) diff --git a/cgraph/attribute.go b/cgraph/attribute.go index 753b0bb..2b66b2d 100644 --- a/cgraph/attribute.go +++ b/cgraph/attribute.go @@ -698,6 +698,10 @@ func (n *Node) SetFillColor(v string) *Node { return n } +func (n *Node) FixedSize() bool { + return n.GetStr(string(fixedSizeAttr)) == toBoolString(true) +} + // SetFixedSize // If false, the size of a node is determined by smallest width and height needed to contain its label and image, // if any, with a margin specified by the margin attribute. @@ -1045,14 +1049,32 @@ func (n *Node) SetImagePos(v ImagePos) *Node { return n } +type ImageScale string + +const ( + ImageScaleDefault ImageScale = "false" + ImageScaleTrue ImageScale = "true" + ImageScaleWidth ImageScale = "width" + ImageScaleHeight ImageScale = "height" + ImageScaleBoth ImageScale = "both" +) + +func (n *Node) ImageScale() ImageScale { + v := n.GetStr(string(imageScaleAttr)) + if v == "" { + return ImageScaleDefault + } + return ImageScale(v) +} + // SetImageScale // Attribute controlling how an image fills its containing node. In general, the image is given its natural size, (cf. dpi), and the node size is made large enough to contain its image, its label, its margin, and its peripheries. Its width and height will also be at least as large as its minimum width and height. If, however, fixedsize=true, the width and height attributes specify the exact size of the node. // During rendering, in the default case (imagescale=false), the image retains its natural size. If imagescale=true, the image is uniformly scaled (i.e., its aspect ratio is preserved) to fit inside the node. At least one dimension of the image will be as large as possible given the size of the node. When imagescale=width, the width of the image is scaled to fill the node width. The corresponding property holds when imagescale=height. When imagescale=both, both the height and the width are scaled separately to fill the node. // // In all cases, if a dimension of the image is larger than the corresponding dimension of the node, that dimension of the image is scaled down to fit the node. As with the case of expansion, if imagescale=true, width and height are scaled uniformly. // https://graphviz.gitlab.io/_pages/doc/info/attrs.html#a:imagescale -func (n *Node) SetImageScale(v bool) *Node { - n.SafeSet(string(imageScaleAttr), toBoolString(v), falseStr) +func (n *Node) SetImageScale(v ImageScale) *Node { + n.SafeSet(string(imageScaleAttr), string(v), string(ImageScaleDefault)) return n } @@ -1072,7 +1094,7 @@ func (g *Graph) SetInputScale(v float64) *Graph { } // Label returns label attribute. -func (g *Graph) Label() (string, error) { +func (g *Graph) Label() string { return g.GetStr(string(labelAttr)) } @@ -1090,7 +1112,7 @@ func (g *Graph) SetLabel(v string) *Graph { } // Label returns label attribute. -func (n *Node) Label() (string, error) { +func (n *Node) Label() string { return n.GetStr(string(labelAttr)) } @@ -1108,7 +1130,7 @@ func (n *Node) SetLabel(v string) *Node { } // Label returns label attribute. -func (e *Edge) Label() (string, error) { +func (e *Edge) Label() string { return e.GetStr(string(labelAttr)) } diff --git a/cgraph/cgraph.go b/cgraph/cgraph.go index b7b3146..591cb80 100644 --- a/cgraph/cgraph.go +++ b/cgraph/cgraph.go @@ -355,11 +355,7 @@ func setupNodeLabelIfEmpty(g *Graph) error { } func setLabelIfEmpty(n *Node) error { - label, err := n.Label() - if err != nil { - return err - } - if label == "" { + if n.Label() == "" { n.SetLabel("\\N") } return nil @@ -822,8 +818,9 @@ func (g *Graph) DeleteRecord(name string) error { return toError(res) } -func (g *Graph) GetStr(name string) (string, error) { - return wasm.GetStr(context.Background(), g.wasm, name) +func (g *Graph) GetStr(name string) string { + v, _ := wasm.GetStr(context.Background(), g.wasm, name) + return v } func (g *Graph) SymbolName(sym *Symbol) (string, error) { @@ -1281,8 +1278,9 @@ func (n *Node) DeleteRecord(name string) error { return toError(res) } -func (n *Node) GetStr(name string) (string, error) { - return wasm.GetStr(context.Background(), n.wasm, name) +func (n *Node) GetStr(name string) string { + v, _ := wasm.GetStr(context.Background(), n.wasm, name) + return v } func (n *Node) SymbolName(sym *Symbol) (string, error) { @@ -1364,8 +1362,9 @@ func (e *Edge) DeleteRecord(name string) error { return toError(res) } -func (e *Edge) GetStr(name string) (string, error) { - return wasm.GetStr(context.Background(), e.wasm, name) +func (e *Edge) GetStr(name string) string { + v, _ := wasm.GetStr(context.Background(), e.wasm, name) + return v } func (e *Edge) SymbolName(sym *Symbol) (string, error) { diff --git a/cmd/dot/go.mod b/cmd/dot/go.mod index c9f1d80..0456c89 100644 --- a/cmd/dot/go.mod +++ b/cmd/dot/go.mod @@ -11,6 +11,7 @@ require ( ) require ( + github.com/disintegration/imaging v1.6.2 // indirect github.com/flopp/go-findfont v0.1.0 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect diff --git a/cmd/dot/go.sum b/cmd/dot/go.sum index f6bda59..0d3b200 100644 --- a/cmd/dot/go.sum +++ b/cmd/dot/go.sum @@ -1,5 +1,7 @@ github.com/corona10/goimagehash v1.1.0 h1:teNMX/1e+Wn/AYSbLHX8mj+mF9r60R1kBeqE9MkoYwI= github.com/corona10/goimagehash v1.1.0/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/flopp/go-findfont v0.1.0 h1:lPn0BymDUtJo+ZkV01VS3661HL6F4qFlkhcJN55u6mU= github.com/flopp/go-findfont v0.1.0/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= @@ -12,11 +14,13 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= diff --git a/go.mod b/go.mod index a07c4bc..a6d9602 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.22.0 require ( github.com/corona10/goimagehash v1.1.0 + github.com/disintegration/imaging v1.6.2 github.com/flopp/go-findfont v0.1.0 github.com/fogleman/gg v1.3.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 diff --git a/go.sum b/go.sum index f7a2665..893f7a7 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/corona10/goimagehash v1.1.0 h1:teNMX/1e+Wn/AYSbLHX8mj+mF9r60R1kBeqE9MkoYwI= github.com/corona10/goimagehash v1.1.0/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/flopp/go-findfont v0.1.0 h1:lPn0BymDUtJo+ZkV01VS3661HL6F4qFlkhcJN55u6mU= github.com/flopp/go-findfont v0.1.0/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= @@ -10,7 +12,9 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= diff --git a/gvc/image_renderer.go b/gvc/image_renderer.go index b6a1294..2a88f77 100644 --- a/gvc/image_renderer.go +++ b/gvc/image_renderer.go @@ -11,6 +11,7 @@ import ( "strings" "sync" + "github.com/disintegration/imaging" "github.com/flopp/go-findfont" "github.com/fogleman/gg" "github.com/goccy/go-graphviz/internal/wasm" @@ -19,6 +20,8 @@ import ( "golang.org/x/image/font/gofont/goregular" "golang.org/x/image/font/opentype" "golang.org/x/image/font/sfnt" + + "github.com/goccy/go-graphviz/cgraph" ) var ( @@ -362,6 +365,12 @@ func (r *ImageRenderer) BezierCurve(ctx context.Context, job *Job, a []*PointFlo return nil } +const ( + defaultGAP = 4 + defaultXPAD = 4 * defaultGAP + defaultYPAD = 2 * defaultGAP +) + func (r *ImageRenderer) LoadImage(ctx context.Context, job *Job, shape *UserShape, bf *BoxFloat, filled bool) error { r.ctx.Push() defer r.ctx.Pop() @@ -377,7 +386,27 @@ func (r *ImageRenderer) LoadImage(ctx context.Context, job *Job, shape *UserShap if err != nil { return err } - r.ctx.DrawImageAnchored(img, int(job.Scale().X()*bf.LL().X()), -int(job.Scale().Y()*bf.LL().Y()), 0, 1) + topLeftX := bf.LL().X() + topLeftY := bf.LL().Y() + node := job.Object().Node() + if node != nil { + if node.FixedSize() || node.ImageScale() != cgraph.ImageScaleDefault { + bottomRightX := bf.UR().X() + bottomRightY := bf.UR().Y() + width := bottomRightX - topLeftX + height := bottomRightY - topLeftY + img = imaging.Resize(img, int(width), int(height), imaging.Lanczos) + xPAD := defaultXPAD / 2.0 + yPAD := defaultYPAD / 2.0 + posX := (topLeftX + xPAD) * job.Scale().X() + posY := (topLeftY + yPAD) * job.Scale().Y() + r.ctx.DrawImageAnchored(img, int(posX), -int(posY), 0, 1) + return nil + } + } + posX := topLeftX * job.Scale().X() + posY := topLeftY * job.Scale().Y() + r.ctx.DrawImageAnchored(img, int(posX), -int(posY), 0, 1) return nil } diff --git a/gvc/link.go b/gvc/link.go index c3d8c57..6b7fcf9 100644 --- a/gvc/link.go +++ b/gvc/link.go @@ -8,9 +8,18 @@ import ( "github.com/goccy/go-graphviz/internal/wasm" ) +//go:linkname toGraph github.com/goccy/go-graphviz/cgraph.toGraph +func toGraph(*wasm.Graph) *cgraph.Graph + //go:linkname toGraphWasm github.com/goccy/go-graphviz/cgraph.toGraphWasm func toGraphWasm(*cgraph.Graph) *wasm.Graph +//go:linkname toNode github.com/goccy/go-graphviz/cgraph.toNode +func toNode(*wasm.Node) *cgraph.Node + +//go:linkname toEdge github.com/goccy/go-graphviz/cgraph.toEdge +func toEdge(*wasm.Edge) *cgraph.Edge + //go:linkname toDictLink github.com/goccy/go-graphviz/cdt.toLink func toDictLink(*wasm.DictLink) *cdt.Link diff --git a/gvc/render_plugin.go b/gvc/render_plugin.go index e40c88b..9432140 100644 --- a/gvc/render_plugin.go +++ b/gvc/render_plugin.go @@ -4,6 +4,7 @@ import ( "context" "github.com/goccy/go-graphviz/cdt" + "github.com/goccy/go-graphviz/cgraph" "github.com/goccy/go-graphviz/internal/wasm" ) @@ -1005,6 +1006,35 @@ func (s *ObjectState) RawStyle() []string { return s.wasm.GetRawstyle() } +func (s *ObjectState) Type() ObjectType { + return ObjectType(s.wasm.GetType()) +} + +func (s *ObjectState) SetType(v ObjectType) { + s.wasm.SetType(wasm.ObjectType(v)) +} + +func (s *ObjectState) Graph() *cgraph.Graph { + return toGraph(s.wasm.GetG()) +} + +func (s *ObjectState) Node() *cgraph.Node { + return toNode(s.wasm.GetN()) +} + +func (s *ObjectState) Edge() *cgraph.Edge { + return toEdge(s.wasm.GetE()) +} + +type ObjectType int + +var ( + RootGraphObjectType ObjectType = ObjectType(wasm.ROOTGRAPH_OBJTYPE) + ClusterObjectType ObjectType = ObjectType(wasm.CLUSTER_OBJTYPE) + NodeObjectType ObjectType = ObjectType(wasm.NODE_OBJTYPE) + EdgeObjectType ObjectType = ObjectType(wasm.EDGE_OBJTYPE) +) + type Color struct { wasm *wasm.Color } From 4225aa6fb7c1ee614f0933e1fa5485dadfa2c7c9 Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Wed, 23 Oct 2024 12:19:37 +0900 Subject: [PATCH 3/3] add logo.png --- testdata/.gitignore | 3 +++ testdata/logo.png | Bin 0 -> 93756 bytes 2 files changed, 3 insertions(+) create mode 100644 testdata/.gitignore create mode 100644 testdata/logo.png diff --git a/testdata/.gitignore b/testdata/.gitignore new file mode 100644 index 0000000..6ebe739 --- /dev/null +++ b/testdata/.gitignore @@ -0,0 +1,3 @@ +!*.svg +!*.png +!*.jpg diff --git a/testdata/logo.png b/testdata/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7358fe08d93080d394a7bee28462a7c247aed9ce GIT binary patch literal 93756 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
*(?4c-cgp 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 literal 0 HcmV?d00001