Skip to content

Commit 34b5f09

Browse files
committed
feat: add a simple standalone version of graphviz
Export "layout" and "lastError" Signed-off-by: Gordon Smith <GordonJSmith@gmail.com>
1 parent 4f1d010 commit 34b5f09

File tree

2 files changed

+97
-12
lines changed

2 files changed

+97
-12
lines changed

packages/graphviz/src-cpp/CMakeLists.txt

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,21 @@ add_executable(graphvizlib
5151
set_target_properties(graphvizlib PROPERTIES COMPILE_FLAGS "${CPP_FLAGS}")
5252
set_target_properties(graphvizlib PROPERTIES LINK_FLAGS "${LINK_FLAGS}")
5353

54+
add_executable(graphvizlib-standalone
55+
main-standalone.cpp
56+
util.hpp
57+
util.cpp
58+
)
59+
60+
set_target_properties(graphvizlib-standalone PROPERTIES COMPILE_FLAGS "")
61+
set_target_properties(graphvizlib-standalone PROPERTIES LINK_FLAGS "--no-entry -s STANDALONE_WASM -s EXPORTED_FUNCTIONS=\"['_free', '_malloc', '_layout']\"")
62+
5463
# link libraries
5564
function(add_graphviz_library library)
5665
find_library(GRAPHVIZ_${library} NAMES ${library})
5766
if(GRAPHVIZ_${library})
5867
target_link_libraries(graphvizlib PRIVATE ${GRAPHVIZ_${library}})
68+
target_link_libraries(graphvizlib-standalone PRIVATE ${GRAPHVIZ_${library}})
5969
else()
6070
message(FATAL_ERROR "Could not find library ${library}!")
6171
endif()
@@ -90,18 +100,9 @@ target_link_libraries(graphvizlib PRIVATE
90100
${EXPAT_LIBRARIES}
91101
)
92102

93-
# add_executable(graphvizlib-web
94-
# ${SRCS}
95-
# )
96-
97-
# set_target_properties(graphvizlib-web PROPERTIES LINK_FLAGS "${LINK_FLAGS} -s ENVIRONMENT=web")
98-
99-
# target_link_libraries(graphvizlib-web PRIVATE
100-
# gvplugin_core
101-
# gvplugin_dot_layout
102-
# gvplugin_neato_layout
103-
# ortho
104-
# )
103+
target_link_libraries(graphvizlib-standalone PRIVATE
104+
${EXPAT_LIBRARIES}
105+
)
105106

106107
# add_executable(graphvizlib-worker
107108
# ${SRCS}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include "util.hpp"
2+
3+
#include <gvc.h>
4+
#include <gvplugin.h>
5+
#include <graphviz_version.h>
6+
7+
#include <emscripten.h>
8+
9+
extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
10+
extern gvplugin_library_t gvplugin_neato_layout_LTX_library;
11+
#ifdef HAVE_LIBGD
12+
extern gvplugin_library_t gvplugin_gd_LTX_library;
13+
#endif
14+
#ifdef HAVE_PANGOCAIRO
15+
extern gvplugin_library_t gvplugin_pango_LTX_library;
16+
#ifdef HAVE_WEBP
17+
extern gvplugin_library_t gvplugin_webp_LTX_library;
18+
#endif
19+
#endif
20+
extern gvplugin_library_t gvplugin_core_LTX_library;
21+
22+
lt_symlist_t lt_preloaded_symbols[] = {
23+
{"gvplugin_dot_layout_LTX_library", &gvplugin_dot_layout_LTX_library},
24+
{"gvplugin_neato_layout_LTX_library", &gvplugin_neato_layout_LTX_library},
25+
#ifdef HAVE_PANGOCAIRO
26+
{"gvplugin_pango_LTX_library", &gvplugin_pango_LTX_library},
27+
#ifdef HAVE_WEBP
28+
{"gvplugin_webp_LTX_library", &gvplugin_webp_LTX_library},
29+
#endif
30+
#endif
31+
#ifdef HAVE_LIBGD
32+
{"gvplugin_gd_LTX_library", &gvplugin_gd_LTX_library},
33+
#endif
34+
{"gvplugin_core_LTX_library", &gvplugin_core_LTX_library},
35+
{0, 0}};
36+
37+
StringBuffer lastErrorStr;
38+
39+
int vizErrorf(char *buf)
40+
{
41+
lastErrorStr = buf;
42+
return 0;
43+
}
44+
45+
extern int Y_invert;
46+
int origYInvert = Y_invert;
47+
extern int Nop;
48+
int origNop = Nop;
49+
50+
StringBuffer layout_result;
51+
52+
extern "C"
53+
{
54+
const char *layout(const char *src, const char *format, const char *engine)
55+
{
56+
layout_result = "";
57+
58+
GVC_t *gvc = gvContextPlugins(lt_preloaded_symbols, true);
59+
60+
Agraph_t *graph = agmemread(src);
61+
if (graph)
62+
{
63+
char *data = NULL;
64+
unsigned int length;
65+
66+
gvLayout(gvc, graph, engine);
67+
gvRenderData(gvc, graph, format, &data, &length);
68+
layout_result = data;
69+
gvFreeRenderData(data);
70+
gvFreeLayout(gvc, graph);
71+
agclose(graph);
72+
}
73+
74+
gvFinalize(gvc);
75+
gvFreeContext(gvc);
76+
77+
return layout_result;
78+
}
79+
80+
const char *lastError()
81+
{
82+
return lastErrorStr;
83+
}
84+
}

0 commit comments

Comments
 (0)