Compare commits

...

16 Commits

Author SHA1 Message Date
1b1f742ae1 Fix doxygen for command line header 2019-11-15 21:39:33 +01:00
3b6837b886 Rename python renderer to plugin example and leave it be as a template 2019-11-15 21:34:13 +01:00
efb1af7ee0 Complete chain of passing command line parameters to external renderer 2019-11-15 21:11:41 +01:00
fa1a78e54c Edit comments 2019-11-15 21:06:41 +01:00
0417784877 Add property for command line parameters to external renderer 2019-11-15 21:04:59 +01:00
c186d3cdb3 Pass command line parameters for shared object renderer to command line convert struct 2019-11-15 20:50:46 +01:00
f02a720f99 Uodate translations of main.c 2019-11-15 20:35:36 +01:00
374a893dda Add W option to command line parser for external renderer parameters 2019-11-15 20:31:57 +01:00
83a7848c14 Merge branch 'dev' into external-renderer-rework 2019-11-14 23:39:40 +01:00
7977ee7c8b Merge branch 'master' into dev 2019-11-14 23:39:29 +01:00
e7f0f904e8 main: Free command line option context, add comment for freeing all the command line parameter data 2019-11-14 23:39:12 +01:00
48eb2c296f Merge branch 'dev' into external-renderer-rework 2019-11-14 19:36:59 +01:00
3d5c4daad9 Doxygen: Rework documentation make targets
* new target doxygen-pdf which build the latex output
* Add doxygen-pdf to documentation target
* Move documentaiton target definition to doxygen's CMakeLists.txt
2019-11-14 19:32:54 +01:00
9899b94db6 cmake: rework source list for generated files 2019-11-14 19:31:57 +01:00
f153485996 Implement base construct of new external renderer. CLI parameters still not implemented. Currently NULL is passed to init func. Forking implemented but not tested 2019-11-12 21:15:36 +01:00
f15e82b5dc Modify External Renderer: External renderer docu updated for future changes, restructuring. Not that the changes in the documentation are not yet implemented in code 2019-11-12 20:52:42 +01:00
19 changed files with 308 additions and 116 deletions

View File

@ -30,6 +30,7 @@ pkg_search_module(GLIB REQUIRED glib-2.0)
pkg_check_modules(GTK3 REQUIRED gtk+-3.0) pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
pkg_check_modules(CAIRO REQUIRED cairo) pkg_check_modules(CAIRO REQUIRED cairo)
include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include)
add_subdirectory(plugins) add_subdirectory(plugins)
add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter) add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter)
@ -48,7 +49,6 @@ add_subdirectory(doxygen)
add_subdirectory(translations) add_subdirectory(translations)
add_subdirectory(version) add_subdirectory(version)
include_directories(${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include)
link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${CAIRO_LINK_DIRS}) link_directories(${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${CAIRO_LINK_DIRS})
add_definitions(${GLIB2_CFLAGS_OTHER}) add_definitions(${GLIB2_CFLAGS_OTHER})
@ -70,15 +70,19 @@ set(SOURCE
${LAYER_SELECTOR_SOURCES} ${LAYER_SELECTOR_SOURCES}
) )
add_executable(${PROJECT_NAME} ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/resources/resources.c) set(SOURCE_GENERATED
${CMAKE_CURRENT_BINARY_DIR}/resources/resources.c
)
SET_SOURCE_FILES_PROPERTIES(${SOURCE_GENERATED} PROPERTIES GENERATED 1)
add_executable(${PROJECT_NAME} ${SOURCE} ${SOURCE_GENERATED})
add_dependencies(${PROJECT_NAME} glib-resources) add_dependencies(${PROJECT_NAME} glib-resources)
add_dependencies(${PROJECT_NAME} version) add_dependencies(${PROJECT_NAME} version)
add_dependencies(${PROJECT_NAME} translations) add_dependencies(${PROJECT_NAME} translations)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/resources/resources.c PROPERTIES GENERATED 1)
target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${CAIRO_LDFLAGS} m version ${CMAKE_DL_LIBS}) target_link_libraries(${PROJECT_NAME} ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${CAIRO_LDFLAGS} m version ${CMAKE_DL_LIBS})
install (TARGETS ${PROJECT_NAME} install (TARGETS ${PROJECT_NAME}
RUNTIME RUNTIME
DESTINATION bin DESTINATION bin
) )
add_custom_target(documentation DEPENDS doxygen)

View File

@ -56,7 +56,7 @@ static int create_renderers(char **renderers,
char **output_file_names, char **output_file_names,
gboolean tex_layers, gboolean tex_layers,
gboolean tex_standalone, gboolean tex_standalone,
const char *so_path, const struct external_renderer_params *ext_params,
GList **renderer_list, GList **renderer_list,
LayerSettings *layer_settings) LayerSettings *layer_settings)
{ {
@ -100,11 +100,13 @@ static int create_renderers(char **renderers,
} else if (!strcmp(current_renderer, "svg")) { } else if (!strcmp(current_renderer, "svg")) {
output_renderer = GDS_RENDER_OUTPUT_RENDERER(cairo_renderer_new_svg()); output_renderer = GDS_RENDER_OUTPUT_RENDERER(cairo_renderer_new_svg());
} else if (!strcmp(current_renderer, "ext")) { } else if (!strcmp(current_renderer, "ext")) {
if (!so_path) { if (!ext_params->so_path) {
fprintf(stderr, _("Please specify shared object for external renderer. Will ignore this renderer.\n")); fprintf(stderr, _("Please specify shared object for external renderer. Will ignore this renderer.\n"));
continue; continue;
} }
output_renderer = GDS_RENDER_OUTPUT_RENDERER(external_renderer_new_with_so(so_path)); output_renderer = GDS_RENDER_OUTPUT_RENDERER(
external_renderer_new_with_so_and_param(ext_params->so_path,
ext_params->cli_params));
} else { } else {
continue; continue;
} }
@ -138,7 +140,7 @@ int command_line_convert_gds(const char *gds_name,
char **renderers, char **renderers,
char **output_file_names, char **output_file_names,
const char *layer_file, const char *layer_file,
const char *so_path, struct external_renderer_params *ext_param,
gboolean tex_standalone, gboolean tex_standalone,
gboolean tex_layers, gboolean tex_layers,
double scale) double scale)
@ -165,7 +167,7 @@ int command_line_convert_gds(const char *gds_name,
/* Create renderers */ /* Create renderers */
if (create_renderers(renderers, output_file_names, tex_layers, tex_standalone, if (create_renderers(renderers, output_file_names, tex_layers, tex_standalone,
so_path, &renderer_list, layer_sett)) ext_param, &renderer_list, layer_sett))
goto ret_destroy_layer_mapping; goto ret_destroy_layer_mapping;

View File

@ -1,10 +1,19 @@
find_package(Doxygen) find_package(Doxygen)
if (DOXYGEN_FOUND) if (DOXYGEN_FOUND)
add_custom_target(documentation DEPENDS doxygen doxygen-pdf)
add_custom_target(doxygen add_custom_target(doxygen
COMMAND ./build-doxygen.sh "${PROJECT_BINARY_DIR}" COMMAND ./build-doxygen.sh "${PROJECT_BINARY_DIR}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Generating documentation with Doxygen") COMMENT "Generating documentation with Doxygen")
add_custom_target(
doxygen-pdf
COMMAND make
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/latex"
DEPENDS doxygen
)
else (DOXYGEN_FOUND) else (DOXYGEN_FOUND)
message("Doxygen needs to be installed to generate the doxygen documentation") message("Doxygen needs to be installed to generate the doxygen documentation")
endif (DOXYGEN_FOUND) endif (DOXYGEN_FOUND)

View File

@ -9,7 +9,18 @@
* Property Name | Description * Property Name | Description
* -----------------|---------------------------------------------------------------- * -----------------|----------------------------------------------------------------
* shared-object-path | Path to the shared object used for rendering * shared-object-path | Path to the shared object used for rendering
* param-string | Command line parameters passed to external renderer's init function
* *
* All these properties have to be set for rendering. * All these properties have to be set for rendering.
* *
* @section ExternalRendererFuncs Necessary Functions
*
* The following functions and variables are necessary for an external renderer to implement:
*
* Code Define | Prototype | Description
* ---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------
* @ref EXTERNAL_LIBRARY_RENDER_FUNCTION | int EXTERNAL_LIBRARY_RENDER_FUNCTION(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale) | Render cell to output file
* @ref EXTERNAL_LIBRARY_INIT_FUNCTION | int EXTERNAL_LIBRARY_INIT_FUNCTION(const char *option_string, const char *version_string) | Init function. Executed before rendering. This is given the command line parameters specified for the external renderer and the version string of the currently running gds-render program.
* @ref EXTERNAL_LIBRARY_FORK_REQUEST | int EXTERNAL_LIBRARY_FORK_REQUEST; | The pure presence of this integer results in the execution inside a subprocess of hte whole shared object's code
*
*/ */

View File

@ -33,6 +33,21 @@
#include <glib.h> #include <glib.h>
/**
* @brief External renderer paramameters to command line renderer
*/
struct external_renderer_params {
/**
* @brief Path to shared object
*/
char *so_path;
/**
* @brief Command line parameters given
*/
char *cli_params;
};
/** /**
* @brief Convert GDS according to command line parameters * @brief Convert GDS according to command line parameters
* @param gds_name Path to GDS File * @param gds_name Path to GDS File
@ -40,7 +55,7 @@
* @param renderers Renderer ids * @param renderers Renderer ids
* @param output_file_names Output file names * @param output_file_names Output file names
* @param layer_file Layer mapping file * @param layer_file Layer mapping file
* @param so_path Shared object * @param ext_param Settings for external library renderer
* @param tex_standalone Standalone TeX * @param tex_standalone Standalone TeX
* @param tex_layers TeX OCR layers * @param tex_layers TeX OCR layers
* @param scale Scale value * @param scale Scale value
@ -51,7 +66,7 @@ int command_line_convert_gds(const char *gds_name,
char **renderers, char **renderers,
char **output_file_names, char **output_file_names,
const char *layer_file, const char *layer_file,
const char *so_path, struct external_renderer_params *ext_param,
gboolean tex_standalone, gboolean tex_standalone,
gboolean tex_layers, gboolean tex_layers,
double scale); double scale);

View File

@ -0,0 +1,51 @@
#ifndef __EXTERNAL_RENDERER_INTERFACES_H__
#define __EXTERNAL_RENDERER_INTERFACES_H__
#ifndef xstr
#define xstr(a) str(a)
#define str(a) #a
#endif /* xstr */
/**
* @addtogroup ExternalRenderer
* @{
*/
/**
* @brief Function name expected to be found in external library for rendering.
*
* The function has to be defined as follows:
* @code
* int EXTERNAL_LIBRARY_RENDER_FUNCTION(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale);
* @endcode
*/
#define EXTERNAL_LIBRARY_RENDER_FUNCTION exported_render_cell_to_file
/**
* @brief Function name expected to be found in external library for initialization.
*
* @code
* int EXTERNAL_LIBRARY_INIT_FUNCTION(const char *option_string, const char *version_string);
* @endcode
*/
#define EXTERNAL_LIBRARY_INIT_FUNCTION exported_init
/**
* @brief Global integer specified by an external renderer to signal, that the init and render functions shall be executed in a subprocess
*
* The pure presence of this symbol name causes forking. The content of this variable is don't care.
* @note Use this if you mess with the internal structures of gds-render
*
*/
#define EXTERNAL_LIBRARY_FORK_REQUEST exported_fork_request
/**
* @brief Define for declaring the exported functions
*/
#define FUNC_DECL(FUNC) FUNC
/** @} */
#endif /* __EXTERNAL_RENDERER_INTERFACES_H__ */

View File

@ -33,6 +33,7 @@
#include <gds-render/output-renderers/gds-output-renderer.h> #include <gds-render/output-renderers/gds-output-renderer.h>
#include <gds-render/gds-utils/gds-types.h> #include <gds-render/gds-utils/gds-types.h>
#include <gds-render/output-renderers/external-renderer-interfaces.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@ -40,16 +41,6 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE(ExternalRenderer, external_renderer, GDS_RENDER, EXTERNAL_RENDERER, GdsOutputRenderer) G_DECLARE_FINAL_TYPE(ExternalRenderer, external_renderer, GDS_RENDER, EXTERNAL_RENDERER, GdsOutputRenderer)
/**
* @brief function name expected to be found in external library.
*
* The function has to be defined as follows:
* @code
* int EXTERNAL_LIBRARY_FUNCTION(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale)
* @endcode
*/
#define EXTERNAL_LIBRARY_FUNCTION "render_cell_to_file"
/** /**
* @brief Create new ExternalRenderer object * @brief Create new ExternalRenderer object
* @return New object * @return New object
@ -59,9 +50,10 @@ ExternalRenderer *external_renderer_new();
/** /**
* @brief Create new ExternalRenderer object with specified shared object path * @brief Create new ExternalRenderer object with specified shared object path
* @param so_path Path to shared object, the rendering function is searched in * @param so_path Path to shared object, the rendering function is searched in
* @param param_string Command line parameter string passed to external renderer
* @return New object. * @return New object.
*/ */
ExternalRenderer *external_renderer_new_with_so(const char *so_path); ExternalRenderer *external_renderer_new_with_so_and_param(const char *so_path, const char *param_string);
G_END_DECLS G_END_DECLS

30
main.c
View File

@ -23,8 +23,6 @@
* @author Mario Hüttel <mario.huettel@gmx.net> * @author Mario Hüttel <mario.huettel@gmx.net>
*/ */
#include <stdio.h> #include <stdio.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib.h> #include <glib.h>
@ -265,9 +263,12 @@ int main(int argc, char **argv)
gchar *cellname = NULL; gchar *cellname = NULL;
gchar **renderer_args = NULL; gchar **renderer_args = NULL;
gboolean version = FALSE, pdf_standalone = FALSE, pdf_layers = FALSE; gboolean version = FALSE, pdf_standalone = FALSE, pdf_layers = FALSE;
gchar *custom_library_path = NULL;
int scale = 1000; int scale = 1000;
int app_status = 0; int app_status = 0;
struct external_renderer_params so_render_params;
so_render_params.so_path = NULL;
so_render_params.cli_params = NULL;
bindtextdomain(GETTEXT_PACKAGE, LOCALEDATADIR "/locale"); bindtextdomain(GETTEXT_PACKAGE, LOCALEDATADIR "/locale");
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
@ -284,9 +285,11 @@ int main(int argc, char **argv)
{"cell", 'c', 0, G_OPTION_ARG_STRING, &cellname, _("Cell to render"), "NAME" }, {"cell", 'c', 0, G_OPTION_ARG_STRING, &cellname, _("Cell to render"), "NAME" },
{"tex-standalone", 'a', 0, G_OPTION_ARG_NONE, &pdf_standalone, _("Create standalone TeX"), NULL }, {"tex-standalone", 'a', 0, G_OPTION_ARG_NONE, &pdf_standalone, _("Create standalone TeX"), NULL },
{"tex-layers", 'l', 0, G_OPTION_ARG_NONE, &pdf_layers, _("Create PDF Layers (OCG)"), NULL }, {"tex-layers", 'l', 0, G_OPTION_ARG_NONE, &pdf_layers, _("Create PDF Layers (OCG)"), NULL },
{"custom-render-lib", 'P', 0, G_OPTION_ARG_FILENAME, &custom_library_path, {"custom-render-lib", 'P', 0, G_OPTION_ARG_FILENAME, &so_render_params.so_path,
"Path to a custom shared object, that implements the " EXTERNAL_LIBRARY_FUNCTION " function", "PATH"}, _("Path to a custom shared object, that implements the necessary rendering functions"), "PATH"},
{NULL} {"render-lib-params", 'W', 0, G_OPTION_ARG_STRING, &so_render_params.cli_params,
_("Argument string passed to render lib"), NULL},
{NULL, 0, 0, 0, NULL, NULL, NULL}
}; };
context = g_option_context_new(_(" FILE - Convert GDS file <FILE> to graphic")); context = g_option_context_new(_(" FILE - Convert GDS file <FILE> to graphic"));
@ -298,6 +301,8 @@ int main(int argc, char **argv)
exit(1); exit(1);
} }
g_option_context_free(context);
if (version) { if (version) {
print_version(); print_version();
goto ret_status; goto ret_status;
@ -318,14 +323,17 @@ int main(int argc, char **argv)
app_status = app_status =
command_line_convert_gds(gds_name, cellname, renderer_args, output_paths, mappingname, command_line_convert_gds(gds_name, cellname, renderer_args, output_paths, mappingname,
custom_library_path, pdf_standalone, pdf_layers, scale); &so_render_params, pdf_standalone, pdf_layers, scale);
} else { } else {
app_status = start_gui(argc, argv); app_status = start_gui(argc, argv);
} }
ret_status: ret_status:
/* If necessary, free command line parameters */ /* If necessary, free command line parameters.
* This is only really necessary for automated mem-leak testing.
* Omitting these frees would be perfectly fine.
*/
if (output_paths) if (output_paths)
g_strfreev(output_paths); g_strfreev(output_paths);
if (renderer_args) if (renderer_args)
@ -334,8 +342,10 @@ ret_status:
g_free(mappingname); g_free(mappingname);
if (cellname) if (cellname)
free(cellname); free(cellname);
if (custom_library_path) if (so_render_params.so_path)
free(custom_library_path); free(so_render_params.so_path);
if (so_render_params.cli_params)
g_free(so_render_params.cli_params);
return app_status; return app_status;
} }

View File

@ -30,16 +30,22 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <stdio.h> #include <stdio.h>
#include <sys/wait.h>
#include <gds-render/output-renderers/external-renderer.h> #include <gds-render/output-renderers/external-renderer.h>
#include <gds-render/version.h>
#define FORCE_FORK 0U /**< @brief if != 0, then forking is forced regardless of the shared object's settings */
struct _ExternalRenderer { struct _ExternalRenderer {
GdsOutputRenderer parent; GdsOutputRenderer parent;
char *shared_object_path; char *shared_object_path;
char *cli_param_string;
}; };
enum { enum {
PROP_SO_PATH = 1, /**< @brief Shared object path property */ PROP_SO_PATH = 1, /**< @brief Shared object path property */
PROP_PARAM_STRING, /** @brief Shared object renderer parameter string from CLI */
N_PROPERTIES /**< @brief Used to get property count */ N_PROPERTIES /**< @brief Used to get property count */
}; };
@ -52,15 +58,20 @@ G_DEFINE_TYPE(ExternalRenderer, external_renderer, GDS_RENDER_TYPE_OUTPUT_RENDER
* @param output_file Destination file * @param output_file Destination file
* @param scale the scaling value to scale the output cell down by. * @param scale the scaling value to scale the output cell down by.
* @param so_path Path to shared object * @param so_path Path to shared object
* @param params Parameters passed to EXTERNAL_LIBRARY_INIT_FUNCTION
* @return 0 if successful * @return 0 if successful
*/ */
static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList *layer_info_list, static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList *layer_info_list,
const char *output_file, double scale, const char *so_path) const char *output_file, double scale, const char *so_path, const char *params)
{ {
int (*so_render_func)(struct gds_cell *, GList *, const char *, double) = NULL; int (*so_render_func)(struct gds_cell *, GList *, const char *, double) = NULL;
int (*so_init_func)(const char *, const char *) = NULL;
void *so_handle = NULL; void *so_handle = NULL;
char *error_msg; char *error_msg;
int forking_req;
int ret = 0; int ret = 0;
pid_t fork_pid = 0;
int forked_status;
if (!so_path) { if (!so_path) {
fprintf(stderr, "Path to shared object not set!\n"); fprintf(stderr, "Path to shared object not set!\n");
@ -78,22 +89,57 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList *
return -2000; return -2000;
} }
/* Load symbol from library */ /* Load rendering symbol from library */
so_render_func = (int (*)(struct gds_cell *, GList *, const char *, double)) so_render_func = (int (*)(struct gds_cell *, GList *, const char *, double))
dlsym(so_handle, EXTERNAL_LIBRARY_FUNCTION); dlsym(so_handle, xstr(EXTERNAL_LIBRARY_RENDER_FUNCTION));
error_msg = dlerror(); error_msg = dlerror();
if (error_msg != NULL) { if (error_msg != NULL) {
fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg); fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg);
goto ret_close_so_handle; goto ret_close_so_handle;
} }
/* Execute */ /* Load the init function */
if (so_render_func) { so_init_func = (int (*)(const char *, const char *))dlsym(so_handle, xstr(EXTERNAL_LIBRARY_INIT_FUNCTION));
g_message("Calling external renderer."); error_msg = dlerror();
ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale); if (error_msg != NULL) {
g_message("External renderer finished."); fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg);
goto ret_close_so_handle;
} }
/* Check if forking is requested */
if (dlsym(so_handle, xstr(EXTERNAL_LIBRARY_FORK_REQUEST)))
forking_req = 1;
else if (FORCE_FORK)
forking_req = 1;
else
forking_req = 0;
/* Execute */
g_message("Calling external renderer.");
if (forking_req)
fork_pid = fork();
if (fork_pid != 0)
goto end_forked;
ret = so_init_func(params, _app_version_string);
if (!ret)
ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale);
/* If we are in a separate process, terminate here */
if (forking_req)
exit(ret);
/* The forked paths end here */
end_forked:
if (forking_req) {
waitpid(fork_pid, &forked_status, 0);
ret = WEXITSTATUS(forked_status);
}
g_message("External renderer finished.");
ret_close_so_handle: ret_close_so_handle:
dlclose(so_handle); dlclose(so_handle);
return ret; return ret;
@ -116,7 +162,8 @@ static int external_renderer_render_output(GdsOutputRenderer *renderer,
if (settings) if (settings)
layer_infos = layer_settings_get_layer_info_list(settings); layer_infos = layer_settings_get_layer_info_list(settings);
ret = external_renderer_render_cell(cell, layer_infos, output_file, scale, ext_renderer->shared_object_path); ret = external_renderer_render_cell(cell, layer_infos, output_file, scale, ext_renderer->shared_object_path,
ext_renderer->cli_param_string);
if (settings) if (settings)
g_object_unref(settings); g_object_unref(settings);
@ -133,6 +180,9 @@ static void external_renderer_get_property(GObject *obj, guint property_id, GVal
case PROP_SO_PATH: case PROP_SO_PATH:
g_value_set_string(value, self->shared_object_path); g_value_set_string(value, self->shared_object_path);
break; break;
case PROP_PARAM_STRING:
g_value_set_string(value, self->cli_param_string);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec);
break; break;
@ -151,6 +201,11 @@ static void external_renderer_set_property(GObject *obj, guint property_id, cons
g_free(self->shared_object_path); g_free(self->shared_object_path);
self->shared_object_path = g_value_dup_string(value); self->shared_object_path = g_value_dup_string(value);
break; break;
case PROP_PARAM_STRING:
if (self->cli_param_string)
g_free(self->cli_param_string);
self->cli_param_string = g_value_dup_string(value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec);
break; break;
@ -159,7 +214,9 @@ static void external_renderer_set_property(GObject *obj, guint property_id, cons
static void external_renderer_dispose(GObject *self_obj) static void external_renderer_dispose(GObject *self_obj)
{ {
ExternalRenderer *self = GDS_RENDER_EXTERNAL_RENDERER(self_obj); ExternalRenderer *self;
self = GDS_RENDER_EXTERNAL_RENDERER(self_obj);
if (self->shared_object_path) { if (self->shared_object_path) {
g_free(self->shared_object_path); g_free(self->shared_object_path);
@ -194,12 +251,19 @@ static void external_renderer_class_init(ExternalRendererClass *klass)
"Path to the shared object to search rendering function in.", "Path to the shared object to search rendering function in.",
NULL, NULL,
G_PARAM_READWRITE); G_PARAM_READWRITE);
external_renderer_properties[PROP_PARAM_STRING] =
g_param_spec_string("param-string",
"Shared object renderer parameter string",
"Command line arguments passed to the external shared object renderer",
NULL,
G_PARAM_READWRITE);
g_object_class_install_properties(oclass, N_PROPERTIES, external_renderer_properties); g_object_class_install_properties(oclass, N_PROPERTIES, external_renderer_properties);
} }
static void external_renderer_init(ExternalRenderer *self) static void external_renderer_init(ExternalRenderer *self)
{ {
self->shared_object_path = NULL; self->shared_object_path = NULL;
self->cli_param_string = NULL;
} }
ExternalRenderer *external_renderer_new() ExternalRenderer *external_renderer_new()
@ -207,9 +271,10 @@ ExternalRenderer *external_renderer_new()
return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, NULL); return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, NULL);
} }
ExternalRenderer *external_renderer_new_with_so(const char *so_path) ExternalRenderer *external_renderer_new_with_so_and_param(const char *so_path, const char *param_string)
{ {
return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, "shared-object-path", so_path, NULL); return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, "shared-object-path", so_path,
"param-string", param_string,NULL);
} }
/** @} */ /** @} */

View File

@ -1,2 +1,2 @@
add_subdirectory(python-renderer) add_subdirectory(plugin-example)
add_custom_target(plugins DEPENDS pythonrenderer) add_custom_target(plugins DEPENDS pluginexample)

View File

@ -1,4 +1,4 @@
project(pythonrenderer) project(pluginexample)
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_search_module(PYTHON REQUIRED python3) pkg_search_module(PYTHON REQUIRED python3)

View File

@ -0,0 +1,19 @@
#include <stdio.h>
#include <glib.h>
#include <gds-render/gds-utils/gds-types.h>
#include <gds-render/output-renderers/external-renderer-interfaces.h>
int FUNC_DECL(EXTERNAL_LIBRARY_RENDER_FUNCTION)(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale)
{
if (!toplevel)
return -1000;
printf("Rendering %s\n", toplevel->name);
return 0;
}
int FUNC_DECL(EXTERNAL_LIBRARY_INIT_FUNCTION)(const char *params, const char *version)
{
printf("Init with params: %s\ngds-render version: %s\n", params, version);
return 0;
}

View File

@ -1,7 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
int a(void)
{
return 0;
}

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-25 20:27+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-25 20:27+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,34 +17,34 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ../gds-render-gui.c:273 #: ../gds-render-gui.c:275
msgid "Acc. Date" msgid "Acc. Date"
msgstr "" msgstr ""
#: ../gds-render-gui.c:314 #: ../gds-render-gui.c:318
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: ../gds-render-gui.c:266 #: ../gds-render-gui.c:268
msgid "Cell" msgid "Cell"
msgstr "" msgstr ""
#: ../gds-render-gui.c:322 #: ../gds-render-gui.c:326
msgid "GDSII-Files" msgid "GDSII-Files"
msgstr "" msgstr ""
#: ../gds-render-gui.c:263 #: ../gds-render-gui.c:265
msgid "Library" msgid "Library"
msgstr "" msgstr ""
#: ../gds-render-gui.c:270 #: ../gds-render-gui.c:272
msgid "Mod. Date" msgid "Mod. Date"
msgstr "" msgstr ""
#: ../gds-render-gui.c:315 #: ../gds-render-gui.c:319
msgid "Open GDSII" msgid "Open GDSII"
msgstr "" msgstr ""
#: ../gds-render-gui.c:312 #: ../gds-render-gui.c:316
msgid "Open GDSII File" msgid "Open GDSII File"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-25 20:27+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ../main.c:99 #: ../main.c:97
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -25,23 +25,27 @@ msgid ""
"Full git commit: %s" "Full git commit: %s"
msgstr "" msgstr ""
#: ../main.c:289 #: ../main.c:293
msgid " FILE - Convert GDS file <FILE> to graphic" msgid " FILE - Convert GDS file <FILE> to graphic"
msgstr "" msgstr ""
#: ../main.c:223 #: ../main.c:221
msgid "About" msgid "About"
msgstr "" msgstr ""
#: ../main.c:282 #: ../main.c:289
msgid "Cell to render" msgid "Argument string passed to render lib"
msgstr ""
#: ../main.c:284
msgid "Create PDF Layers (OCG)"
msgstr "" msgstr ""
#: ../main.c:283 #: ../main.c:283
msgid "Cell to render"
msgstr ""
#: ../main.c:285
msgid "Create PDF Layers (OCG)"
msgstr ""
#: ../main.c:284
msgid "Create standalone TeX" msgid "Create standalone TeX"
msgstr "" msgstr ""
@ -49,34 +53,40 @@ msgstr ""
msgid "Divide output coordinates by <SCALE>" msgid "Divide output coordinates by <SCALE>"
msgstr "" msgstr ""
#: ../main.c:314 #: ../main.c:320
#, c-format #, c-format
msgid "Ignored argument: %s" msgid "Ignored argument: %s"
msgstr "" msgstr ""
#: ../main.c:118 #: ../main.c:116
#, c-format #, c-format
msgid "Logo could not be displayed: %s\n" msgid "Logo could not be displayed: %s\n"
msgstr "" msgstr ""
#: ../main.c:294 #: ../main.c:298
#, c-format #, c-format
msgid "Option parsing failed: %s\n" msgid "Option parsing failed: %s\n"
msgstr "" msgstr ""
#: ../main.c:280 #: ../main.c:281
msgid "Output file path. Can be used multiple times." msgid "Output file path. Can be used multiple times."
msgstr "" msgstr ""
#: ../main.c:281 #: ../main.c:282
msgid "Path for Layer Mapping File" msgid "Path for Layer Mapping File"
msgstr "" msgstr ""
#: ../main.c:277 #: ../main.c:287
msgid ""
"Path to a custom shared object, that implements the necessary rendering "
"functions"
msgstr ""
#: ../main.c:276
msgid "Print version" msgid "Print version"
msgstr "" msgstr ""
#: ../main.c:222 #: ../main.c:220
msgid "Quit" msgid "Quit"
msgstr "" msgstr ""
@ -84,19 +94,19 @@ msgstr ""
msgid "Renderer to use. Can be used multiple times." msgid "Renderer to use. Can be used multiple times."
msgstr "" msgstr ""
#: ../main.c:305 #: ../main.c:311
#, c-format #, c-format
msgid "Scale < 1 not allowed. Setting to 1\n" msgid "Scale < 1 not allowed. Setting to 1\n"
msgstr "" msgstr ""
#: ../main.c:215 #: ../main.c:213
#, c-format #, c-format
msgid "" msgid ""
"There is already an open instance. Will open second window in that " "There is already an open instance. Will open second window in that "
"instance.\n" "instance.\n"
msgstr "" msgstr ""
#: ../main.c:247 #: ../main.c:245
#, c-format #, c-format
msgid "" msgid ""
"This is gds-render, version: %s\n" "This is gds-render, version: %s\n"
@ -104,7 +114,7 @@ msgid ""
"For a list of supported commands execute with --help option.\n" "For a list of supported commands execute with --help option.\n"
msgstr "" msgstr ""
#: ../main.c:98 #: ../main.c:96
msgid "" msgid ""
"gds-render is a free tool for rendering GDS2 layout files into vector " "gds-render is a free tool for rendering GDS2 layout files into vector "
"graphics." "graphics."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gds-render VERSION\n" "Project-Id-Version: gds-render VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-22 23:02+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: 2019-10-18 23:10+0200\n" "PO-Revision-Date: 2019-10-18 23:10+0200\n"
"Last-Translator: <mario.huettel@gmx.net>\n" "Last-Translator: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n" "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@ -17,34 +17,34 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../gds-render-gui.c:273 #: ../gds-render-gui.c:275
msgid "Acc. Date" msgid "Acc. Date"
msgstr "Zugr. Datum" msgstr "Zugr. Datum"
#: ../gds-render-gui.c:314 #: ../gds-render-gui.c:318
msgid "Cancel" msgid "Cancel"
msgstr "Abbruch" msgstr "Abbruch"
#: ../gds-render-gui.c:266 #: ../gds-render-gui.c:268
msgid "Cell" msgid "Cell"
msgstr "Zelle" msgstr "Zelle"
#: ../gds-render-gui.c:322 #: ../gds-render-gui.c:326
msgid "GDSII-Files" msgid "GDSII-Files"
msgstr "GDSII-Dateiem" msgstr "GDSII-Dateiem"
#: ../gds-render-gui.c:263 #: ../gds-render-gui.c:265
msgid "Library" msgid "Library"
msgstr "Bibliothek" msgstr "Bibliothek"
#: ../gds-render-gui.c:270 #: ../gds-render-gui.c:272
msgid "Mod. Date" msgid "Mod. Date"
msgstr "Mod. Datum" msgstr "Mod. Datum"
#: ../gds-render-gui.c:315 #: ../gds-render-gui.c:319
msgid "Open GDSII" msgid "Open GDSII"
msgstr "GDSII öffnen" msgstr "GDSII öffnen"
#: ../gds-render-gui.c:312 #: ../gds-render-gui.c:316
msgid "Open GDSII File" msgid "Open GDSII File"
msgstr "GDSII Datei öffnen" msgstr "GDSII Datei öffnen"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gds-render VERSION\n" "Project-Id-Version: gds-render VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-18 23:03+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: 2019-10-18 20:49+0200\n" "PO-Revision-Date: 2019-10-18 20:49+0200\n"
"Last-Translator: <mario.huettel@gmx.net>\n" "Last-Translator: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n" "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../main.c:99 #: ../main.c:97
#, c-format #, c-format
msgid "" msgid ""
"\n" "\n"
@ -28,23 +28,27 @@ msgstr ""
"\n" "\n"
"Vollständige git Commit-ID %s" "Vollständige git Commit-ID %s"
#: ../main.c:289 #: ../main.c:293
msgid " FILE - Convert GDS file <FILE> to graphic" msgid " FILE - Convert GDS file <FILE> to graphic"
msgstr "Datei -- Konvertiere GDS Datei <Datei> zu Vektorgrafik" msgstr "Datei -- Konvertiere GDS Datei <Datei> zu Vektorgrafik"
#: ../main.c:223 #: ../main.c:221
msgid "About" msgid "About"
msgstr "Über" msgstr "Über"
#: ../main.c:282 #: ../main.c:289
msgid "Argument string passed to render lib"
msgstr "Argumente, die an externe Render-Bibliothek weitergegeben werden sollen"
#: ../main.c:283
msgid "Cell to render" msgid "Cell to render"
msgstr "Zu konvertierende Zelle" msgstr "Zu konvertierende Zelle"
#: ../main.c:284 #: ../main.c:285
msgid "Create PDF Layers (OCG)" msgid "Create PDF Layers (OCG)"
msgstr "Generiere PDF Layer (OCG)" msgstr "Generiere PDF Layer (OCG)"
#: ../main.c:283 #: ../main.c:284
msgid "Create standalone TeX" msgid "Create standalone TeX"
msgstr "Generiere alleinstehendes TeX" msgstr "Generiere alleinstehendes TeX"
@ -52,34 +56,41 @@ msgstr "Generiere alleinstehendes TeX"
msgid "Divide output coordinates by <SCALE>" msgid "Divide output coordinates by <SCALE>"
msgstr "Skaliere Ausgabekoordinaten um Faktor <SCALE> herab" msgstr "Skaliere Ausgabekoordinaten um Faktor <SCALE> herab"
#: ../main.c:314 #: ../main.c:320
#, c-format #, c-format
msgid "Ignored argument: %s" msgid "Ignored argument: %s"
msgstr "Ignoriertes Argument: %s" msgstr "Ignoriertes Argument: %s"
#: ../main.c:118 #: ../main.c:116
#, c-format #, c-format
msgid "Logo could not be displayed: %s\n" msgid "Logo could not be displayed: %s\n"
msgstr "Logo konnte nicht angezeigt werden: %s\n" msgstr "Logo konnte nicht angezeigt werden: %s\n"
#: ../main.c:294 #: ../main.c:298
#, c-format #, c-format
msgid "Option parsing failed: %s\n" msgid "Option parsing failed: %s\n"
msgstr "Übergabeparameterkonvertierung fehlgeschlagen: %s\n" msgstr "Übergabeparameterkonvertierung fehlgeschlagen: %s\n"
#: ../main.c:280 #: ../main.c:281
msgid "Output file path. Can be used multiple times." msgid "Output file path. Can be used multiple times."
msgstr "Ausgabedatei. Kann mehrfach angegeben werden." msgstr "Ausgabedatei. Kann mehrfach angegeben werden."
#: ../main.c:281 #: ../main.c:282
msgid "Path for Layer Mapping File" msgid "Path for Layer Mapping File"
msgstr "Pfad zur \"Layer Mapping\"-Datei" msgstr "Pfad zur \"Layer Mapping\"-Datei"
#: ../main.c:277 #: ../main.c:287
msgid ""
"Path to a custom shared object, that implements the necessary rendering "
"functions"
msgstr ""
"Pfad zu einer Programmbibliothek, die die notwendigen Renderingfunktionen bereitstellt"
#: ../main.c:276
msgid "Print version" msgid "Print version"
msgstr "Programmversion aufgeben" msgstr "Programmversion aufgeben"
#: ../main.c:222 #: ../main.c:220
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
@ -87,12 +98,12 @@ msgstr "Beenden"
msgid "Renderer to use. Can be used multiple times." msgid "Renderer to use. Can be used multiple times."
msgstr "Gewünschter Renderer. Kann mehrfach angegeben werden." msgstr "Gewünschter Renderer. Kann mehrfach angegeben werden."
#: ../main.c:305 #: ../main.c:311
#, c-format #, c-format
msgid "Scale < 1 not allowed. Setting to 1\n" msgid "Scale < 1 not allowed. Setting to 1\n"
msgstr "Skalierung < 1 nicht erlaubt. Rückfallwert 1 benutzt.\n" msgstr "Skalierung < 1 nicht erlaubt. Rückfallwert 1 benutzt.\n"
#: ../main.c:215 #: ../main.c:213
#, c-format #, c-format
msgid "" msgid ""
"There is already an open instance. Will open second window in that " "There is already an open instance. Will open second window in that "
@ -101,7 +112,7 @@ msgstr ""
"Es is bereits eine Instanz dieses Programms geöffnet. Ein weiteres Fenster " "Es is bereits eine Instanz dieses Programms geöffnet. Ein weiteres Fenster "
"in dieser wird geöffnet.\n" "in dieser wird geöffnet.\n"
#: ../main.c:247 #: ../main.c:245
#, c-format #, c-format
msgid "" msgid ""
"This is gds-render, version: %s\n" "This is gds-render, version: %s\n"
@ -113,7 +124,7 @@ msgstr ""
"Um eine Liste der unterstützten Befehle zu erhalten, bitte mit der Option --" "Um eine Liste der unterstützten Befehle zu erhalten, bitte mit der Option --"
"help ausführen.\n" "help ausführen.\n"
#: ../main.c:98 #: ../main.c:96
msgid "" msgid ""
"gds-render is a free tool for rendering GDS2 layout files into vector " "gds-render is a free tool for rendering GDS2 layout files into vector "
"graphics." "graphics."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-25 20:27+0200\n" "POT-Creation-Date: 2019-11-15 20:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"