Skip to content

Commit eff63dc

Browse files
authored
Add xdot support and out-of-process layout computations (#57)
1 parent 16ede53 commit eff63dc

40 files changed

+2617
-729
lines changed

ConsoleApplication/ConsoleApplication.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
#include <iostream>
22
#include <conio.h>
3+
#include "GraphvizWrapper.h"
34

45
using namespace std;
56

6-
extern "C" {
7-
__declspec(dllimport) int stackoverflow_repro();
8-
__declspec(dllimport) int missing_label_repro();
9-
__declspec(dllimport) int test_agread();
10-
__declspec(dllimport) int test_agmemread();
11-
__declspec(dllimport) int test_rj_agmemread();
12-
}
13-
147
int main()
158
{
169
cout << "Make sure to set the current working directory to the repository root!" << endl;

ConsoleApplication/ConsoleApplication.vcxproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,16 @@
4646
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
4747
<OutDir>../Rubjerg.Graphviz/</OutDir>
4848
</PropertyGroup>
49+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
50+
<OutDir>../Rubjerg.Graphviz/</OutDir>
51+
</PropertyGroup>
4952
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
5053
<ClCompile>
5154
<WarningLevel>Level3</WarningLevel>
5255
<SDLCheck>true</SDLCheck>
5356
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
5457
<ConformanceMode>true</ConformanceMode>
58+
<AdditionalIncludeDirectories>..\GraphvizWrapper\;..\GraphvizWrapper\include;</AdditionalIncludeDirectories>
5559
</ClCompile>
5660
<Link>
5761
<SubSystem>Console</SubSystem>
@@ -70,6 +74,7 @@
7074
<SDLCheck>true</SDLCheck>
7175
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
7276
<ConformanceMode>true</ConformanceMode>
77+
<AdditionalIncludeDirectories>..\GraphvizWrapper\;..\GraphvizWrapper\include;</AdditionalIncludeDirectories>
7378
</ClCompile>
7479
<Link>
7580
<SubSystem>Console</SubSystem>

Directory.Build.props

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project>
2+
<PropertyGroup>
3+
<!-- We do not want warnings about outdated analyzers https://github.com/dotnet/docs/pull/27799 -->
4+
<_SkipUpgradeNetAnalyzersNuGetWarning>true</_SkipUpgradeNetAnalyzersNuGetWarning>
5+
</PropertyGroup>
6+
</Project>

GraphvizWrapper/GraphvizWrapper.h

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
#pragma once
2+
3+
#define _CRT_SECURE_NO_DEPRECATE
4+
#include <objbase.h>
5+
#include <iostream>
6+
#include <fstream>
7+
#include <sstream>
8+
9+
#define GVDLL 1
10+
11+
#include "cgraph.h"
12+
#include "gvc.h"
13+
#include "types.h"
14+
#include "xdot.h"
15+
16+
17+
using namespace std;
18+
19+
20+
static int rj_afread(void* stream, char* buffer, int bufsize)
21+
{
22+
istringstream* is = (istringstream*)stream;
23+
is->read(buffer, bufsize);
24+
int result = (int)is->gcount();
25+
return result;
26+
}
27+
28+
static int rj_putstr(void* stream, const char* s)
29+
{
30+
ostringstream* os = (ostringstream*)stream;
31+
(*os) << s;
32+
return 0;
33+
}
34+
35+
static int rj_flush(void* stream)
36+
{
37+
ostringstream* os = (ostringstream*)stream;
38+
os->flush();
39+
return 0;
40+
}
41+
42+
static Agiodisc_t memIoDisc = { rj_afread, rj_putstr, rj_flush };
43+
static Agdisc_t memDisc = { 0, 0, &memIoDisc };
44+
45+
extern "C" {
46+
47+
__declspec(dllexport) void free_str(char* str);
48+
49+
#pragma region "CGraph"
50+
// Some wrappers around cgraph macros
51+
__declspec(dllexport) Agedge_t* rj_agmkin(Agedge_t* e);
52+
__declspec(dllexport) Agedge_t* rj_agmkout(Agedge_t* e);
53+
__declspec(dllexport) Agnode_t* rj_aghead(Agedge_t* edge);
54+
__declspec(dllexport) Agnode_t* rj_agtail(Agedge_t* edge);
55+
__declspec(dllexport) int rj_ageqedge(Agedge_t* e, Agedge_t* f);
56+
57+
// Some wrappers around existing cgraph functions to handle string marshaling
58+
__declspec(dllexport) const char* rj_agmemwrite(Agraph_t* g);
59+
__declspec(dllexport) Agraph_t* rj_agmemread(const char* s);
60+
__declspec(dllexport) Agraph_t* rj_agopen(char* name, int graphtype);
61+
__declspec(dllexport) const char* rj_sym_key(Agsym_t* sym);
62+
63+
__declspec(dllexport) double node_x(Agnode_t* node);
64+
__declspec(dllexport) double node_y(Agnode_t* node);
65+
__declspec(dllexport) double node_width(Agnode_t* node);
66+
__declspec(dllexport) double node_height(Agnode_t* node);
67+
68+
__declspec(dllexport) textlabel_t* node_label(Agnode_t* node);
69+
__declspec(dllexport) textlabel_t* edge_label(Agedge_t* edge);
70+
__declspec(dllexport) textlabel_t* graph_label(Agraph_t* graph);
71+
72+
__declspec(dllexport) double label_x(textlabel_t* label);
73+
__declspec(dllexport) double label_y(textlabel_t* label);
74+
__declspec(dllexport) double label_width(textlabel_t* label);
75+
__declspec(dllexport) double label_height(textlabel_t* label);
76+
__declspec(dllexport) const char* label_text(textlabel_t* label);
77+
__declspec(dllexport) double label_fontsize(textlabel_t* label);
78+
__declspec(dllexport) const char* label_fontname(textlabel_t* label);
79+
80+
__declspec(dllexport) void clone_attribute_declarations(Agraph_t* from, Agraph_t* to);
81+
__declspec(dllexport) void convert_to_undirected(Agraph_t* graph);
82+
#pragma endregion
83+
84+
#pragma region "xdot"
85+
86+
__declspec(dllexport) size_t get_cnt(xdot* xdot);
87+
__declspec(dllexport) xdot_op* get_ops(xdot* xdot);
88+
__declspec(dllexport) xdot_kind get_kind(xdot_op* op);
89+
__declspec(dllexport) xdot_rect* get_ellipse(xdot_op* op);
90+
__declspec(dllexport) xdot_polyline* get_polygon(xdot_op* op);
91+
__declspec(dllexport) xdot_polyline* get_polyline(xdot_op* op);
92+
__declspec(dllexport) xdot_polyline* get_bezier(xdot_op* op);
93+
__declspec(dllexport) xdot_text* get_text(xdot_op* op);
94+
__declspec(dllexport) xdot_image* get_image(xdot_op* op);
95+
__declspec(dllexport) char* get_color(xdot_op* op);
96+
__declspec(dllexport) xdot_color* get_grad_color(xdot_op* op);
97+
__declspec(dllexport) xdot_font* get_font(xdot_op* op);
98+
__declspec(dllexport) char* get_style(xdot_op* op);
99+
__declspec(dllexport) unsigned int get_fontchar(xdot_op* op);
100+
__declspec(dllexport) xdot_rect* get_pos(xdot_image* img);
101+
__declspec(dllexport) char* get_name_image(xdot_image* img);
102+
__declspec(dllexport) double get_size(xdot_font* font);
103+
__declspec(dllexport) char* get_name_font(xdot_font* font);
104+
__declspec(dllexport) xdot_grad_type get_type(xdot_color* clr);
105+
__declspec(dllexport) char* get_clr(xdot_color* clr);
106+
__declspec(dllexport) xdot_linear_grad* get_ling(xdot_color* clr);
107+
__declspec(dllexport) xdot_radial_grad* get_ring(xdot_color* clr);
108+
__declspec(dllexport) double get_x_text(xdot_text* txt);
109+
__declspec(dllexport) double get_y_text(xdot_text* txt);
110+
__declspec(dllexport) xdot_align get_align(xdot_text* txt);
111+
__declspec(dllexport) double get_width(xdot_text* txt);
112+
__declspec(dllexport) char* get_text_str(xdot_text* txt);
113+
__declspec(dllexport) double get_x0_ling(xdot_linear_grad* ling);
114+
__declspec(dllexport) double get_y0_ling(xdot_linear_grad* ling);
115+
__declspec(dllexport) double get_x1_ling(xdot_linear_grad* ling);
116+
__declspec(dllexport) double get_y1_ling(xdot_linear_grad* ling);
117+
__declspec(dllexport) int get_n_stops_ling(xdot_linear_grad* ling);
118+
__declspec(dllexport) xdot_color_stop* get_stops_ling(xdot_linear_grad* ling);
119+
__declspec(dllexport) double get_x0_ring(xdot_radial_grad* ring);
120+
__declspec(dllexport) double get_y0_ring(xdot_radial_grad* ring);
121+
__declspec(dllexport) double get_r0_ring(xdot_radial_grad* ring);
122+
__declspec(dllexport) double get_x1_ring(xdot_radial_grad* ring);
123+
__declspec(dllexport) double get_y1_ring(xdot_radial_grad* ring);
124+
__declspec(dllexport) double get_r1_ring(xdot_radial_grad* ring);
125+
__declspec(dllexport) int get_n_stops_ring(xdot_radial_grad* ring);
126+
__declspec(dllexport) xdot_color_stop* get_stops_ring(xdot_radial_grad* ring);
127+
__declspec(dllexport) float get_frac(xdot_color_stop* stop);
128+
__declspec(dllexport) char* get_color_stop(xdot_color_stop* stop);
129+
__declspec(dllexport) size_t get_cnt_polyline(xdot_polyline* polyline);
130+
__declspec(dllexport) xdot_point* get_pts_polyline(xdot_polyline* polyline);
131+
__declspec(dllexport) double get_x_point(xdot_point* point);
132+
__declspec(dllexport) double get_y_point(xdot_point* point);
133+
__declspec(dllexport) double get_z_point(xdot_point* point);
134+
__declspec(dllexport) double get_x_rect(xdot_rect* rect);
135+
__declspec(dllexport) double get_y_rect(xdot_rect* rect);
136+
__declspec(dllexport) double get_w_rect(xdot_rect* rect);
137+
__declspec(dllexport) double get_h_rect(xdot_rect* rect);
138+
__declspec(dllexport) xdot_color_stop* get_color_stop_at_index(xdot_color_stop* stops, int index);
139+
__declspec(dllexport) xdot_op* get_op_at_index(xdot_op* ops, int index);
140+
__declspec(dllexport) xdot_point* get_pt_at_index(xdot_point* pts, int index);
141+
#pragma endregion
142+
143+
#pragma region "testing/debugging"
144+
__declspec(dllexport) bool echobool(bool arg);
145+
__declspec(dllexport) int echoint(int arg);
146+
__declspec(dllexport) bool return_true();
147+
__declspec(dllexport) bool return_false();
148+
__declspec(dllexport) int return1();
149+
__declspec(dllexport) int return_1();
150+
151+
typedef enum {
152+
Val1, Val2, Val3, Val4, Val5
153+
} TestEnum;
154+
155+
__declspec(dllexport) TestEnum echo_enum(TestEnum e);
156+
__declspec(dllexport) TestEnum return_enum1();
157+
__declspec(dllexport) TestEnum return_enum2();
158+
__declspec(dllexport) TestEnum return_enum5();
159+
__declspec(dllexport) char* echo_string(char* str);
160+
__declspec(dllexport) char* return_empty_string();
161+
__declspec(dllexport) char* return_hello();
162+
__declspec(dllexport) int stackoverflow_repro();
163+
__declspec(dllexport) int missing_label_repro();
164+
__declspec(dllexport) int test_agread();
165+
__declspec(dllexport) int test_agmemread();
166+
__declspec(dllexport) int test_rj_agmemread();
167+
#pragma endregion
168+
}
169+
170+
171+

GraphvizWrapper/GraphvizWrapper.vcxproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
</PostBuildEvent>
6767
<Link>
6868
<SubSystem>Console</SubSystem>
69-
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;cgraph.lib;gvc.lib;%(AdditionalDependencies)</AdditionalDependencies>
69+
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;cgraph.lib;gvc.lib;xdot.lib;%(AdditionalDependencies)</AdditionalDependencies>
7070
<EnableCOMDATFolding>true</EnableCOMDATFolding>
7171
<OptimizeReferences>true</OptimizeReferences>
7272
<AdditionalLibraryDirectories>lib</AdditionalLibraryDirectories>
@@ -97,6 +97,11 @@
9797
</ItemDefinitionGroup>
9898
<ItemGroup>
9999
<ClCompile Include="Main.cpp" />
100+
<ClCompile Include="Test.cpp" />
101+
<ClCompile Include="XDot.cpp" />
102+
</ItemGroup>
103+
<ItemGroup>
104+
<ClInclude Include="GraphvizWrapper.h" />
100105
</ItemGroup>
101106
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
102107
<ImportGroup Label="ExtensionTargets">

GraphvizWrapper/GraphvizWrapper.vcxproj.filters

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,16 @@
1818
<ClCompile Include="Main.cpp">
1919
<Filter>Source Files</Filter>
2020
</ClCompile>
21+
<ClCompile Include="XDot.cpp">
22+
<Filter>Source Files</Filter>
23+
</ClCompile>
24+
<ClCompile Include="Test.cpp">
25+
<Filter>Source Files</Filter>
26+
</ClCompile>
27+
</ItemGroup>
28+
<ItemGroup>
29+
<ClInclude Include="GraphvizWrapper.h">
30+
<Filter>Header Files</Filter>
31+
</ClInclude>
2132
</ItemGroup>
2233
</Project>

0 commit comments

Comments
 (0)