From e4e4dd3802c3b78eb694845c065fdd5188020f3f Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Fri, 18 Oct 2024 17:19:36 +0900 Subject: [PATCH] Support filled beziercurve rendering (#92) * support filled beziercurve rendering * fix testdata * fix threshold --- alias.go | 2 +- cgraph/attribute.go | 2 +- compatible_test.go | 8 ++++---- gvc/image_renderer.go | 17 ++++++++++++++--- gvc/render_plugin.go | 16 ++++++++++++---- testdata/imagehash.json | 2 +- 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/alias.go b/alias.go index ae33c83..81dbc5e 100644 --- a/alias.go +++ b/alias.go @@ -314,7 +314,7 @@ const ( DiagonalsNodeStyle = cgraph.DiagonalsNodeStyle FilledNodeStyle = cgraph.FilledNodeStyle StripedNodeStyle = cgraph.StripedNodeStyle - WedgesNodeStyle = cgraph.WedgesNodeStyle + WedgedNodeStyle = cgraph.WedgedNodeStyle ) const ( diff --git a/cgraph/attribute.go b/cgraph/attribute.go index 005b5b8..690a976 100644 --- a/cgraph/attribute.go +++ b/cgraph/attribute.go @@ -2523,7 +2523,7 @@ const ( DiagonalsNodeStyle NodeStyle = "diagonals" FilledNodeStyle NodeStyle = "filled" StripedNodeStyle NodeStyle = "striped" - WedgesNodeStyle NodeStyle = "wedged" + WedgedNodeStyle NodeStyle = "wedged" ) type EdgeStyle string diff --git a/compatible_test.go b/compatible_test.go index 04c1a2a..4a5ed22 100644 --- a/compatible_test.go +++ b/compatible_test.go @@ -25,7 +25,7 @@ var ( ) const ( - imageThreshold = 30 + imageThreshold = 40 ) func generateTestData() error { @@ -73,9 +73,9 @@ func generateTestData() error { func TestGraphviz_Compatible(t *testing.T) { // generate testdata/imagehash.json - // if err := generateTestData(); err != nil { - // t.Fatal(err) - // } + //if err := generateTestData(); err != nil { + // t.Fatal(err) + //} var pathToHashDump map[string]string file, err := os.ReadFile(imageHashJSON) if err != nil { diff --git a/gvc/image_renderer.go b/gvc/image_renderer.go index 4f10509..3a3c881 100644 --- a/gvc/image_renderer.go +++ b/gvc/image_renderer.go @@ -195,11 +195,18 @@ func (r *ImageRenderer) Polyline(ctx context.Context, job *Job, a []*PointFloat) return nil } -func (r *ImageRenderer) BezierCurve(ctx context.Context, job *Job, a []*PointFloat) error { +func (r *ImageRenderer) BezierCurve(ctx context.Context, job *Job, a []*PointFloat, filled bool) error { r.ctx.Push() defer r.ctx.Pop() r.setPenStyle(job) - rgba := job.Object().PenColor().RGBAUint() + var c *Color + if filled { + c = job.Object().FillColor() + r.ctx.FillPreserve() + } else { + c = job.Object().PenColor() + } + rgba := c.RGBAUint() r.ctx.SetRGB(float64(rgba[0])/255.0, float64(rgba[1])/255.0, float64(rgba[2])/255.0) r.ctx.MoveTo(r.toX(job, a[0].X()), r.toY(job, -a[0].Y())) for i := 1; i < len(a); i += 3 { @@ -212,7 +219,11 @@ func (r *ImageRenderer) BezierCurve(ctx context.Context, job *Job, a []*PointFlo r.toY(job, -a[i+2].Y()), ) } - r.ctx.Stroke() + if filled { + r.ctx.Fill() + } else { + r.ctx.Stroke() + } return nil } diff --git a/gvc/render_plugin.go b/gvc/render_plugin.go index b0bf0ec..9bf4b21 100644 --- a/gvc/render_plugin.go +++ b/gvc/render_plugin.go @@ -41,7 +41,7 @@ type RenderEngine interface { ResolveColor(ctx context.Context, job *Job, color *Color) error Ellipse(ctx context.Context, job *Job, points []*PointFloat, filled bool) error Polygon(ctx context.Context, job *Job, points []*PointFloat, filled bool) error - BezierCurve(ctx context.Context, job *Job, points []*PointFloat) error + BezierCurve(ctx context.Context, job *Job, points []*PointFloat, filled bool) error 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 @@ -154,7 +154,7 @@ func (e *DefaultRenderEngine) Polygon(_ context.Context, _ *Job, _ []*PointFloat return nil } -func (e *DefaultRenderEngine) BezierCurve(_ context.Context, _ *Job, _ []*PointFloat) error { +func (e *DefaultRenderEngine) BezierCurve(_ context.Context, _ *Job, _ []*PointFloat, _ bool) error { return nil } @@ -471,12 +471,12 @@ func newRenderEngine(ctx context.Context, engine RenderEngine) (*wasm.RenderEngi }, ptr)); err != nil { return nil, err } - if err := e.SetBeziercurve(ctx, wasm.CreateCallbackFunc(func(ctx context.Context, job *wasm.Job, p []*wasm.PointFloat, _ uint32, _ int) error { + if err := e.SetBeziercurve(ctx, wasm.CreateCallbackFunc(func(ctx context.Context, job *wasm.Job, p []*wasm.PointFloat, _ uint32, filled int) error { points := make([]*PointFloat, len(p)) for i := range p { points[i] = toPointFloat(p[i]) } - return engine.BezierCurve(ctx, toJob(job), points) + return engine.BezierCurve(ctx, toJob(job), points, filled > 0) }, ptr)); err != nil { return nil, err } @@ -939,6 +939,14 @@ func (s *ObjectState) SetFillColor(v *Color) { s.wasm.SetFillcolor(v.getWasm()) } +func (s *ObjectState) StopColor() *Color { + return toColor(s.wasm.GetStopcolor()) +} + +func (s *ObjectState) RawStyle() []string { + return s.wasm.GetRawstyle() +} + type Color struct { wasm *wasm.Color } diff --git a/testdata/imagehash.json b/testdata/imagehash.json index 0a12fd9..2373bad 100644 --- a/testdata/imagehash.json +++ b/testdata/imagehash.json @@ -1 +1 @@ -{"testdata/directed/KW91.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4ByYqKSwkJgcBBgA=","testdata/directed/Latin1.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DnHIDyvgcQ4BBgA=","testdata/directed/NaN.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAAX/ggIGAA==","testdata/directed/abstract.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4EhZPHUnJTQgBBgA=","testdata/directed/alf.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4OBgWNxELBwYBBgA=","testdata/directed/arrows.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4clJyUlJyUlIBBgA=","testdata/directed/awilliams.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4AgIADBg4XFwBBgA=","testdata/directed/biological.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH42NlZOSkpEhIBBgA=","testdata/directed/clust.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4OiYnFxZXVVUBBgA=","testdata/directed/clust1.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4B4uXlaU3lZcBBgA=","testdata/directed/clust2.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4Hj6jqqqqKgMBBgA=","testdata/directed/clust3.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DjNxcTFhMzMBBgA=","testdata/directed/clust4.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4D1Nzc3FzUw8BBgA=","testdata/directed/clust5.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4BAcnJxNTCQMBBgA=","testdata/directed/crazy.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DyEx0RsbQw4BBgA=","testdata/directed/ctext.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4bGxsVhYXVRUBBgA=","testdata/directed/dfa.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4Dg4OMjIODg4BBgA=","testdata/directed/fig6.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4ShsXGRuZuW4BBgA=","testdata/directed/fsm.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4GBgYHgTDWxkBBgA=","testdata/directed/grammar.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4GxulJyeVAQIBBgA=","testdata/directed/hashtable.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4HBAYnJgQGJwBBgA=","testdata/directed/honda-tokoro.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4JzPUUklbe2ABBgA=","testdata/directed/japanese.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4HA9JLQcnJw8BBgA=","testdata/directed/jcctree.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4GCwmZ2dtbWUBBgA=","testdata/directed/jsort.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4AwsNVTM3JVEBBgA=","testdata/directed/ldbxtried.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4HxYbLw8HH44BBgA=","testdata/directed/longflat.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4AwQBAWExxTMBBgA=","testdata/directed/mike.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4ASE1xmdmLjwBBgA=","testdata/directed/nhg.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4ExM4bi54HwcBBgA=","testdata/directed/oldarrows.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4Ux8PDw8PB1EBBgA=","testdata/directed/pgram.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4zGwpmqvg4OABBgA=","testdata/directed/pm2way.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4GBgeJgwNBgYBBgA=","testdata/directed/pmpipe.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4BgcLGw8NS08BBgA=","testdata/directed/polypoly.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4LiwsJm5MECsBBgA=","testdata/directed/proc3d.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAAX/ggIGAA==","testdata/directed/psfonttest.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4FlXV1RUVVVUBBgA=","testdata/directed/record2.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4KhgeBpoOmh4BBgA=","testdata/directed/records.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA7/ggH5CUtlfA5ODgEGAA==","testdata/directed/rowe.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4BpI0ZkWmtDEBBgA=","testdata/directed/russian.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4U1tTUtJSEhIBBgA=","testdata/directed/sdh.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4i5uamLSkxEoBBgA=","testdata/directed/shells.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4x42T5aStj80BBgA=","testdata/directed/states.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4BwcFGREozugBBgA=","testdata/directed/structs.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4HCwsbMRGSgABBgA=","testdata/directed/switch.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4O3UbUWslG3MBBgA=","testdata/directed/table.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DAwOJmbn5sYBBgA=","testdata/directed/train11.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA7/ggH5AQMHCB7kgwEGAA==","testdata/directed/trapeziumlr.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4YHExDw8xcWABBgA=","testdata/directed/tree.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4BgcTEzEyMLgBBgA=","testdata/directed/triedds.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4OCZkLgYWFhYBBgA=","testdata/directed/try.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4jY1LTYwPLSsBBgA=","testdata/directed/unix.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DhszFdHbWwsBBgA=","testdata/directed/unix2.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4DhsxldNbSwsBBgA=","testdata/directed/viewfile.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4HLb2c8fJyRkBBgA=","testdata/directed/world.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4MjUXHYWVNScBBgA=","testdata/undirected/ER.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4AQMDBxcHFRcBBgA=","testdata/undirected/Heawood.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4CYiUU1ZWFgcBBgA=","testdata/undirected/Petersen.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4TG2rKjrKxkEBBgA=","testdata/undirected/ngk10_4.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4gCosKiI4WCABBgA=","testdata/undirected/process.gv":"If+BAwEBAUQB/4IAAQIBBEhhc2gBBgABBEtpbmQBBAAAAA//ggH4PWdLQgIDAwMBBgA="} \ No newline at end of file +{"testdata/directed/KW91.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgHJiooLCYmBwEGAA==","testdata/directed/Latin1.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgOccAPK9BxDgEGAA==","testdata/directed/NaN.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgBARFlIZiYGQEGAA==","testdata/directed/abstract.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgSFksZSUlNDAEGAA==","testdata/directed/alf.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfg4GBY2GwsHBgEGAA==","testdata/directed/arrows.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfhSUlJSUnFSUgEGAA==","testdata/directed/awilliams.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgCAgIMCBhcXAEGAA==","testdata/directed/biological.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfjY2dkxKSkSEgEGAA==","testdata/directed/clust.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfg6JicXFldVVQEGAA==","testdata/directed/clust1.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgGipaUpDSWlAEGAA==","testdata/directed/clust2.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgeHqOqqqoqAwEGAA==","testdata/directed/clust3.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgOMnBwMmAyMgEGAA==","testdata/directed/clust4.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgOU3NRcXNTDgEGAA==","testdata/directed/clust5.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgGBycnU1ELAwEGAA==","testdata/directed/crazy.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgPITHRGxtDDgEGAA==","testdata/directed/ctext.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfh8bGx2FhZVFQEGAA==","testdata/directed/dfa.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgPDw8zMw4ODgEGAA==","testdata/directed/fig6.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfhKGxcdG5m5bgEGAA==","testdata/directed/fsm.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgYGBoeBMNbGQEGAA==","testdata/directed/grammar.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgaGiQmJpQAAgEGAA==","testdata/directed/hashtable.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgcERmcmVEdnAEGAA==","testdata/directed/honda-tokoro.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgnM9RCSVt5QAEGAA==","testdata/directed/japanese.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgcDkhMBiYmDgEGAA==","testdata/directed/jcctree.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgYLCZmZmxkZAEGAA==","testdata/directed/jsort.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgDCw1RMzclUQEGAA==","testdata/directed/ldbxtried.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgeFhsvDycfjgEGAA==","testdata/directed/longflat.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgDBAEBYTHEMQEGAA==","testdata/directed/mike.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgBITVGZ2YuPAEGAA==","testdata/directed/nhg.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgTEzhuLngfBwEGAA==","testdata/directed/oldarrows.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfhSHg4ODg4GUAEGAA==","testdata/directed/pgram.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfjMbCkai+jg4AEGAA==","testdata/directed/pm2way.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgYGB4mDg0GBgEGAA==","testdata/directed/pmpipe.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgGBgIaDgRSRgEGAA==","testdata/directed/polypoly.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfguLCwubkwQCwEGAA==","testdata/directed/proc3d.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgICRkZCRkZCQEGAA==","testdata/directed/psfonttest.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfiWlJSUlJSUhAEGAA==","testdata/directed/record2.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgqCB4mmiq6HgEGAA==","testdata/directed/records.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAADv+AAfkJW2l8Hg4eAQYA","testdata/directed/rowe.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgGkzRnxaa0MQEGAA==","testdata/directed/russian.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfhTU1NS0lISEgEGAA==","testdata/directed/sdh.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfiLm5qYtKTESgEGAA==","testdata/directed/shells.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfjPjZPnpK2PzQEGAA==","testdata/directed/states.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgDBwUZESne4AEGAA==","testdata/directed/structs.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgcLCxMxkZKAAEGAA==","testdata/directed/switch.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfg5JRtRa2dLdQEGAA==","testdata/directed/table.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgMDAcn5+fHxgEGAA==","testdata/directed/train11.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAADv+AAfkBAwcIHmSHAQYA","testdata/directed/trapeziumlr.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfjgcTMPDzNxwAEGAA==","testdata/directed/tree.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgGBhISMHI4uAEGAA==","testdata/directed/triedds.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfg4JGQuBhYWFgEGAA==","testdata/directed/try.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfiNqUtNjA8tKwEGAA==","testdata/directed/unix.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgPGzEV0dtbAwEGAA==","testdata/directed/unix2.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgPCzHR0xtLCwEGAA==","testdata/directed/viewfile.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgc9vZzx8nJGAEGAA==","testdata/directed/world.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgyNRUdhZU1JwEGAA==","testdata/undirected/ER.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgCAwIGFAYUFgEGAA==","testdata/undirected/Heawood.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfgIiJRSVlYWFgEGAA==","testdata/undirected/Petersen.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfhObSsqKs7GQQEGAA==","testdata/undirected/ngk10_4.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfiBKi0qIzlYAQEGAA==","testdata/undirected/process.gv":"IH8DAQEBRAH/gAABAgEESGFzaAEGAAEES2luZAEEAAAAD/+AAfg9Z0tCAwMDAwEGAA=="} \ No newline at end of file