From 74dfbd9b34a3eb1a2f2298be217825c836e63afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 12 Nov 2019 19:12:57 +0100 Subject: [PATCH 01/40] Add preliminary construct for plugin renderers (shared object renderers) --- CMakeLists.txt | 1 + doxygen/CMakeLists.txt | 2 +- plugins/CMakeLists.txt | 2 ++ plugins/python-renderer/CMakeLists.txt | 12 ++++++++++++ plugins/python-renderer/src/plugin-main.c | 7 +++++++ 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 plugins/CMakeLists.txt create mode 100644 plugins/python-renderer/CMakeLists.txt create mode 100644 plugins/python-renderer/src/plugin-main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bbfb23..3b5541b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmayb add_subdirectory(resources) add_subdirectory(doxygen) add_subdirectory(version) +add_subdirectory(plugins) 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}) diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt index 65b4801..4f06fef 100644 --- a/doxygen/CMakeLists.txt +++ b/doxygen/CMakeLists.txt @@ -6,5 +6,5 @@ if (DOXYGEN_FOUND) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating documentation with Doxygen") else (DOXYGEN_FOUND) - message("Doxygen need to be installed to generate the doxygen documentation") + message("Doxygen needs to be installed to generate the doxygen documentation") endif (DOXYGEN_FOUND) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt new file mode 100644 index 0000000..77f6100 --- /dev/null +++ b/plugins/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(python-renderer) +add_custom_target(plugins DEPENDS pythonrenderer) diff --git a/plugins/python-renderer/CMakeLists.txt b/plugins/python-renderer/CMakeLists.txt new file mode 100644 index 0000000..51e804f --- /dev/null +++ b/plugins/python-renderer/CMakeLists.txt @@ -0,0 +1,12 @@ +project(pythonrenderer) +cmake_minimum_required(VERSION 2.8) +find_package(PkgConfig REQUIRED) +pkg_search_module(PYTHON REQUIRED python3) + +aux_source_directory(src SOURCES) + +include_directories(${PYTHON_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include) +link_libraries(${PYTHON_LDFLAGS} version) + +add_library(${PROJECT_NAME} SHARED EXCLUDE_FROM_ALL ${SOURCES}) +add_dependencies(${PROJECT_NAME} version) diff --git a/plugins/python-renderer/src/plugin-main.c b/plugins/python-renderer/src/plugin-main.c new file mode 100644 index 0000000..dbcb3a3 --- /dev/null +++ b/plugins/python-renderer/src/plugin-main.c @@ -0,0 +1,7 @@ +#include +#include + +int a(void) +{ + return 0; +} From 4cc31c81e30a62bb26ca02b673da96aa11c233fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 12 Nov 2019 19:14:58 +0100 Subject: [PATCH 02/40] Move plugins in CMakeLists.txt so they don't need to fullfil all warnign restrictions of the main application --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b5541b..d67f39e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,12 +6,13 @@ pkg_search_module(GLIB REQUIRED glib-2.0) pkg_check_modules(GTK3 REQUIRED gtk+-3.0) pkg_check_modules(CAIRO REQUIRED cairo) +add_subdirectory(plugins) + add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter) add_subdirectory(resources) add_subdirectory(doxygen) add_subdirectory(version) -add_subdirectory(plugins) 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}) From 58a0bd85c4070f3cea2fcb9ffa377e92878418b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 12 Nov 2019 19:50:34 +0100 Subject: [PATCH 03/40] Improve Cmake target for translations. Still not perfect. --- translations/CMakeLists.txt | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt index a181f7b..c553dee 100644 --- a/translations/CMakeLists.txt +++ b/translations/CMakeLists.txt @@ -1,4 +1,16 @@ -add_custom_target(translations ALL - COMMAND ./generate-mo.sh "${PROJECT_BINARY_DIR}/translations/output" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Generating translation locales") +add_custom_target(translations + DEPENDS + "${PROJECT_BINARY_DIR}/translations/output/" + ) + +add_custom_command(DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/pot/po/*" + OUTPUT + "${PROJECT_BINARY_DIR}/translations/output/" + COMMAND + COMMAND ./generate-mo.sh "${PROJECT_BINARY_DIR}/translations/output" + WORKING_DIRECTORY + ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT + "Generating translation locales" + ) From f15e82b5dc262d9924c48bac7b5015ee2841ddb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 12 Nov 2019 20:52:42 +0100 Subject: [PATCH 04/40] Modify External Renderer: External renderer docu updated for future changes, restructuring. Not that the changes in the documentation are not yet implemented in code --- doxygen/external-renderer.dox | 10 ++++ .../external-renderer-interfaces.h | 46 +++++++++++++++++++ .../output-renderers/external-renderer.h | 11 +---- main.c | 2 +- output-renderers/external-renderer.c | 2 +- 5 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 include/gds-render/output-renderers/external-renderer-interfaces.h diff --git a/doxygen/external-renderer.dox b/doxygen/external-renderer.dox index 2211729..e60e9e5 100644 --- a/doxygen/external-renderer.dox +++ b/doxygen/external-renderer.dox @@ -12,4 +12,14 @@ * * 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 + * */ diff --git a/include/gds-render/output-renderers/external-renderer-interfaces.h b/include/gds-render/output-renderers/external-renderer-interfaces.h new file mode 100644 index 0000000..a2e5c2f --- /dev/null +++ b/include/gds-render/output-renderers/external-renderer-interfaces.h @@ -0,0 +1,46 @@ +#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 + +/** @} */ + +#endif /* __EXTERNAL_RENDERER_INTERFACES_H__ */ diff --git a/include/gds-render/output-renderers/external-renderer.h b/include/gds-render/output-renderers/external-renderer.h index 8285fa7..70877e7 100644 --- a/include/gds-render/output-renderers/external-renderer.h +++ b/include/gds-render/output-renderers/external-renderer.h @@ -33,6 +33,7 @@ #include #include +#include G_BEGIN_DECLS @@ -40,16 +41,6 @@ G_BEGIN_DECLS 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 * @return New object diff --git a/main.c b/main.c index 9d12c47..f0e747e 100644 --- a/main.c +++ b/main.c @@ -285,7 +285,7 @@ int main(int argc, char **argv) {"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 }, {"custom-render-lib", 'P', 0, G_OPTION_ARG_FILENAME, &custom_library_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} }; diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index 0e6d000..eafdafc 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -80,7 +80,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * /* Load symbol from library */ 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(); if (error_msg != NULL) { fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg); From f1534859961e26eee4fe0fa6d02323b66fdd02ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 12 Nov 2019 21:15:36 +0100 Subject: [PATCH 05/40] Implement base construct of new external renderer. CLI parameters still not implemented. Currently NULL is passed to init func. Forking implemented but not tested --- output-renderers/external-renderer.c | 54 ++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index eafdafc..718653d 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -30,8 +30,12 @@ #include #include +#include #include +#include + +#define FORCE_FORK 0U /**< @brief if != 0, then forking is forced regardless of the shared object's settings */ struct _ExternalRenderer { GdsOutputRenderer parent; @@ -58,9 +62,13 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * const char *output_file, double scale, const char *so_path) { 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; char *error_msg; + int forking_req; int ret = 0; + pid_t fork_pid = 0; + int forked_status; if (!so_path) { fprintf(stderr, "Path to shared object not set!\n"); @@ -78,7 +86,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * return -2000; } - /* Load symbol from library */ + /* Load rendering symbol from library */ so_render_func = (int (*)(struct gds_cell *, GList *, const char *, double)) dlsym(so_handle, xstr(EXTERNAL_LIBRARY_RENDER_FUNCTION)); error_msg = dlerror(); @@ -87,13 +95,47 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * goto ret_close_so_handle; } - /* Execute */ - if (so_render_func) { - g_message("Calling external renderer."); - ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale); - g_message("External renderer finished."); + /* Load the init function */ + so_init_func = (int (*)(const char *, const char *))dlsym(so_handle, xstr(EXTERNAL_LIBRARY_INIT_FUNCTION)); + error_msg = dlerror(); + if (error_msg != NULL) { + 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; + + // TODO: Get parameters form command line and pass here + ret = so_init_func(NULL, _app_version_string); + if (!ret) + ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale); + + if (forking_req) + exit(ret); + +end_forked: + if (forking_req) { + waitpid(fork_pid, &forked_status, 0); + ret = WEXITSTATUS(forked_status); + } + + g_message("External renderer finished."); + ret_close_so_handle: dlclose(so_handle); return ret; From 9899b94db606817555e1cffda6c397612e69d199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 14 Nov 2019 19:31:57 +0100 Subject: [PATCH 06/40] cmake: rework source list for generated files --- CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 62581a1..ff63981 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,11 +68,17 @@ set(SOURCE ${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} version) 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}) install (TARGETS ${PROJECT_NAME} RUNTIME From 3d5c4daad96d9523761691cc39159d95b61b360d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 14 Nov 2019 19:32:54 +0100 Subject: [PATCH 07/40] 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 --- CMakeLists.txt | 2 -- doxygen/CMakeLists.txt | 13 +++++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ff63981..14ca6ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,5 +84,3 @@ install (TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin ) - -add_custom_target(documentation DEPENDS doxygen) diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt index 65b4801..83a2a2b 100644 --- a/doxygen/CMakeLists.txt +++ b/doxygen/CMakeLists.txt @@ -1,10 +1,19 @@ find_package(Doxygen) if (DOXYGEN_FOUND) - add_custom_target(doxygen + add_custom_target(documentation DEPENDS doxygen doxygen-pdf) + + add_custom_target(doxygen COMMAND ./build-doxygen.sh "${PROJECT_BINARY_DIR}" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Generating documentation with Doxygen") + + add_custom_target( + doxygen-pdf + COMMAND make + WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/latex" + DEPENDS doxygen + ) else (DOXYGEN_FOUND) - message("Doxygen need to be installed to generate the doxygen documentation") + message("Doxygen need to be installed to generate the doxygen documentation") endif (DOXYGEN_FOUND) From e7f0f904e85f710a044d5429e1fd8919b2b12121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 14 Nov 2019 23:39:12 +0100 Subject: [PATCH 08/40] main: Free command line option context, add comment for freeing all the command line parameter data --- main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index ffe948d..1feaa54 100644 --- a/main.c +++ b/main.c @@ -290,6 +290,8 @@ int main(int argc, char **argv) exit(1); } + g_option_context_free(context); + if (version) { print_version(); goto ret_status; @@ -317,7 +319,10 @@ int main(int argc, char **argv) } 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) g_strfreev(output_paths); if (renderer_args) From 374a893dda945e3d689108f40c4f78f8231f145a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 20:31:57 +0100 Subject: [PATCH 09/40] Add W option to command line parser for external renderer parameters --- main.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index a486450..68e9138 100644 --- a/main.c +++ b/main.c @@ -23,8 +23,6 @@ * @author Mario Hüttel */ - - #include #include #include @@ -263,6 +261,7 @@ int main(int argc, char **argv) gchar **output_paths = NULL; gchar *mappingname = NULL; gchar *cellname = NULL; + gchar *render_lib_param_string = NULL; gchar **renderer_args = NULL; gboolean version = FALSE, pdf_standalone = FALSE, pdf_layers = FALSE; gchar *custom_library_path = NULL; @@ -285,8 +284,10 @@ int main(int argc, char **argv) {"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 }, {"custom-render-lib", 'P', 0, G_OPTION_ARG_FILENAME, &custom_library_path, - "Path to a custom shared object, that implements the necessary rendering functions", "PATH"}, - {NULL} + _("Path to a custom shared object, that implements the necessary rendering functions"), "PATH"}, + {"render-lib-params", 'W', 0, G_OPTION_ARG_STRING, &render_lib_param_string, + _("Argument string passed to render lib"), NULL}, + {NULL, 0, 0, 0, NULL, NULL, NULL} }; context = g_option_context_new(_(" FILE - Convert GDS file to graphic")); @@ -341,6 +342,8 @@ ret_status: free(cellname); if (custom_library_path) free(custom_library_path); + if (render_lib_param_string) + g_free(render_lib_param_string); return app_status; } From f02a720f996a21de818fa17000d890bae7bb5172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 20:35:36 +0100 Subject: [PATCH 10/40] Uodate translations of main.c --- translations/pot/command-line.pot | 2 +- translations/pot/gds-render-gui.pot | 18 ++++---- translations/pot/main.pot | 52 ++++++++++++++--------- translations/pot/po/de/gds-render-gui.po | 18 ++++---- translations/pot/po/de/main.po | 47 ++++++++++++-------- translations/pot/widgets_activity-bar.pot | 2 +- 6 files changed, 80 insertions(+), 59 deletions(-) diff --git a/translations/pot/command-line.pot b/translations/pot/command-line.pot index 01569ed..045ac8f 100644 --- a/translations/pot/command-line.pot +++ b/translations/pot/command-line.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/gds-render-gui.pot b/translations/pot/gds-render-gui.pot index 3f8cd5a..be00c00 100644 --- a/translations/pot/gds-render-gui.pot +++ b/translations/pot/gds-render-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,34 +17,34 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gds-render-gui.c:273 +#: ../gds-render-gui.c:275 msgid "Acc. Date" msgstr "" -#: ../gds-render-gui.c:314 +#: ../gds-render-gui.c:318 msgid "Cancel" msgstr "" -#: ../gds-render-gui.c:266 +#: ../gds-render-gui.c:268 msgid "Cell" msgstr "" -#: ../gds-render-gui.c:322 +#: ../gds-render-gui.c:326 msgid "GDSII-Files" msgstr "" -#: ../gds-render-gui.c:263 +#: ../gds-render-gui.c:265 msgid "Library" msgstr "" -#: ../gds-render-gui.c:270 +#: ../gds-render-gui.c:272 msgid "Mod. Date" msgstr "" -#: ../gds-render-gui.c:315 +#: ../gds-render-gui.c:319 msgid "Open GDSII" msgstr "" -#: ../gds-render-gui.c:312 +#: ../gds-render-gui.c:316 msgid "Open GDSII File" msgstr "" diff --git a/translations/pot/main.pot b/translations/pot/main.pot index 141a115..a7fa9b6 100644 --- a/translations/pot/main.pot +++ b/translations/pot/main.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../main.c:99 +#: ../main.c:97 #, c-format msgid "" "\n" @@ -25,23 +25,27 @@ msgid "" "Full git commit: %s" msgstr "" -#: ../main.c:289 +#: ../main.c:293 msgid " FILE - Convert GDS file to graphic" msgstr "" -#: ../main.c:223 +#: ../main.c:221 msgid "About" msgstr "" -#: ../main.c:282 -msgid "Cell to render" -msgstr "" - -#: ../main.c:284 -msgid "Create PDF Layers (OCG)" +#: ../main.c:289 +msgid "Argument string passed to render lib" msgstr "" #: ../main.c:283 +msgid "Cell to render" +msgstr "" + +#: ../main.c:285 +msgid "Create PDF Layers (OCG)" +msgstr "" + +#: ../main.c:284 msgid "Create standalone TeX" msgstr "" @@ -49,34 +53,40 @@ msgstr "" msgid "Divide output coordinates by " msgstr "" -#: ../main.c:314 +#: ../main.c:320 #, c-format msgid "Ignored argument: %s" msgstr "" -#: ../main.c:118 +#: ../main.c:116 #, c-format msgid "Logo could not be displayed: %s\n" msgstr "" -#: ../main.c:294 +#: ../main.c:298 #, c-format msgid "Option parsing failed: %s\n" msgstr "" -#: ../main.c:280 +#: ../main.c:281 msgid "Output file path. Can be used multiple times." msgstr "" -#: ../main.c:281 +#: ../main.c:282 msgid "Path for Layer Mapping File" 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" msgstr "" -#: ../main.c:222 +#: ../main.c:220 msgid "Quit" msgstr "" @@ -84,19 +94,19 @@ msgstr "" msgid "Renderer to use. Can be used multiple times." msgstr "" -#: ../main.c:305 +#: ../main.c:311 #, c-format msgid "Scale < 1 not allowed. Setting to 1\n" msgstr "" -#: ../main.c:215 +#: ../main.c:213 #, c-format msgid "" "There is already an open instance. Will open second window in that " "instance.\n" msgstr "" -#: ../main.c:247 +#: ../main.c:245 #, c-format msgid "" "This is gds-render, version: %s\n" @@ -104,7 +114,7 @@ msgid "" "For a list of supported commands execute with --help option.\n" msgstr "" -#: ../main.c:98 +#: ../main.c:96 msgid "" "gds-render is a free tool for rendering GDS2 layout files into vector " "graphics." diff --git a/translations/pot/po/de/gds-render-gui.po b/translations/pot/po/de/gds-render-gui.po index 8ea66bc..78880de 100644 --- a/translations/pot/po/de/gds-render-gui.po +++ b/translations/pot/po/de/gds-render-gui.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gds-render VERSION\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" "Last-Translator: \n" "Language-Team: German \n" @@ -17,34 +17,34 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../gds-render-gui.c:273 +#: ../gds-render-gui.c:275 msgid "Acc. Date" msgstr "Zugr. Datum" -#: ../gds-render-gui.c:314 +#: ../gds-render-gui.c:318 msgid "Cancel" msgstr "Abbruch" -#: ../gds-render-gui.c:266 +#: ../gds-render-gui.c:268 msgid "Cell" msgstr "Zelle" -#: ../gds-render-gui.c:322 +#: ../gds-render-gui.c:326 msgid "GDSII-Files" msgstr "GDSII-Dateiem" -#: ../gds-render-gui.c:263 +#: ../gds-render-gui.c:265 msgid "Library" msgstr "Bibliothek" -#: ../gds-render-gui.c:270 +#: ../gds-render-gui.c:272 msgid "Mod. Date" msgstr "Mod. Datum" -#: ../gds-render-gui.c:315 +#: ../gds-render-gui.c:319 msgid "Open GDSII" msgstr "GDSII öffnen" -#: ../gds-render-gui.c:312 +#: ../gds-render-gui.c:316 msgid "Open GDSII File" msgstr "GDSII Datei öffnen" diff --git a/translations/pot/po/de/main.po b/translations/pot/po/de/main.po index ec2d9a6..7be4bed 100644 --- a/translations/pot/po/de/main.po +++ b/translations/pot/po/de/main.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gds-render VERSION\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" "Last-Translator: \n" "Language-Team: German \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../main.c:99 +#: ../main.c:97 #, c-format msgid "" "\n" @@ -28,23 +28,27 @@ msgstr "" "\n" "Vollständige git Commit-ID %s" -#: ../main.c:289 +#: ../main.c:293 msgid " FILE - Convert GDS file to graphic" msgstr "Datei -- Konvertiere GDS Datei zu Vektorgrafik" -#: ../main.c:223 +#: ../main.c:221 msgid "About" 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" msgstr "Zu konvertierende Zelle" -#: ../main.c:284 +#: ../main.c:285 msgid "Create PDF Layers (OCG)" msgstr "Generiere PDF Layer (OCG)" -#: ../main.c:283 +#: ../main.c:284 msgid "Create standalone TeX" msgstr "Generiere alleinstehendes TeX" @@ -52,34 +56,41 @@ msgstr "Generiere alleinstehendes TeX" msgid "Divide output coordinates by " msgstr "Skaliere Ausgabekoordinaten um Faktor herab" -#: ../main.c:314 +#: ../main.c:320 #, c-format msgid "Ignored argument: %s" msgstr "Ignoriertes Argument: %s" -#: ../main.c:118 +#: ../main.c:116 #, c-format msgid "Logo could not be displayed: %s\n" msgstr "Logo konnte nicht angezeigt werden: %s\n" -#: ../main.c:294 +#: ../main.c:298 #, c-format msgid "Option parsing failed: %s\n" msgstr "Übergabeparameterkonvertierung fehlgeschlagen: %s\n" -#: ../main.c:280 +#: ../main.c:281 msgid "Output file path. Can be used multiple times." msgstr "Ausgabedatei. Kann mehrfach angegeben werden." -#: ../main.c:281 +#: ../main.c:282 msgid "Path for Layer Mapping File" 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" msgstr "Programmversion aufgeben" -#: ../main.c:222 +#: ../main.c:220 msgid "Quit" msgstr "Beenden" @@ -87,12 +98,12 @@ msgstr "Beenden" msgid "Renderer to use. Can be used multiple times." msgstr "Gewünschter Renderer. Kann mehrfach angegeben werden." -#: ../main.c:305 +#: ../main.c:311 #, c-format msgid "Scale < 1 not allowed. Setting to 1\n" msgstr "Skalierung < 1 nicht erlaubt. Rückfallwert 1 benutzt.\n" -#: ../main.c:215 +#: ../main.c:213 #, c-format msgid "" "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 " "in dieser wird geöffnet.\n" -#: ../main.c:247 +#: ../main.c:245 #, c-format msgid "" "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 --" "help ausführen.\n" -#: ../main.c:98 +#: ../main.c:96 msgid "" "gds-render is a free tool for rendering GDS2 layout files into vector " "graphics." diff --git a/translations/pot/widgets_activity-bar.pot b/translations/pot/widgets_activity-bar.pot index 9adf407..aed3280 100644 --- a/translations/pot/widgets_activity-bar.pot +++ b/translations/pot/widgets_activity-bar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\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" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From c186d3cdb3032fc5777ceb9e17d3445296d9821f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 20:50:46 +0100 Subject: [PATCH 11/40] Pass command line parameters for shared object renderer to command line convert struct --- command-line.c | 10 +++++----- include/gds-render/command-line.h | 19 +++++++++++++++++-- main.c | 20 +++++++++++--------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/command-line.c b/command-line.c index 3a50128..3953fa7 100644 --- a/command-line.c +++ b/command-line.c @@ -56,7 +56,7 @@ static int create_renderers(char **renderers, char **output_file_names, gboolean tex_layers, gboolean tex_standalone, - const char *so_path, + const struct external_renderer_params *ext_params, GList **renderer_list, LayerSettings *layer_settings) { @@ -100,11 +100,11 @@ static int create_renderers(char **renderers, } else if (!strcmp(current_renderer, "svg")) { output_renderer = GDS_RENDER_OUTPUT_RENDERER(cairo_renderer_new_svg()); } 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")); 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(ext_params->so_path)); } else { continue; } @@ -138,7 +138,7 @@ int command_line_convert_gds(const char *gds_name, char **renderers, char **output_file_names, const char *layer_file, - const char *so_path, + struct external_renderer_params *ext_param, gboolean tex_standalone, gboolean tex_layers, double scale) @@ -165,7 +165,7 @@ int command_line_convert_gds(const char *gds_name, /* Create renderers */ 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; diff --git a/include/gds-render/command-line.h b/include/gds-render/command-line.h index fc1871e..e20bf77 100644 --- a/include/gds-render/command-line.h +++ b/include/gds-render/command-line.h @@ -33,6 +33,21 @@ #include +/** + * @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 * @param gds_name Path to GDS File @@ -40,7 +55,7 @@ * @param renderers Renderer ids * @param output_file_names Output file names * @param layer_file Layer mapping file - * @param so_path Shared object + * @param ext_params Settings for external library renderer * @param tex_standalone Standalone TeX * @param tex_layers TeX OCR layers * @param scale Scale value @@ -51,7 +66,7 @@ int command_line_convert_gds(const char *gds_name, char **renderers, char **output_file_names, const char *layer_file, - const char *so_path, + struct external_renderer_params *ext_param, gboolean tex_standalone, gboolean tex_layers, double scale); diff --git a/main.c b/main.c index 68e9138..b4c6cde 100644 --- a/main.c +++ b/main.c @@ -261,12 +261,14 @@ int main(int argc, char **argv) gchar **output_paths = NULL; gchar *mappingname = NULL; gchar *cellname = NULL; - gchar *render_lib_param_string = NULL; gchar **renderer_args = NULL; gboolean version = FALSE, pdf_standalone = FALSE, pdf_layers = FALSE; - gchar *custom_library_path = NULL; int scale = 1000; 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"); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); @@ -283,9 +285,9 @@ int main(int argc, char **argv) {"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-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 necessary rendering functions"), "PATH"}, - {"render-lib-params", 'W', 0, G_OPTION_ARG_STRING, &render_lib_param_string, + {"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} }; @@ -321,7 +323,7 @@ int main(int argc, char **argv) app_status = 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 { app_status = start_gui(argc, argv); @@ -340,10 +342,10 @@ ret_status: g_free(mappingname); if (cellname) free(cellname); - if (custom_library_path) - free(custom_library_path); - if (render_lib_param_string) - g_free(render_lib_param_string); + if (so_render_params.so_path) + free(so_render_params.so_path); + if (so_render_params.cli_params) + g_free(so_render_params.cli_params); return app_status; } From 041778487754c08521fca7efba96329878dce8d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 21:04:59 +0100 Subject: [PATCH 12/40] Add property for command line parameters to external renderer --- doxygen/external-renderer.dox | 1 + output-renderers/external-renderer.c | 30 +++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/doxygen/external-renderer.dox b/doxygen/external-renderer.dox index e60e9e5..5059e79 100644 --- a/doxygen/external-renderer.dox +++ b/doxygen/external-renderer.dox @@ -9,6 +9,7 @@ * Property Name | Description * -----------------|---------------------------------------------------------------- * 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. * diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index 718653d..46b96cd 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -40,10 +40,12 @@ struct _ExternalRenderer { GdsOutputRenderer parent; char *shared_object_path; + char *cli_param_string; }; enum { 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 */ }; @@ -56,10 +58,11 @@ G_DEFINE_TYPE(ExternalRenderer, external_renderer, GDS_RENDER_TYPE_OUTPUT_RENDER * @param output_file Destination file * @param scale the scaling value to scale the output cell down by. * @param so_path Path to shared object + * @param params Parameters passed to EXTERNAL_LIBRARY_INIT_FUNCTION * @return 0 if successful */ 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_init_func)(const char *, const char *) = NULL; @@ -120,8 +123,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * if (fork_pid != 0) goto end_forked; - // TODO: Get parameters form command line and pass here - ret = so_init_func(NULL, _app_version_string); + ret = so_init_func(params, _app_version_string); if (!ret) ret = so_render_func(toplevel_cell, layer_info_list, output_file, scale); @@ -158,7 +160,8 @@ static int external_renderer_render_output(GdsOutputRenderer *renderer, if (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) g_object_unref(settings); @@ -175,6 +178,9 @@ static void external_renderer_get_property(GObject *obj, guint property_id, GVal case PROP_SO_PATH: g_value_set_string(value, self->shared_object_path); break; + case PROP_PARAM_STRING: + g_value_set_string(value, self->cli_param_string); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; @@ -193,6 +199,11 @@ static void external_renderer_set_property(GObject *obj, guint property_id, cons g_free(self->shared_object_path); self->shared_object_path = g_value_dup_string(value); 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: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec); break; @@ -201,7 +212,9 @@ static void external_renderer_set_property(GObject *obj, guint property_id, cons 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) { g_free(self->shared_object_path); @@ -236,12 +249,19 @@ static void external_renderer_class_init(ExternalRendererClass *klass) "Path to the shared object to search rendering function in.", NULL, 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); } static void external_renderer_init(ExternalRenderer *self) { self->shared_object_path = NULL; + self->cli_param_string = NULL; } ExternalRenderer *external_renderer_new() From fa1a78e54c37fbd2131e6185105520ca7993e333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 21:06:41 +0100 Subject: [PATCH 13/40] Edit comments --- output-renderers/external-renderer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index 46b96cd..6ec1071 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -127,9 +127,11 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * 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); From efb1af7ee06d8fac934ec3e1d50553f783b7f1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 21:11:41 +0100 Subject: [PATCH 14/40] Complete chain of passing command line parameters to external renderer --- command-line.c | 4 +++- include/gds-render/output-renderers/external-renderer.h | 3 ++- output-renderers/external-renderer.c | 5 +++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/command-line.c b/command-line.c index 3953fa7..8bfc8e2 100644 --- a/command-line.c +++ b/command-line.c @@ -104,7 +104,9 @@ static int create_renderers(char **renderers, fprintf(stderr, _("Please specify shared object for external renderer. Will ignore this renderer.\n")); continue; } - output_renderer = GDS_RENDER_OUTPUT_RENDERER(external_renderer_new_with_so(ext_params->so_path)); + output_renderer = GDS_RENDER_OUTPUT_RENDERER( + external_renderer_new_with_so_and_param(ext_params->so_path, + ext_params->cli_params)); } else { continue; } diff --git a/include/gds-render/output-renderers/external-renderer.h b/include/gds-render/output-renderers/external-renderer.h index 70877e7..271752b 100644 --- a/include/gds-render/output-renderers/external-renderer.h +++ b/include/gds-render/output-renderers/external-renderer.h @@ -50,9 +50,10 @@ ExternalRenderer *external_renderer_new(); /** * @brief Create new ExternalRenderer object with specified shared object path * @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. */ -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 diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index 6ec1071..f79edb8 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -271,9 +271,10 @@ ExternalRenderer *external_renderer_new() 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); } /** @} */ From 3b6837b886ebe2767710fdf642db9aa738c51283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 21:33:55 +0100 Subject: [PATCH 15/40] Rename python renderer to plugin example and leave it be as a template --- CMakeLists.txt | 2 +- .../external-renderer-interfaces.h | 5 +++++ plugins/CMakeLists.txt | 4 ++-- .../CMakeLists.txt | 2 +- plugins/plugin-example/src/plugin-main.c | 19 +++++++++++++++++++ plugins/python-renderer/src/plugin-main.c | 7 ------- 6 files changed, 28 insertions(+), 11 deletions(-) rename plugins/{python-renderer => plugin-example}/CMakeLists.txt (94%) create mode 100644 plugins/plugin-example/src/plugin-main.c delete mode 100644 plugins/python-renderer/src/plugin-main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b8e1aa5..c8a4e11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ pkg_search_module(GLIB REQUIRED glib-2.0) pkg_check_modules(GTK3 REQUIRED gtk+-3.0) 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_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter) @@ -48,7 +49,6 @@ add_subdirectory(doxygen) add_subdirectory(translations) 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}) add_definitions(${GLIB2_CFLAGS_OTHER}) diff --git a/include/gds-render/output-renderers/external-renderer-interfaces.h b/include/gds-render/output-renderers/external-renderer-interfaces.h index a2e5c2f..509d029 100644 --- a/include/gds-render/output-renderers/external-renderer-interfaces.h +++ b/include/gds-render/output-renderers/external-renderer-interfaces.h @@ -41,6 +41,11 @@ */ #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__ */ diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 77f6100..5064828 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,2 +1,2 @@ -add_subdirectory(python-renderer) -add_custom_target(plugins DEPENDS pythonrenderer) +add_subdirectory(plugin-example) +add_custom_target(plugins DEPENDS pluginexample) diff --git a/plugins/python-renderer/CMakeLists.txt b/plugins/plugin-example/CMakeLists.txt similarity index 94% rename from plugins/python-renderer/CMakeLists.txt rename to plugins/plugin-example/CMakeLists.txt index 51e804f..6018e7b 100644 --- a/plugins/python-renderer/CMakeLists.txt +++ b/plugins/plugin-example/CMakeLists.txt @@ -1,4 +1,4 @@ -project(pythonrenderer) +project(pluginexample) cmake_minimum_required(VERSION 2.8) find_package(PkgConfig REQUIRED) pkg_search_module(PYTHON REQUIRED python3) diff --git a/plugins/plugin-example/src/plugin-main.c b/plugins/plugin-example/src/plugin-main.c new file mode 100644 index 0000000..829daea --- /dev/null +++ b/plugins/plugin-example/src/plugin-main.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +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; +} diff --git a/plugins/python-renderer/src/plugin-main.c b/plugins/python-renderer/src/plugin-main.c deleted file mode 100644 index dbcb3a3..0000000 --- a/plugins/python-renderer/src/plugin-main.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int a(void) -{ - return 0; -} From 1b1f742ae110685ba3c589a36accce4d61c77945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 15 Nov 2019 21:39:33 +0100 Subject: [PATCH 16/40] Fix doxygen for command line header --- include/gds-render/command-line.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gds-render/command-line.h b/include/gds-render/command-line.h index e20bf77..242981d 100644 --- a/include/gds-render/command-line.h +++ b/include/gds-render/command-line.h @@ -55,7 +55,7 @@ struct external_renderer_params { * @param renderers Renderer ids * @param output_file_names Output file names * @param layer_file Layer mapping file - * @param ext_params Settings for external library renderer + * @param ext_param Settings for external library renderer * @param tex_standalone Standalone TeX * @param tex_layers TeX OCR layers * @param scale Scale value From 0c20db39bdbfbedb2ae55be466724272cc8462f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 16 Nov 2019 15:54:56 +0100 Subject: [PATCH 17/40] Update documentation and implementations of bounding box calculations. Rename functions to fit their behavior --- geometric/bounding-box.c | 46 ++++++++++----- geometric/cell-geometrics.c | 2 +- include/gds-render/geometric/bounding-box.h | 65 ++++++++++++++++++++- 3 files changed, 96 insertions(+), 17 deletions(-) diff --git a/geometric/bounding-box.c b/geometric/bounding-box.c index 32fb5b5..a37dda4 100644 --- a/geometric/bounding-box.c +++ b/geometric/bounding-box.c @@ -145,7 +145,7 @@ static void calculate_path_miter_points(struct vector_2d *a, struct vector_2d *b vector_2d_subtract(m2, m2, &v_vec); } -void bounding_box_calculate_path_box(GList *vertices, double thickness, +void bounding_box_update_with_path(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box) { GList *vertex_iterator; @@ -191,24 +191,40 @@ void bounding_box_update_point(union bounding_box *destination, conv_generic_to_ destination->vectors.upper_right.y = MAX(destination->vectors.upper_right.y, point.y); } -/** - * @brief Apply transformations onto bounding box. - * @param scale Scaling factor - * @param rotation_deg Roation of bounding box around the origin in degrees (counterclockwise) - * @param flip_at_x Flip the boundig box on the x axis before rotating. - * @param box Bounding box the operations should be applied to. - */ +void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *box) +{ + if (!points || !box) + return; + + points[0].x = box->vectors.lower_left.x; + points[0].y = box->vectors.lower_left.y; + points[1].x = box->vectors.upper_right.x; + points[1].y = box->vectors.lower_left.y; + points[2].x = box->vectors.upper_right.x; + points[2].y = box->vectors.upper_right.y; + points[3].x = box->vectors.lower_left.x; + points[3].y = box->vectors.upper_right.y; +} + void bounding_box_apply_transform(double scale, double rotation_deg, bool flip_at_x, union bounding_box *box) { int i; + struct vector_2d input_points[4]; - /* Due to linearity, the order of the operations does not matter. - * flip must be applied before rotation as defined by the GDS format - */ - for (i = 0; i < 2; i++) { - box->vector_array[i].y *= (flip_at_x ? -1 : 1); - vector_2d_rotate(&box->vector_array[i], rotation_deg * M_PI / 180); - vector_2d_scale(&box->vector_array[i], scale); + if (!box) + return; + + bounding_box_get_all_points(input_points, box); + + /* Reset box */ + bounding_box_prepare_empty(box); + + for (i = 0; i < 4; i++) { + input_points[i].y *= (flip_at_x ? -1 : 1); + vector_2d_rotate(&input_points[i], rotation_deg * M_PI / 180.0); + vector_2d_scale(&input_points[i], scale); + + bounding_box_update_point(box, NULL, &input_points[i]); } } diff --git a/geometric/cell-geometrics.c b/geometric/cell-geometrics.c index 0d7ac71..ee86ae2 100644 --- a/geometric/cell-geometrics.c +++ b/geometric/cell-geometrics.c @@ -63,7 +63,7 @@ static void update_box_with_gfx(union bounding_box *box, struct gds_graphics *gf * Please be aware if paths are the outmost elements of your cell. * You might end up with a completely wrong calculated cell size. */ - bounding_box_calculate_path_box(gfx->vertices, gfx->width_absolute, + bounding_box_update_with_path(gfx->vertices, gfx->width_absolute, (conv_generic_to_vector_2d_t)&convert_gds_point_to_2d_vector, ¤t_box); break; diff --git a/include/gds-render/geometric/bounding-box.h b/include/gds-render/geometric/bounding-box.h index b68bec7..c12030a 100644 --- a/include/gds-render/geometric/bounding-box.h +++ b/include/gds-render/geometric/bounding-box.h @@ -46,12 +46,75 @@ union bounding_box { typedef void (*conv_generic_to_vector_2d_t)(void *, struct vector_2d *); +/** + * @brief Calculate bounding box of polygon + * @param vertices List of vertices that describe the polygon + * @param conv_func Conversion function to convert vertices to vector_2d structs. + * @param box Box to write to. This box is not updated! All previous data is discarded + */ void bounding_box_calculate_polygon(GList *vertices, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); + +/** + * @brief Update an exisitng bounding box with another one. + * @param destination Target box to update + * @param update Box to update the target with + */ void bounding_box_update_box(union bounding_box *destination, union bounding_box *update); + +/** + * @brief Prepare an empty bounding box. + * + * Updating this specially prepared box, results in a bounding box that is the same size as the update + * + * @param box Box to preapre + */ void bounding_box_prepare_empty(union bounding_box *box); + +/** + * @brief Update bounding box with a point + * @param destination Bounding box to update + * @param conv_func Conversion function to convert \p pt to a vector_2d. May be NULL + * @param pt Point to update bounding box with + */ void bounding_box_update_point(union bounding_box *destination, conv_generic_to_vector_2d_t conv_func, void *pt); + +/** + * @brief Return all four corner points of a bounding box + * @param[out] points Array of 4 vector_2d structs that has to be allocated by the caller + * @param box Bounding box + */ +void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *box); + +/** + * @brief Apply transformations onto bounding box. + * + * All corner points of the bounding \f$ \vec{P_i} \f$ box are transformed to output points \f$ \vec{P_o} \f$ by: + * + * \f$ \vec{P_o} = s \cdot \begin{pmatrix}\cos\left(\phi\right) & -\sin\left(\phi\right)\\ \sin\left(\phi\right) & \cos\left(\phi\right)\end{pmatrix} \cdot \begin{pmatrix} 1 & 0 \\ 0 & -1^{m} \end{pmatrix} \cdot \vec{P_i} \f$, with: + * + * * \f$s\f$: Scale + * * \f$m\f$: 1, if flipped_at_x is True, else 0 + * * \f$\phi\f$: Rotation angle in radians. The conversion degrees => radians is done internally + * + * The result is the bounding box generated around all output points + * + * @param scale Scaling factor + * @param rotation_deg Rotation of bounding box around the origin in degrees (counterclockwise) + * @param flip_at_x Flip the boundig box on the x axis before rotating. + * @param box Bounding box the operations should be applied to. + * @note Keep in mind, that this bounding boxy is actually the bounding box of the rotated boundig box and not the object itself. + * It might be too big. + */ void bounding_box_apply_transform(double scale, double rotation_deg, bool flip_at_x, union bounding_box *box); -void bounding_box_calculate_path_box(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); + +/** + * @brief Calculate the bounding box of a path and update the given bounding box + * @param vertices Vertices the path is made up of + * @param thickness Thisckness of the path + * @param conv_func Conversion function for vertices to vector_2d structs + * @param box Bounding box to write results in. + */ +void bounding_box_update_with_path(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); #endif /* _BOUNDING_BOX_H_ */ From 2b0e2095e63d9f0bc27918e14d9bf3e430937ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 16 Nov 2019 15:54:56 +0100 Subject: [PATCH 18/40] Update documentation and implementations of bounding box calculations. Rename functions to fit their behavior --- geometric/bounding-box.c | 46 ++++++++++----- geometric/cell-geometrics.c | 2 +- include/gds-render/geometric/bounding-box.h | 65 ++++++++++++++++++++- 3 files changed, 96 insertions(+), 17 deletions(-) diff --git a/geometric/bounding-box.c b/geometric/bounding-box.c index 32fb5b5..a37dda4 100644 --- a/geometric/bounding-box.c +++ b/geometric/bounding-box.c @@ -145,7 +145,7 @@ static void calculate_path_miter_points(struct vector_2d *a, struct vector_2d *b vector_2d_subtract(m2, m2, &v_vec); } -void bounding_box_calculate_path_box(GList *vertices, double thickness, +void bounding_box_update_with_path(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box) { GList *vertex_iterator; @@ -191,24 +191,40 @@ void bounding_box_update_point(union bounding_box *destination, conv_generic_to_ destination->vectors.upper_right.y = MAX(destination->vectors.upper_right.y, point.y); } -/** - * @brief Apply transformations onto bounding box. - * @param scale Scaling factor - * @param rotation_deg Roation of bounding box around the origin in degrees (counterclockwise) - * @param flip_at_x Flip the boundig box on the x axis before rotating. - * @param box Bounding box the operations should be applied to. - */ +void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *box) +{ + if (!points || !box) + return; + + points[0].x = box->vectors.lower_left.x; + points[0].y = box->vectors.lower_left.y; + points[1].x = box->vectors.upper_right.x; + points[1].y = box->vectors.lower_left.y; + points[2].x = box->vectors.upper_right.x; + points[2].y = box->vectors.upper_right.y; + points[3].x = box->vectors.lower_left.x; + points[3].y = box->vectors.upper_right.y; +} + void bounding_box_apply_transform(double scale, double rotation_deg, bool flip_at_x, union bounding_box *box) { int i; + struct vector_2d input_points[4]; - /* Due to linearity, the order of the operations does not matter. - * flip must be applied before rotation as defined by the GDS format - */ - for (i = 0; i < 2; i++) { - box->vector_array[i].y *= (flip_at_x ? -1 : 1); - vector_2d_rotate(&box->vector_array[i], rotation_deg * M_PI / 180); - vector_2d_scale(&box->vector_array[i], scale); + if (!box) + return; + + bounding_box_get_all_points(input_points, box); + + /* Reset box */ + bounding_box_prepare_empty(box); + + for (i = 0; i < 4; i++) { + input_points[i].y *= (flip_at_x ? -1 : 1); + vector_2d_rotate(&input_points[i], rotation_deg * M_PI / 180.0); + vector_2d_scale(&input_points[i], scale); + + bounding_box_update_point(box, NULL, &input_points[i]); } } diff --git a/geometric/cell-geometrics.c b/geometric/cell-geometrics.c index 0d7ac71..ee86ae2 100644 --- a/geometric/cell-geometrics.c +++ b/geometric/cell-geometrics.c @@ -63,7 +63,7 @@ static void update_box_with_gfx(union bounding_box *box, struct gds_graphics *gf * Please be aware if paths are the outmost elements of your cell. * You might end up with a completely wrong calculated cell size. */ - bounding_box_calculate_path_box(gfx->vertices, gfx->width_absolute, + bounding_box_update_with_path(gfx->vertices, gfx->width_absolute, (conv_generic_to_vector_2d_t)&convert_gds_point_to_2d_vector, ¤t_box); break; diff --git a/include/gds-render/geometric/bounding-box.h b/include/gds-render/geometric/bounding-box.h index b68bec7..c12030a 100644 --- a/include/gds-render/geometric/bounding-box.h +++ b/include/gds-render/geometric/bounding-box.h @@ -46,12 +46,75 @@ union bounding_box { typedef void (*conv_generic_to_vector_2d_t)(void *, struct vector_2d *); +/** + * @brief Calculate bounding box of polygon + * @param vertices List of vertices that describe the polygon + * @param conv_func Conversion function to convert vertices to vector_2d structs. + * @param box Box to write to. This box is not updated! All previous data is discarded + */ void bounding_box_calculate_polygon(GList *vertices, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); + +/** + * @brief Update an exisitng bounding box with another one. + * @param destination Target box to update + * @param update Box to update the target with + */ void bounding_box_update_box(union bounding_box *destination, union bounding_box *update); + +/** + * @brief Prepare an empty bounding box. + * + * Updating this specially prepared box, results in a bounding box that is the same size as the update + * + * @param box Box to preapre + */ void bounding_box_prepare_empty(union bounding_box *box); + +/** + * @brief Update bounding box with a point + * @param destination Bounding box to update + * @param conv_func Conversion function to convert \p pt to a vector_2d. May be NULL + * @param pt Point to update bounding box with + */ void bounding_box_update_point(union bounding_box *destination, conv_generic_to_vector_2d_t conv_func, void *pt); + +/** + * @brief Return all four corner points of a bounding box + * @param[out] points Array of 4 vector_2d structs that has to be allocated by the caller + * @param box Bounding box + */ +void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *box); + +/** + * @brief Apply transformations onto bounding box. + * + * All corner points of the bounding \f$ \vec{P_i} \f$ box are transformed to output points \f$ \vec{P_o} \f$ by: + * + * \f$ \vec{P_o} = s \cdot \begin{pmatrix}\cos\left(\phi\right) & -\sin\left(\phi\right)\\ \sin\left(\phi\right) & \cos\left(\phi\right)\end{pmatrix} \cdot \begin{pmatrix} 1 & 0 \\ 0 & -1^{m} \end{pmatrix} \cdot \vec{P_i} \f$, with: + * + * * \f$s\f$: Scale + * * \f$m\f$: 1, if flipped_at_x is True, else 0 + * * \f$\phi\f$: Rotation angle in radians. The conversion degrees => radians is done internally + * + * The result is the bounding box generated around all output points + * + * @param scale Scaling factor + * @param rotation_deg Rotation of bounding box around the origin in degrees (counterclockwise) + * @param flip_at_x Flip the boundig box on the x axis before rotating. + * @param box Bounding box the operations should be applied to. + * @note Keep in mind, that this bounding boxy is actually the bounding box of the rotated boundig box and not the object itself. + * It might be too big. + */ void bounding_box_apply_transform(double scale, double rotation_deg, bool flip_at_x, union bounding_box *box); -void bounding_box_calculate_path_box(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); + +/** + * @brief Calculate the bounding box of a path and update the given bounding box + * @param vertices Vertices the path is made up of + * @param thickness Thisckness of the path + * @param conv_func Conversion function for vertices to vector_2d structs + * @param box Bounding box to write results in. + */ +void bounding_box_update_with_path(GList *vertices, double thickness, conv_generic_to_vector_2d_t conv_func, union bounding_box *box); #endif /* _BOUNDING_BOX_H_ */ From e6603d4c138f93d104591c7b19f2d035ac3be6b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 16 Nov 2019 16:16:01 +0100 Subject: [PATCH 19/40] Fix broken latex generation --- doxygen/Doxyconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doxygen/Doxyconfig b/doxygen/Doxyconfig index 3f5e4c1..4554b1d 100644 --- a/doxygen/Doxyconfig +++ b/doxygen/Doxyconfig @@ -1766,7 +1766,7 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = amsmath # The LATEX_HEADER tag can be used to specify a personal LaTeX header for the # generated LaTeX document. The header should contain everything until the first From 392d7e1b3cbe248ca23c61da1f65a1d8af3b085a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sun, 17 Nov 2019 14:09:53 +0100 Subject: [PATCH 20/40] plugins: Add license header and doxygen file --- doxygen/plugins.dox | 6 +++++ plugins/plugin-example/src/plugin-main.c | 30 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 doxygen/plugins.dox diff --git a/doxygen/plugins.dox b/doxygen/plugins.dox new file mode 100644 index 0000000..0947248 --- /dev/null +++ b/doxygen/plugins.dox @@ -0,0 +1,6 @@ +/** + * @defgroup plugins External Renderer Plugins + * + * These plugins can be loaded with the @ref ExternalRenderer + * + */ diff --git a/plugins/plugin-example/src/plugin-main.c b/plugins/plugin-example/src/plugin-main.c index 829daea..1bac538 100644 --- a/plugins/plugin-example/src/plugin-main.c +++ b/plugins/plugin-example/src/plugin-main.c @@ -1,3 +1,31 @@ +/* + * GDSII-Converter example plugin + * Copyright (C) 2019 Mario Hüttel + * + * This file is part of GDSII-Converter. + * + * GDSII-Converter is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * GDSII-Converter is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GDSII-Converter. If not, see . + */ + +/** + * @defgroup example-plugin Example Plugin for External Renderer + * @ingroup plugins + * This is a template / example for an external renderer plugin + * @addtogroup example-plugin + * @{ + */ + + #include #include #include @@ -17,3 +45,5 @@ int FUNC_DECL(EXTERNAL_LIBRARY_INIT_FUNCTION)(const char *params, const char *ve printf("Init with params: %s\ngds-render version: %s\n", params, version); return 0; } + +/** @} */ From 2d7103abbb4c7531a3574290856f89d50356a99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sun, 17 Nov 2019 14:49:00 +0100 Subject: [PATCH 21/40] Fix doxygen --- layer/layer-settings.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layer/layer-settings.c b/layer/layer-settings.c index 9423dd8..d82bae7 100644 --- a/layer/layer-settings.c +++ b/layer/layer-settings.c @@ -77,9 +77,9 @@ static void layer_settings_class_init(LayerSettingsClass *klass) * @brief Copy layer_info struct * * This function copies a layer info struct. - * Be aware, that it does not only copy the pointer to the - * layer name, but instead duplicates the string. * + * @note Be aware, that it does not only copy the pointer to the + * layer name, but instead duplicates the string. * @param info Info to copy * @return new layer_info struct */ From 5fe21f1d739fc1c5ec0dc2fc31ef09336777ffb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sun, 17 Nov 2019 22:31:31 +0100 Subject: [PATCH 22/40] bounding box: Fix doxygen documentation typo --- include/gds-render/geometric/bounding-box.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gds-render/geometric/bounding-box.h b/include/gds-render/geometric/bounding-box.h index c12030a..da16b1f 100644 --- a/include/gds-render/geometric/bounding-box.h +++ b/include/gds-render/geometric/bounding-box.h @@ -88,7 +88,7 @@ void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *b /** * @brief Apply transformations onto bounding box. * - * All corner points of the bounding \f$ \vec{P_i} \f$ box are transformed to output points \f$ \vec{P_o} \f$ by: + * All corner points \f$ \vec{P_i} \f$ of the bounding box are transformed to output points \f$ \vec{P_o} \f$ by: * * \f$ \vec{P_o} = s \cdot \begin{pmatrix}\cos\left(\phi\right) & -\sin\left(\phi\right)\\ \sin\left(\phi\right) & \cos\left(\phi\right)\end{pmatrix} \cdot \begin{pmatrix} 1 & 0 \\ 0 & -1^{m} \end{pmatrix} \cdot \vec{P_i} \f$, with: * From 374e3b54c011c7b99f71957c019283b24ced5fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 18 Nov 2019 21:56:22 +0100 Subject: [PATCH 23/40] plugins: example plugin: Make all functions invisible except for the explicitly exported ones * Add target parameters to compile all symbols invisible to the outside by default. * Edit FUNC_DECL() macro to set attribute that exports the function --- .../output-renderers/external-renderer-interfaces.h | 12 +++++++++--- plugins/plugin-example/CMakeLists.txt | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/gds-render/output-renderers/external-renderer-interfaces.h b/include/gds-render/output-renderers/external-renderer-interfaces.h index 509d029..028d248 100644 --- a/include/gds-render/output-renderers/external-renderer-interfaces.h +++ b/include/gds-render/output-renderers/external-renderer-interfaces.h @@ -13,6 +13,11 @@ * @{ */ +/** + * @brief This define is used to export a function from a shared object + */ +#define EXPORT_FUNC __attribute__((visibility("default"))) + /** * @brief Function name expected to be found in external library for rendering. * @@ -37,14 +42,15 @@ * * 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 + * @brief Define for declaring the exported functions. + * + * This not only helps with the declaration but also makes the symbols visible, so they can be called form outside the library */ -#define FUNC_DECL(FUNC) FUNC +#define FUNC_DECL(FUNC) EXPORT_FUNC FUNC /** @} */ diff --git a/plugins/plugin-example/CMakeLists.txt b/plugins/plugin-example/CMakeLists.txt index 6018e7b..40637e9 100644 --- a/plugins/plugin-example/CMakeLists.txt +++ b/plugins/plugin-example/CMakeLists.txt @@ -10,3 +10,5 @@ link_libraries(${PYTHON_LDFLAGS} version) add_library(${PROJECT_NAME} SHARED EXCLUDE_FROM_ALL ${SOURCES}) add_dependencies(${PROJECT_NAME} version) +set_target_properties(${PROJECT_NAME} PROPERTIES C_VISIBILITY_PRESET hidden) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden) From ce8386799b26605177710330a6295f766255136c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 18 Nov 2019 21:58:20 +0100 Subject: [PATCH 24/40] external renderer: Rename FUNC_DECL to EXPORTED_FUNC_DECL to show that it also exports a function --- .../output-renderers/external-renderer-interfaces.h | 2 +- plugins/plugin-example/src/plugin-main.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/gds-render/output-renderers/external-renderer-interfaces.h b/include/gds-render/output-renderers/external-renderer-interfaces.h index 028d248..f320c5c 100644 --- a/include/gds-render/output-renderers/external-renderer-interfaces.h +++ b/include/gds-render/output-renderers/external-renderer-interfaces.h @@ -50,7 +50,7 @@ * * This not only helps with the declaration but also makes the symbols visible, so they can be called form outside the library */ -#define FUNC_DECL(FUNC) EXPORT_FUNC FUNC +#define EXPORTED_FUNC_DECL(FUNC) EXPORT_FUNC FUNC /** @} */ diff --git a/plugins/plugin-example/src/plugin-main.c b/plugins/plugin-example/src/plugin-main.c index 1bac538..5892fe9 100644 --- a/plugins/plugin-example/src/plugin-main.c +++ b/plugins/plugin-example/src/plugin-main.c @@ -31,7 +31,7 @@ #include #include -int FUNC_DECL(EXTERNAL_LIBRARY_RENDER_FUNCTION)(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale) +int EXPORTED_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; @@ -40,7 +40,7 @@ int FUNC_DECL(EXTERNAL_LIBRARY_RENDER_FUNCTION)(struct gds_cell *toplevel, GList return 0; } -int FUNC_DECL(EXTERNAL_LIBRARY_INIT_FUNCTION)(const char *params, const char *version) +int EXPORTED_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; From 86342da2a254a6137f763b55f8e4610c3166d8ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 18 Nov 2019 22:30:05 +0100 Subject: [PATCH 25/40] Remove unneeded comments --- gds-render-gui.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/gds-render-gui.c b/gds-render-gui.c index cbdd6ee..8f17287 100644 --- a/gds-render-gui.c +++ b/gds-render-gui.c @@ -602,20 +602,12 @@ static void on_convert_clicked(gpointer button, gpointer user) self); activity_bar_set_busy(self->activity_status_bar, "Rendering cell..."); - /* TODO: Replace this with asynchronous rendering. However, this fixes issue #19 */ g_signal_connect(render_engine, "progress-changed", G_CALLBACK(async_rendering_status_update_callback), self); gds_output_renderer_render_output_async(render_engine, cell_to_render, sett->scale); - - - //self->button_state_data.rendering_active = FALSE; - - //g_object_unref(render_engine); } - g_free(file_name); - } else { gtk_widget_destroy(dialog); } From 4970585cee0ee68362b365f1159206e5d469adda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Tue, 19 Nov 2019 01:33:44 +0100 Subject: [PATCH 26/40] Remove call to g_task_set(). It is not available under debian --- output-renderers/gds-output-renderer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/output-renderers/gds-output-renderer.c b/output-renderers/gds-output-renderer.c index 25c64c8..91c55c3 100644 --- a/output-renderers/gds-output-renderer.c +++ b/output-renderers/gds-output-renderer.c @@ -366,7 +366,9 @@ int gds_output_renderer_render_output_async(GdsOutputRenderer *renderer, struct } priv->task = g_task_new(renderer, NULL, gds_output_renderer_async_finished, NULL); - g_task_set_name(priv->task, "Rendering Thread"); + + /* This function is not available on current debian distros. */ + /* g_task_set_name(priv->task, "Rendering Thread"); */ g_mutex_lock(&priv->settings_lock); priv->async_params.cell = cell; From c085a62036e915570575bfbe4b531984b5e21f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 25 Nov 2019 20:45:57 +0100 Subject: [PATCH 27/40] GUI: Remove access and modification date from cell selector Fix #28 --- gds-render-gui.c | 54 +----------------------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/gds-render-gui.c b/gds-render-gui.c index 84588b0..0aa139b 100644 --- a/gds-render-gui.c +++ b/gds-render-gui.c @@ -48,8 +48,6 @@ enum cell_store_columns { CELL_SEL_LIBRARY = 0, CELL_SEL_CELL, CELL_SEL_CELL_ERROR_STATE, /**< Used for cell color and selectability */ - CELL_SEL_MODDATE, - CELL_SEL_ACCESSDATE, CELL_SEL_COLUMN_COUNT /**< @brief Not a column. Used to determine count of columns */ }; @@ -116,25 +114,6 @@ static gboolean on_window_close(gpointer window, GdkEvent *event, gpointer user) return TRUE; } -/** - * @brief generate string from gds_time_field - * @param date Date to convert - * @return String with date - */ -static GString *generate_string_from_date(struct gds_time_field *date) -{ - GString *str; - - str = g_string_new_len(NULL, 50); - g_string_printf(str, "%02u.%02u.%u - %02u:%02u", - (unsigned int)date->day, - (unsigned int)date->month, - (unsigned int)date->year, - (unsigned int)date->hour, - (unsigned int)date->minute); - return str; -} - /** * @brief This function only allows valid cells to be selected * @param selection @@ -237,14 +216,12 @@ exit_filter: */ int gds_render_gui_setup_cell_selector(GdsRenderGui *self) { - GtkCellRenderer *render_dates; GtkCellRenderer *render_cell; GtkCellRenderer *render_lib; GtkTreeViewColumn *column; self->cell_tree_store = gtk_tree_store_new(CELL_SEL_COLUMN_COUNT, G_TYPE_POINTER, - G_TYPE_POINTER, G_TYPE_UINT, - G_TYPE_STRING, G_TYPE_STRING); + G_TYPE_POINTER, G_TYPE_UINT); /* Searching */ self->cell_filter = GTK_TREE_MODEL_FILTER( @@ -258,7 +235,6 @@ int gds_render_gui_setup_cell_selector(GdsRenderGui *self) gtk_tree_view_set_model(self->cell_tree_view, GTK_TREE_MODEL(self->cell_filter)); - render_dates = gtk_cell_renderer_text_new(); render_cell = lib_cell_renderer_new(); render_lib = lib_cell_renderer_new(); @@ -269,12 +245,6 @@ int gds_render_gui_setup_cell_selector(GdsRenderGui *self) "error-level", CELL_SEL_CELL_ERROR_STATE, NULL); gtk_tree_view_append_column(self->cell_tree_view, column); - column = gtk_tree_view_column_new_with_attributes(_("Mod. Date"), render_dates, "text", CELL_SEL_MODDATE, NULL); - gtk_tree_view_append_column(self->cell_tree_view, column); - - column = gtk_tree_view_column_new_with_attributes(_("Acc. Date"), render_dates, "text", CELL_SEL_ACCESSDATE, NULL); - gtk_tree_view_append_column(self->cell_tree_view, column); - /* Callback for selection * This prevents selecting a library */ @@ -305,8 +275,6 @@ static void on_load_gds(gpointer button, gpointer user) gint dialog_result; int gds_result; char *filename; - GString *mod_date; - GString *acc_date; unsigned int cell_error_level; self = RENDERER_GUI(user); @@ -354,30 +322,17 @@ static void on_load_gds(gpointer button, gpointer user) /* Create top level iter */ gtk_tree_store_append(self->cell_tree_store, &libiter, NULL); - /* Convert dates to String */ - mod_date = generate_string_from_date(&gds_lib->mod_time); - acc_date = generate_string_from_date(&gds_lib->access_time); - gtk_tree_store_set(self->cell_tree_store, &libiter, CELL_SEL_LIBRARY, gds_lib, - CELL_SEL_MODDATE, mod_date->str, - CELL_SEL_ACCESSDATE, acc_date->str, -1); /* Check this library. This might take a while */ (void)gds_tree_check_cell_references(gds_lib); (void)gds_tree_check_reference_loops(gds_lib); - /* Delete GStrings including string data. */ - /* Cell store copies String type data items */ - g_string_free(mod_date, TRUE); - g_string_free(acc_date, TRUE); for (cell = gds_lib->cells; cell != NULL; cell = cell->next) { gds_c = (struct gds_cell *)cell->data; gtk_tree_store_append(self->cell_tree_store, &celliter, &libiter); - /* Convert dates to String */ - mod_date = generate_string_from_date(&gds_c->mod_time); - acc_date = generate_string_from_date(&gds_c->access_time); /* Get the checking results for this cell */ cell_error_level = 0; @@ -391,15 +346,8 @@ static void on_load_gds(gpointer button, gpointer user) /* Add cell to tree store model */ gtk_tree_store_set(self->cell_tree_store, &celliter, CELL_SEL_CELL, gds_c, - CELL_SEL_MODDATE, mod_date->str, - CELL_SEL_ACCESSDATE, acc_date->str, CELL_SEL_CELL_ERROR_STATE, cell_error_level, -1); - - /* Delete GStrings including string data. */ - /* Cell store copies String type data items */ - g_string_free(mod_date, TRUE); - g_string_free(acc_date, TRUE); } /* for cells */ } /* for libraries */ From f3786cf282f19f4d97516ea32e4849c5148708bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 25 Nov 2019 20:48:09 +0100 Subject: [PATCH 28/40] Gui: Add library name to all cells in cell selector --- gds-render-gui.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gds-render-gui.c b/gds-render-gui.c index 0aa139b..7266987 100644 --- a/gds-render-gui.c +++ b/gds-render-gui.c @@ -347,6 +347,7 @@ static void on_load_gds(gpointer button, gpointer user) gtk_tree_store_set(self->cell_tree_store, &celliter, CELL_SEL_CELL, gds_c, CELL_SEL_CELL_ERROR_STATE, cell_error_level, + CELL_SEL_LIBRARY, gds_c->parent_library, -1); } /* for cells */ } /* for libraries */ From e3b6ee66eff42082b5ff3edd450129311023d336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 28 Nov 2019 17:59:06 +0100 Subject: [PATCH 29/40] Fix typo in comment --- gds-utils/gds-parser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gds-utils/gds-parser.c b/gds-utils/gds-parser.c index f16f22b..ff96669 100644 --- a/gds-utils/gds-parser.c +++ b/gds-utils/gds-parser.c @@ -597,7 +597,7 @@ static void convert_aref_to_sref(struct gds_cell_array_instance *aref, struct gd /* Iterate over columns and rows */ for (col = 0; col < aref->columns; col++) { for (row = 0; row < aref->rows; row++) { - /* Create new instance for this row/column and aconfigure data */ + /* Create new instance for this row/column and configure data */ container_cell->child_cells = append_cell_ref(container_cell->child_cells, &sref_inst); if (!sref_inst) { GDS_ERROR("Appending cell ref failed!"); From 455081590178e9f297c57335034f3bf3dac729fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 7 Dec 2019 19:07:52 +0100 Subject: [PATCH 30/40] Fix code style --- main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/main.c b/main.c index b4c6cde..e4e76a7 100644 --- a/main.c +++ b/main.c @@ -158,7 +158,6 @@ static void gapp_activate(GApplication *app, gpointer user_data) { GtkWindow *main_window; GdsRenderGui *gui; - struct application_data * const appdata = (struct application_data *)user_data; gui = gds_render_gui_new(); From 9e8d0b461167084496b17b0e0ec21ead27269a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Wed, 11 Dec 2019 08:25:24 +0100 Subject: [PATCH 31/40] include/gds-utils/gds-types.h: Fix typo in comment --- include/gds-render/gds-utils/gds-types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gds-render/gds-utils/gds-types.h b/include/gds-render/gds-utils/gds-types.h index 4e1e49f..bb112c5 100644 --- a/include/gds-render/gds-utils/gds-types.h +++ b/include/gds-render/gds-utils/gds-types.h @@ -58,7 +58,7 @@ enum graphics_type enum path_type {PATH_FLUSH = 0, PATH_ROUNDED = 1, PATH_SQUARED = 2}; /**< Path line caps */ /** - * @brief A point in the 2D plane. Sometimes reffered to as vertex + * @brief A point in the 2D plane. Sometimes referred to as vertex */ struct gds_point { int x; From 20d72a5edb8bb84319616c3a6faa4b0db8a56bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 12 Dec 2019 20:34:41 +0100 Subject: [PATCH 32/40] Remove outdated TODO from source file --- widgets/activity-bar.c | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/activity-bar.c b/widgets/activity-bar.c index ebeaebf..01f06df 100644 --- a/widgets/activity-bar.c +++ b/widgets/activity-bar.c @@ -99,7 +99,6 @@ ActivityBar *activity_bar_new() return bar; } -/* TODO: Complete this once the task list is fully implemented */ void activity_bar_set_ready(ActivityBar *bar) { gtk_label_set_text(GTK_LABEL(bar->label), _("Ready")); From 87bc60bed0c36ee88bef50b3ab4d5344a37d8a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 12 Dec 2019 20:36:17 +0100 Subject: [PATCH 33/40] Fix style issue in version.c --- version/version.c | 1 - 1 file changed, 1 deletion(-) diff --git a/version/version.c b/version/version.c index 0dc18e6..681ea7b 100644 --- a/version/version.c +++ b/version/version.c @@ -17,7 +17,6 @@ * along with GDSII-Converter. If not, see . */ - /** * @defgroup version Version Number * See @ref git-version-num From de9066f18181f73666df794564064ec4c13e3a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 12 Dec 2019 21:22:14 +0100 Subject: [PATCH 34/40] Add translation markers to all messages except for the gds parser's messages --- gds-render-gui.c | 2 +- gds-utils/gds-parser.c | 1 + gds-utils/gds-tree-checker.c | 8 +++--- output-renderers/cairo-renderer.c | 15 ++++++----- output-renderers/external-renderer.c | 29 ++++++++++---------- output-renderers/gds-output-renderer.c | 37 +++++++++++++------------- output-renderers/latex-renderer.c | 14 +++++----- widgets/conv-settings-dialog.c | 19 ++++++------- widgets/layer-element.c | 3 ++- 9 files changed, 68 insertions(+), 60 deletions(-) diff --git a/gds-render-gui.c b/gds-render-gui.c index 7266987..a55b7e0 100644 --- a/gds-render-gui.c +++ b/gds-render-gui.c @@ -551,7 +551,7 @@ static void on_convert_clicked(gpointer button, gpointer user) g_signal_connect(render_engine, "async-finished", G_CALLBACK(async_rendering_finished_callback), self); - activity_bar_set_busy(self->activity_status_bar, "Rendering cell..."); + activity_bar_set_busy(self->activity_status_bar, _("Rendering cell...")); g_signal_connect(render_engine, "progress-changed", G_CALLBACK(async_rendering_status_update_callback), self); diff --git a/gds-utils/gds-parser.c b/gds-utils/gds-parser.c index ff96669..b4db861 100644 --- a/gds-utils/gds-parser.c +++ b/gds-utils/gds-parser.c @@ -40,6 +40,7 @@ #include #include #include +#include #include diff --git a/gds-utils/gds-tree-checker.c b/gds-utils/gds-tree-checker.c index fb66048..c3c326f 100644 --- a/gds-utils/gds-tree-checker.c +++ b/gds-utils/gds-tree-checker.c @@ -34,7 +34,7 @@ */ #include - +#include #include int gds_tree_check_cell_references(struct gds_library *lib) @@ -54,7 +54,7 @@ int gds_tree_check_cell_references(struct gds_library *lib) /* Check if this list element is broken. This should never happen */ if (!cell) { - fprintf(stderr, "Broken cell list item found. Will continue.\n"); + fprintf(stderr, _("Broken cell list item found. Will continue.\n")); continue; } @@ -68,7 +68,7 @@ int gds_tree_check_cell_references(struct gds_library *lib) /* Check if broken. This should not happen */ if (!cell_inst) { - fprintf(stderr, "Broken cell list item found in cell %s. Will continue.\n", + fprintf(stderr, _("Broken cell list item found in cell %s. Will continue.\n"), cell->name); continue; } @@ -185,7 +185,7 @@ int gds_tree_check_reference_loops(struct gds_library *lib) */ if (res == 0) fprintf(stderr, - "Visited cell list should be empty. This is a bug. Please report this.\n"); + _("Visited cell list should be empty. This is a bug. Please report this.\n")); g_list_free(visited_cells); visited_cells = NULL; } diff --git a/output-renderers/cairo-renderer.c b/output-renderers/cairo-renderer.c index 8d99759..a768ea8 100644 --- a/output-renderers/cairo-renderer.c +++ b/output-renderers/cairo-renderer.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -267,7 +268,7 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer //process_id = -1; if (process_id < 0) { /* This should not happen */ - fprintf(stderr, "Fatal error: Cairo Renderer: Could not spawn child process!"); + fprintf(stderr, _("Fatal error: Cairo Renderer: Could not spawn child process!")); exit(-2); } else if (process_id > 0) { /* Woohoo... Successfully dumped the shitty code to an unknowing victim */ @@ -317,7 +318,7 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer linfo = (struct layer_info *)info_list->data; if (linfo->layer >= MAX_LAYERS) { - printf("Layer outside of Spec.\n"); + printf(_("Layer number too high / outside of spec.\n")); continue; } @@ -327,7 +328,7 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer /* Print size */ cairo_recording_surface_ink_extents(layers[linfo->layer].rec, &rec_x0, &rec_y0, &rec_width, &rec_height); - dprintf(comm_pipe[1], "Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n", + dprintf(comm_pipe[1], _("Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n"), linfo->layer, (linfo->name && linfo->name[0] ? " (" : ""), (linfo->name && linfo->name[0] ? linfo->name : ""), @@ -362,10 +363,10 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer for (info_list = layer_infos; info_list != NULL; info_list = g_list_next(info_list)) { linfo = (struct layer_info *)info_list->data; - dprintf(comm_pipe[1], "Exporting layer %d to file\n", linfo->layer); + dprintf(comm_pipe[1], _("Exporting layer %d to file\n"), linfo->layer); if (linfo->layer >= MAX_LAYERS) { - printf("Layer outside of Spec.\n"); + printf(_("Layer outside of spec.\n")); continue; } @@ -405,7 +406,7 @@ ret_clear_layers: } free(layers); - printf("Cairo export finished. It might still be buggy!\n"); + printf(_("Cairo export finished. It might still be buggy!\n")); /* Suspend child process */ exit(0); @@ -463,7 +464,7 @@ static int cairo_renderer_render_output(GdsOutputRenderer *renderer, else pdf_file = output_file; - gds_output_renderer_update_async_progress(renderer, "Rendering Cairo Output..."); + gds_output_renderer_update_async_progress(renderer, _("Rendering Cairo Output...")); ret = cairo_renderer_render_cell_to_vector_file(renderer, cell, layer_infos, pdf_file, svg_file, scale); if (settings) diff --git a/output-renderers/external-renderer.c b/output-renderers/external-renderer.c index f79edb8..6430caa 100644 --- a/output-renderers/external-renderer.c +++ b/output-renderers/external-renderer.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -74,7 +75,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * int forked_status; if (!so_path) { - fprintf(stderr, "Path to shared object not set!\n"); + fprintf(stderr, _("Path to shared object not set!\n")); return -3000; } @@ -85,7 +86,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * /* Load shared object */ so_handle = dlopen(so_path, RTLD_LAZY); if (!so_handle) { - fprintf(stderr, "Could not load external library '%s'\nDetailed error is:\n%s\n", so_path, dlerror()); + fprintf(stderr, _("Could not load external library '%s'\nDetailed error is:\n%s\n"), so_path, dlerror()); return -2000; } @@ -94,7 +95,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * dlsym(so_handle, xstr(EXTERNAL_LIBRARY_RENDER_FUNCTION)); error_msg = dlerror(); 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; } @@ -102,7 +103,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * so_init_func = (int (*)(const char *, const char *))dlsym(so_handle, xstr(EXTERNAL_LIBRARY_INIT_FUNCTION)); error_msg = dlerror(); if (error_msg != NULL) { - fprintf(stderr, "Rendering function not found in library:\n%s\n", error_msg); + fprintf(stderr, _("Init function not found in library:\n%s\n"), error_msg); goto ret_close_so_handle; } @@ -116,7 +117,7 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList * /* Execute */ - g_message("Calling external renderer."); + g_message(_("Calling external renderer.")); if (forking_req) fork_pid = fork(); @@ -138,7 +139,7 @@ end_forked: ret = WEXITSTATUS(forked_status); } - g_message("External renderer finished."); + g_message(_("External renderer finished.")); ret_close_so_handle: dlclose(so_handle); @@ -246,15 +247,15 @@ static void external_renderer_class_init(ExternalRendererClass *klass) /* Setup properties */ external_renderer_properties[PROP_SO_PATH] = - g_param_spec_string("shared-object-path", - "Shared object file path", - "Path to the shared object to search rendering function in.", + g_param_spec_string(N_("shared-object-path"), + N_("Shared object file path"), + N_("Path to the shared object to search rendering function in."), NULL, 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", + g_param_spec_string(N_("param-string"), + N_("Shared object renderer parameter string"), + N_("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); @@ -273,8 +274,8 @@ ExternalRenderer *external_renderer_new() 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, - "param-string", param_string,NULL); + return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, N_("shared-object-path"), so_path, + N_("param-string"), param_string, NULL); } /** @} */ diff --git a/output-renderers/gds-output-renderer.c b/output-renderers/gds-output-renderer.c index 91c55c3..2b296ee 100644 --- a/output-renderers/gds-output-renderer.c +++ b/output-renderers/gds-output-renderer.c @@ -28,6 +28,7 @@ */ #include +#include struct renderer_params { struct gds_cell *cell; @@ -70,7 +71,7 @@ static int gds_output_renderer_render_dummy(GdsOutputRenderer *renderer, (void)cell; (void)scale; - g_warning("Output renderer does not define a render_output function!"); + g_warning(_("Output renderer does not define a render_output function!")); return 0; } @@ -168,17 +169,17 @@ static void gds_output_renderer_class_init(GdsOutputRendererClass *klass) /* Setup properties */ gds_output_renderer_properties[PROP_OUTPUT_FILE] = - g_param_spec_string("output-file", "output file", "Output file for renderer", + g_param_spec_string(N_("output-file"), N_("output file"), N_("Output file for renderer"), NULL, G_PARAM_READWRITE); gds_output_renderer_properties[PROP_LAYER_SETTINGS] = - g_param_spec_object("layer-settings", "Layer Settings object", - "Object containing the layer rendering information", + g_param_spec_object(N_("layer-settings"), N_("Layer Settings object"), + N_("Object containing the layer rendering information"), GDS_RENDER_TYPE_LAYER_SETTINGS, G_PARAM_READWRITE); g_object_class_install_properties(oclass, N_PROPERTIES, gds_output_renderer_properties); /* Setup output signals */ gds_output_renderer_signals[ASYNC_FINISHED] = - g_signal_newv("async-finished", GDS_RENDER_TYPE_OUTPUT_RENDERER, + g_signal_newv(N_("async-finished"), GDS_RENDER_TYPE_OUTPUT_RENDERER, G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, NULL, NULL, @@ -188,7 +189,7 @@ static void gds_output_renderer_class_init(GdsOutputRendererClass *klass) 0, NULL); gds_output_renderer_signals[ASYNC_PROGRESS_CHANGED] = - g_signal_newv("progress-changed", GDS_RENDER_TYPE_OUTPUT_RENDERER, + g_signal_newv(N_("progress-changed"), GDS_RENDER_TYPE_OUTPUT_RENDERER, G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, NULL, NULL, @@ -223,8 +224,8 @@ GdsOutputRenderer *gds_output_renderer_new() GdsOutputRenderer *gds_output_renderer_new_with_props(const char *output_file, LayerSettings *layer_settings) { return GDS_RENDER_OUTPUT_RENDERER(g_object_new(GDS_RENDER_TYPE_OUTPUT_RENDERER, - "layer-settings", layer_settings, - "output-file", output_file, + N_("layer-settings"), layer_settings, + N_("output-file"), output_file, NULL)); } @@ -235,14 +236,14 @@ void gds_output_renderer_set_output_file(GdsOutputRenderer *renderer, const gcha /* Check if the filename is actually filled */ if (!file_name || !file_name[0]) return; - g_object_set(renderer, "output-file", file_name, NULL); + g_object_set(renderer, N_("output-file"), file_name, NULL); } const char *gds_output_renderer_get_output_file(GdsOutputRenderer *renderer) { const char *file = NULL; - g_object_get(renderer, "output-file", &file, NULL); + g_object_get(renderer, N_("output-file"), &file, NULL); return file; } @@ -257,7 +258,7 @@ LayerSettings *gds_output_renderer_get_and_ref_layer_settings(GdsOutputRenderer g_mutex_lock(&priv->settings_lock); /* This function seems to already reference the LayerSettings object */ - g_object_get(renderer, "layer-settings", &ret, NULL); + g_object_get(renderer, N_("layer-settings"), &ret, NULL); /* It is now safe to clear the lock */ g_mutex_unlock(&priv->settings_lock); @@ -269,7 +270,7 @@ void gds_output_renderer_set_layer_settings(GdsOutputRenderer *renderer, LayerSe { g_return_if_fail(GDS_RENDER_IS_LAYER_SETTINGS(settings)); - g_object_set(renderer, "layer-settings", settings, NULL); + g_object_set(renderer, N_("layer-settings"), settings, NULL); } int gds_output_renderer_render_output(GdsOutputRenderer *renderer, struct gds_cell *cell, double scale) @@ -279,28 +280,28 @@ int gds_output_renderer_render_output(GdsOutputRenderer *renderer, struct gds_ce GdsOutputRendererPrivate *priv = gds_output_renderer_get_instance_private(renderer); if (GDS_RENDER_IS_OUTPUT_RENDERER(renderer) == FALSE) { - g_error("Output Renderer not valid."); + g_error(_("Output Renderer not valid.")); return GDS_OUTPUT_RENDERER_GEN_ERR; } if (!priv->output_file || !priv->output_file[0]) { - g_error("No/invalid output file set."); + g_error(_("No/invalid output file set.")); return GDS_OUTPUT_RENDERER_GEN_ERR; } if (!priv->layer_settings) { - g_error("No layer specification supplied."); + g_error(_("No layer specification supplied.")); return GDS_OUTPUT_RENDERER_GEN_ERR; } if (!cell) { - g_error("Output renderer called without cell to render."); + g_error(_("Output renderer called without cell to render.")); return GDS_OUTPUT_RENDERER_PARAM_ERR; } klass = GDS_RENDER_OUTPUT_RENDERER_GET_CLASS(renderer); if (klass->render_output == NULL) { - g_critical("Output Renderer: Rendering function broken. This is a bug."); + g_critical(_("Output Renderer: Rendering function broken. This is a bug.")); return GDS_OUTPUT_RENDERER_GEN_ERR; } @@ -361,7 +362,7 @@ int gds_output_renderer_render_output_async(GdsOutputRenderer *renderer, struct priv = gds_output_renderer_get_instance_private(renderer); if (priv->task) { - g_warning("renderer already started asynchronously"); + g_warning(_("Renderer already started asynchronously")); return -2000; } diff --git a/output-renderers/latex-renderer.c b/output-renderers/latex-renderer.c index e479e8b..821ca8b 100644 --- a/output-renderers/latex-renderer.c +++ b/output-renderers/latex-renderer.c @@ -27,6 +27,8 @@ #include #include #include +#include + /** * @addtogroup LaTeX-Renderer * @{ @@ -248,7 +250,7 @@ static void render_cell(struct gds_cell *cell, GList *layer_infos, FILE *tex_fil struct gds_cell_instance *inst; status = g_string_new(NULL); - g_string_printf(status, "Generating cell %s", cell->name); + g_string_printf(status, _("Generating cell %s"), cell->name); gds_output_renderer_update_async_progress(renderer, status->str); g_string_free(status, TRUE); @@ -368,7 +370,7 @@ static int latex_renderer_render_output(GdsOutputRenderer *renderer, l_renderer->pdf_layers, l_renderer->tex_standalone, renderer); fclose(tex_file); } else { - g_error("Could not open LaTeX output file"); + g_error(_("Could not open LaTeX output file")); } if (settings) @@ -433,14 +435,14 @@ static void latex_renderer_class_init(LatexRendererClass *klass) latex_renderer_properties[PROP_STANDALONE] = g_param_spec_boolean("standalone", - "Standalone TeX file", - "Generate a standalone LaTeX file.", + N_("Standalone TeX file"), + N_("Generate a standalone LaTeX file."), FALSE, G_PARAM_READWRITE); latex_renderer_properties[PROP_PDF_LAYERS] = g_param_spec_boolean("pdf-layers", - "PDF OCR layers", - "Generate OCR layers", + N_("PDF OCR layers"), + N_("Generate OCR layers"), FALSE, G_PARAM_READWRITE); diff --git a/widgets/conv-settings-dialog.c b/widgets/conv-settings-dialog.c index e0fd775..1295fbf 100644 --- a/widgets/conv-settings-dialog.c +++ b/widgets/conv-settings-dialog.c @@ -30,6 +30,7 @@ */ #include +#include struct _RendererSettingsDialog { GtkDialog parent; @@ -102,9 +103,9 @@ static void renderer_settings_dialog_class_init(RendererSettingsDialogClass *kla oclass->set_property = renderer_settings_dialog_set_property; oclass->get_property = renderer_settings_dialog_get_property; - properties[PROP_CELL_NAME] = g_param_spec_string("cell-name", - "cell-name", - "Cell name to be displayed in header bar", + properties[PROP_CELL_NAME] = g_param_spec_string(N_("cell-name"), + N_("cell-name"), + N_("Cell name to be displayed in header bar"), "", G_PARAM_READWRITE); g_object_class_install_properties(oclass, PROP_COUNT, properties); @@ -240,18 +241,18 @@ static void renderer_settings_dialog_update_labels(RendererSettingsDialog *self) width_engineering = convert_number_to_engineering(width_meters, &width_prefix); height_engineering = convert_number_to_engineering(height_meters, &height_prefix); - snprintf(default_buff, sizeof(default_buff), "Width: %.3lf %sm", width_engineering, width_prefix); + snprintf(default_buff, sizeof(default_buff), _("Width: %.3lf %sm"), width_engineering, width_prefix); gtk_label_set_text(self->x_label, default_buff); - snprintf(default_buff, sizeof(default_buff), "Height: %.3lf %sm", height_engineering, height_prefix); + snprintf(default_buff, sizeof(default_buff), _("Height: %.3lf %sm"), height_engineering, height_prefix); gtk_label_set_text(self->y_label, default_buff); scale = gtk_range_get_value(GTK_RANGE(self->scale)); /* Set the pixel sizes */ - snprintf(default_buff, sizeof(default_buff), "Output Width: %u px", + snprintf(default_buff, sizeof(default_buff), _("Output Width: %u px"), (unsigned int)((double)self->cell_width / scale)); gtk_label_set_text(self->x_output_label, default_buff); - snprintf(default_buff, sizeof(default_buff), "Output Height: %u px", + snprintf(default_buff, sizeof(default_buff), _("Output Height: %u px"), (unsigned int)((double)self->cell_height / scale)); gtk_label_set_text(self->y_output_label, default_buff); } @@ -287,9 +288,9 @@ static void renderer_settings_dialog_init(RendererSettingsDialog *self) self->x_output_label = GTK_LABEL(gtk_builder_get_object(builder, "x-output-label")); self->y_output_label = GTK_LABEL(gtk_builder_get_object(builder, "y-output-label")); - gtk_dialog_add_buttons(dialog, "Cancel", GTK_RESPONSE_CANCEL, "OK", GTK_RESPONSE_OK, NULL); + gtk_dialog_add_buttons(dialog, _("Cancel"), GTK_RESPONSE_CANCEL, _("OK"), GTK_RESPONSE_OK, NULL); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(dialog)), box); - gtk_window_set_title(GTK_WINDOW(self), "Renderer Settings"); + gtk_window_set_title(GTK_WINDOW(self), _("Renderer Settings")); g_signal_connect(self->radio_latex, "toggled", G_CALLBACK(latex_render_callback), (gpointer)self); g_signal_connect(G_OBJECT(self->shape_drawing), diff --git a/widgets/layer-element.c b/widgets/layer-element.c index 08bb7f5..b0a8613 100644 --- a/widgets/layer-element.c +++ b/widgets/layer-element.c @@ -37,6 +37,7 @@ */ #include +#include G_DEFINE_TYPE(LayerElement, layer_element, GTK_TYPE_LIST_BOX_ROW) @@ -98,7 +99,7 @@ void layer_element_set_layer(LayerElement *elem, int layer) GString *string; string = g_string_new_len(NULL, 100); - g_string_printf(string, "Layer: %d", layer); + g_string_printf(string, _("Layer: %d"), layer); gtk_label_set_text(elem->priv.layer, (const gchar *)string->str); elem->priv.layer_num = layer; g_string_free(string, TRUE); From 0bfe8df92f00740e5448101fa5e690120ce52c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 12 Dec 2019 21:24:19 +0100 Subject: [PATCH 35/40] Update POT files --- translations/pot/command-line.pot | 16 +++--- translations/pot/gds-render-gui.pot | 26 ++++----- .../pot/gds-utils_gds-tree-checker.pot | 33 ++++++++++++ translations/pot/main.pot | 38 ++++++------- .../pot/output-renderers_cairo-renderer.pot | 53 ++++++++++++++++++ .../output-renderers_external-renderer.pot | 54 +++++++++++++++++++ .../output-renderers_gds-output-renderer.pot | 46 ++++++++++++++++ .../pot/output-renderers_latex-renderer.pot | 27 ++++++++++ translations/pot/widgets_activity-bar.pot | 6 +-- .../pot/widgets_conv-settings-dialog.pot | 51 ++++++++++++++++++ translations/pot/widgets_layer-element.pot | 23 ++++++++ 11 files changed, 328 insertions(+), 45 deletions(-) create mode 100644 translations/pot/gds-utils_gds-tree-checker.pot create mode 100644 translations/pot/output-renderers_cairo-renderer.pot create mode 100644 translations/pot/output-renderers_external-renderer.pot create mode 100644 translations/pot/output-renderers_gds-output-renderer.pot create mode 100644 translations/pot/output-renderers_latex-renderer.pot create mode 100644 translations/pot/widgets_conv-settings-dialog.pot create mode 100644 translations/pot/widgets_layer-element.pot diff --git a/translations/pot/command-line.pot b/translations/pot/command-line.pot index 045ac8f..ce03cc7 100644 --- a/translations/pot/command-line.pot +++ b/translations/pot/command-line.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,29 +17,29 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../command-line.c:203 +#: ../command-line.c:205 #, c-format msgid "%d reference loops found.\n" msgstr "" -#: ../command-line.c:207 +#: ../command-line.c:209 #, c-format msgid "Cell is affected by reference loop. Abort!\n" msgstr "" -#: ../command-line.c:213 +#: ../command-line.c:215 #, c-format msgid "" "Cell was not checked. This should not happen. Please report this issue. Will " "continue either way.\n" msgstr "" -#: ../command-line.c:200 +#: ../command-line.c:202 #, c-format msgid "Checking library %s failed.\n" msgstr "" -#: ../command-line.c:193 +#: ../command-line.c:195 #, c-format msgid "Couldn't find cell in first library!\n" msgstr "" @@ -49,7 +49,7 @@ msgstr "" msgid "Count of renderers %d does not match count of output file names %d\n" msgstr "" -#: ../command-line.c:184 +#: ../command-line.c:186 #, c-format msgid "No library in library list. This should not happen.\n" msgstr "" @@ -66,7 +66,7 @@ msgid "" "renderer.\n" msgstr "" -#: ../command-line.c:158 +#: ../command-line.c:160 #, c-format msgid "Probably missing argument. Check --help option\n" msgstr "" diff --git a/translations/pot/gds-render-gui.pot b/translations/pot/gds-render-gui.pot index be00c00..ee240be 100644 --- a/translations/pot/gds-render-gui.pot +++ b/translations/pot/gds-render-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,34 +17,30 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gds-render-gui.c:275 -msgid "Acc. Date" -msgstr "" - -#: ../gds-render-gui.c:318 +#: ../gds-render-gui.c:286 msgid "Cancel" msgstr "" -#: ../gds-render-gui.c:268 +#: ../gds-render-gui.c:244 msgid "Cell" msgstr "" -#: ../gds-render-gui.c:326 +#: ../gds-render-gui.c:294 msgid "GDSII-Files" msgstr "" -#: ../gds-render-gui.c:265 +#: ../gds-render-gui.c:241 msgid "Library" msgstr "" -#: ../gds-render-gui.c:272 -msgid "Mod. Date" -msgstr "" - -#: ../gds-render-gui.c:319 +#: ../gds-render-gui.c:287 msgid "Open GDSII" msgstr "" -#: ../gds-render-gui.c:316 +#: ../gds-render-gui.c:284 msgid "Open GDSII File" msgstr "" + +#: ../gds-render-gui.c:554 +msgid "Rendering cell..." +msgstr "" diff --git a/translations/pot/gds-utils_gds-tree-checker.pot b/translations/pot/gds-utils_gds-tree-checker.pot new file mode 100644 index 0000000..c4021b2 --- /dev/null +++ b/translations/pot/gds-utils_gds-tree-checker.pot @@ -0,0 +1,33 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../gds-utils/gds-tree-checker.c:71 +#, c-format +msgid "Broken cell list item found in cell %s. Will continue.\n" +msgstr "" + +#: ../gds-utils/gds-tree-checker.c:57 +#, c-format +msgid "Broken cell list item found. Will continue.\n" +msgstr "" + +#: ../gds-utils/gds-tree-checker.c:188 +#, c-format +msgid "Visited cell list should be empty. This is a bug. Please report this.\n" +msgstr "" diff --git a/translations/pot/main.pot b/translations/pot/main.pot index a7fa9b6..681e045 100644 --- a/translations/pot/main.pot +++ b/translations/pot/main.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,35 +25,35 @@ msgid "" "Full git commit: %s" msgstr "" -#: ../main.c:293 +#: ../main.c:294 msgid " FILE - Convert GDS file to graphic" msgstr "" -#: ../main.c:221 +#: ../main.c:220 msgid "About" msgstr "" -#: ../main.c:289 +#: ../main.c:290 msgid "Argument string passed to render lib" msgstr "" -#: ../main.c:283 +#: ../main.c:284 msgid "Cell to render" msgstr "" -#: ../main.c:285 +#: ../main.c:286 msgid "Create PDF Layers (OCG)" msgstr "" -#: ../main.c:284 +#: ../main.c:285 msgid "Create standalone TeX" msgstr "" -#: ../main.c:279 +#: ../main.c:280 msgid "Divide output coordinates by " msgstr "" -#: ../main.c:320 +#: ../main.c:321 #, c-format msgid "Ignored argument: %s" msgstr "" @@ -63,50 +63,50 @@ msgstr "" msgid "Logo could not be displayed: %s\n" msgstr "" -#: ../main.c:298 +#: ../main.c:299 #, c-format msgid "Option parsing failed: %s\n" msgstr "" -#: ../main.c:281 +#: ../main.c:282 msgid "Output file path. Can be used multiple times." msgstr "" -#: ../main.c:282 +#: ../main.c:283 msgid "Path for Layer Mapping File" msgstr "" -#: ../main.c:287 +#: ../main.c:288 msgid "" "Path to a custom shared object, that implements the necessary rendering " "functions" msgstr "" -#: ../main.c:276 +#: ../main.c:277 msgid "Print version" msgstr "" -#: ../main.c:220 +#: ../main.c:219 msgid "Quit" msgstr "" -#: ../main.c:278 +#: ../main.c:279 msgid "Renderer to use. Can be used multiple times." msgstr "" -#: ../main.c:311 +#: ../main.c:312 #, c-format msgid "Scale < 1 not allowed. Setting to 1\n" msgstr "" -#: ../main.c:213 +#: ../main.c:212 #, c-format msgid "" "There is already an open instance. Will open second window in that " "instance.\n" msgstr "" -#: ../main.c:245 +#: ../main.c:244 #, c-format msgid "" "This is gds-render, version: %s\n" diff --git a/translations/pot/output-renderers_cairo-renderer.pot b/translations/pot/output-renderers_cairo-renderer.pot new file mode 100644 index 0000000..3649720 --- /dev/null +++ b/translations/pot/output-renderers_cairo-renderer.pot @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../output-renderers/cairo-renderer.c:409 +#, c-format +msgid "Cairo export finished. It might still be buggy!\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:366 +#, c-format +msgid "Exporting layer %d to file\n" +msgstr "" + +#. This should not happen +#: ../output-renderers/cairo-renderer.c:271 +#, c-format +msgid "Fatal error: Cairo Renderer: Could not spawn child process!" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:321 +#, c-format +msgid "Layer number too high / outside of spec.\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:369 +#, c-format +msgid "Layer outside of spec.\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:467 +msgid "Rendering Cairo Output..." +msgstr "" + +#: ../output-renderers/cairo-renderer.c:331 +#, c-format +msgid "Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n" +msgstr "" diff --git a/translations/pot/output-renderers_external-renderer.pot b/translations/pot/output-renderers_external-renderer.pot new file mode 100644 index 0000000..bf4cd39 --- /dev/null +++ b/translations/pot/output-renderers_external-renderer.pot @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Execute +#: ../output-renderers/external-renderer.c:120 +msgid "Calling external renderer." +msgstr "" + +#: ../output-renderers/external-renderer.c:89 +#, c-format +msgid "" +"Could not load external library '%s'\n" +"Detailed error is:\n" +"%s\n" +msgstr "" + +#: ../output-renderers/external-renderer.c:142 +msgid "External renderer finished." +msgstr "" + +#: ../output-renderers/external-renderer.c:106 +#, c-format +msgid "" +"Init function not found in library:\n" +"%s\n" +msgstr "" + +#: ../output-renderers/external-renderer.c:78 +#, c-format +msgid "Path to shared object not set!\n" +msgstr "" + +#: ../output-renderers/external-renderer.c:98 +#, c-format +msgid "" +"Rendering function not found in library:\n" +"%s\n" +msgstr "" diff --git a/translations/pot/output-renderers_gds-output-renderer.pot b/translations/pot/output-renderers_gds-output-renderer.pot new file mode 100644 index 0000000..195c4b0 --- /dev/null +++ b/translations/pot/output-renderers_gds-output-renderer.pot @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../output-renderers/gds-output-renderer.c:293 +msgid "No layer specification supplied." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:288 +msgid "No/invalid output file set." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:283 +msgid "Output Renderer not valid." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:304 +msgid "Output Renderer: Rendering function broken. This is a bug." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:298 +msgid "Output renderer called without cell to render." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:74 +msgid "Output renderer does not define a render_output function!" +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:365 +msgid "Renderer already started asynchronously" +msgstr "" diff --git a/translations/pot/output-renderers_latex-renderer.pot b/translations/pot/output-renderers_latex-renderer.pot new file mode 100644 index 0000000..9fc0c5d --- /dev/null +++ b/translations/pot/output-renderers_latex-renderer.pot @@ -0,0 +1,27 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../output-renderers/latex-renderer.c:373 +msgid "Could not open LaTeX output file" +msgstr "" + +#: ../output-renderers/latex-renderer.c:253 +#, c-format +msgid "Generating cell %s" +msgstr "" diff --git a/translations/pot/widgets_activity-bar.pot b/translations/pot/widgets_activity-bar.pot index aed3280..e0e69d1 100644 --- a/translations/pot/widgets_activity-bar.pot +++ b/translations/pot/widgets_activity-bar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,10 +17,10 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: ../widgets/activity-bar.c:105 +#: ../widgets/activity-bar.c:104 msgid "Ready" msgstr "" -#: ../widgets/activity-bar.c:111 +#: ../widgets/activity-bar.c:110 msgid "Working..." msgstr "" diff --git a/translations/pot/widgets_conv-settings-dialog.pot b/translations/pot/widgets_conv-settings-dialog.pot new file mode 100644 index 0000000..220b5aa --- /dev/null +++ b/translations/pot/widgets_conv-settings-dialog.pot @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../widgets/conv-settings-dialog.c:291 +msgid "Cancel" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:246 +#, c-format +msgid "Height: %.3lf %sm" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:291 +msgid "OK" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:255 +#, c-format +msgid "Output Height: %u px" +msgstr "" + +#. Set the pixel sizes +#: ../widgets/conv-settings-dialog.c:252 +#, c-format +msgid "Output Width: %u px" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:293 +msgid "Renderer Settings" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:244 +#, c-format +msgid "Width: %.3lf %sm" +msgstr "" diff --git a/translations/pot/widgets_layer-element.pot b/translations/pot/widgets_layer-element.pot new file mode 100644 index 0000000..6513067 --- /dev/null +++ b/translations/pot/widgets_layer-element.pot @@ -0,0 +1,23 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../widgets/layer-element.c:102 +#, c-format +msgid "Layer: %d" +msgstr "" From 798262383ef78f4f285777b6fedd11212827e33b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Thu, 12 Dec 2019 21:39:08 +0100 Subject: [PATCH 36/40] Update the POT files --- translations/generate_templates.sh | 6 +++++- translations/pot/command-line.pot | 6 +++--- translations/pot/gds-render-gui.pot | 6 +++--- translations/pot/gds-utils_gds-tree-checker.pot | 6 +++--- translations/pot/main.pot | 6 +++--- translations/pot/output-renderers_cairo-renderer.pot | 6 +++--- translations/pot/output-renderers_external-renderer.pot | 6 +++--- translations/pot/output-renderers_gds-output-renderer.pot | 6 +++--- translations/pot/output-renderers_latex-renderer.pot | 6 +++--- translations/pot/po/de/main.po | 2 +- translations/pot/widgets_activity-bar.pot | 6 +++--- translations/pot/widgets_conv-settings-dialog.pot | 6 +++--- translations/pot/widgets_layer-element.pot | 6 +++--- 13 files changed, 39 insertions(+), 35 deletions(-) diff --git a/translations/generate_templates.sh b/translations/generate_templates.sh index cb3099c..9ed783a 100755 --- a/translations/generate_templates.sh +++ b/translations/generate_templates.sh @@ -15,5 +15,9 @@ mkdir -p "pot" for file in $files; do pot="pot/"$(echo "${file#*/}" | sed -e "s/\//_/g") pot="${pot%.c}.pot" - xgettext --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" + if [[ -f "$pot" ]]; then + xgettext --package-name="gds-render" --join-existing --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" + else + xgettext --package-name="gds-render" --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" + fi done diff --git a/translations/pot/command-line.pot b/translations/pot/command-line.pot index ce03cc7..4123a58 100644 --- a/translations/pot/command-line.pot +++ b/translations/pot/command-line.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/gds-render-gui.pot b/translations/pot/gds-render-gui.pot index ee240be..5a1149a 100644 --- a/translations/pot/gds-render-gui.pot +++ b/translations/pot/gds-render-gui.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/gds-utils_gds-tree-checker.pot b/translations/pot/gds-utils_gds-tree-checker.pot index c4021b2..b31cec7 100644 --- a/translations/pot/gds-utils_gds-tree-checker.pot +++ b/translations/pot/gds-utils_gds-tree-checker.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/main.pot b/translations/pot/main.pot index 681e045..88814f9 100644 --- a/translations/pot/main.pot +++ b/translations/pot/main.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/output-renderers_cairo-renderer.pot b/translations/pot/output-renderers_cairo-renderer.pot index 3649720..ff1b461 100644 --- a/translations/pot/output-renderers_cairo-renderer.pot +++ b/translations/pot/output-renderers_cairo-renderer.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/output-renderers_external-renderer.pot b/translations/pot/output-renderers_external-renderer.pot index bf4cd39..de1c079 100644 --- a/translations/pot/output-renderers_external-renderer.pot +++ b/translations/pot/output-renderers_external-renderer.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/output-renderers_gds-output-renderer.pot b/translations/pot/output-renderers_gds-output-renderer.pot index 195c4b0..edaba26 100644 --- a/translations/pot/output-renderers_gds-output-renderer.pot +++ b/translations/pot/output-renderers_gds-output-renderer.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/output-renderers_latex-renderer.pot b/translations/pot/output-renderers_latex-renderer.pot index 9fc0c5d..ca01bad 100644 --- a/translations/pot/output-renderers_latex-renderer.pot +++ b/translations/pot/output-renderers_latex-renderer.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/po/de/main.po b/translations/pot/po/de/main.po index 7be4bed..78723ed 100644 --- a/translations/pot/po/de/main.po +++ b/translations/pot/po/de/main.po @@ -10,7 +10,7 @@ msgstr "" "POT-Creation-Date: 2019-11-15 20:32+0100\n" "PO-Revision-Date: 2019-10-18 20:49+0200\n" "Last-Translator: \n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/translations/pot/widgets_activity-bar.pot b/translations/pot/widgets_activity-bar.pot index e0e69d1..9db827e 100644 --- a/translations/pot/widgets_activity-bar.pot +++ b/translations/pot/widgets_activity-bar.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/widgets_conv-settings-dialog.pot b/translations/pot/widgets_conv-settings-dialog.pot index 220b5aa..7b85420 100644 --- a/translations/pot/widgets_conv-settings-dialog.pot +++ b/translations/pot/widgets_conv-settings-dialog.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/translations/pot/widgets_layer-element.pot b/translations/pot/widgets_layer-element.pot index 6513067..fffb9c5 100644 --- a/translations/pot/widgets_layer-element.pot +++ b/translations/pot/widgets_layer-element.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the gds-render package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:22+0100\n" +"POT-Creation-Date: 2019-12-12 21:38+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From c0182220f159c7972e100fd39f3e14c06c7266a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 16 Dec 2019 18:29:28 +0100 Subject: [PATCH 37/40] Translations: Generate only one PO template file for all input files. Include glade files into translation, delete previous German Translation --- translations/generate_templates.sh | 20 +- translations/pot/command-line.pot | 72 --- translations/pot/gds-render-gui.pot | 46 -- translations/pot/gds-render.pot | 456 ++++++++++++++++++ .../pot/gds-utils_gds-tree-checker.pot | 33 -- translations/pot/main.pot | 121 ----- .../pot/output-renderers_cairo-renderer.pot | 53 -- .../output-renderers_external-renderer.pot | 54 --- .../output-renderers_gds-output-renderer.pot | 46 -- .../pot/output-renderers_latex-renderer.pot | 27 -- translations/pot/po/de/.gitignore | 1 - translations/pot/po/de/command-line.po | 73 --- translations/pot/po/de/gds-render-gui.po | 50 -- translations/pot/po/de/main.po | 133 ----- .../pot/po/de/widgets_activity-bar.po | 26 - translations/pot/widgets_activity-bar.pot | 26 - .../pot/widgets_conv-settings-dialog.pot | 51 -- translations/pot/widgets_layer-element.pot | 23 - 18 files changed, 474 insertions(+), 837 deletions(-) delete mode 100644 translations/pot/command-line.pot delete mode 100644 translations/pot/gds-render-gui.pot create mode 100644 translations/pot/gds-render.pot delete mode 100644 translations/pot/gds-utils_gds-tree-checker.pot delete mode 100644 translations/pot/main.pot delete mode 100644 translations/pot/output-renderers_cairo-renderer.pot delete mode 100644 translations/pot/output-renderers_external-renderer.pot delete mode 100644 translations/pot/output-renderers_gds-output-renderer.pot delete mode 100644 translations/pot/output-renderers_latex-renderer.pot delete mode 100644 translations/pot/po/de/.gitignore delete mode 100644 translations/pot/po/de/command-line.po delete mode 100644 translations/pot/po/de/gds-render-gui.po delete mode 100644 translations/pot/po/de/main.po delete mode 100644 translations/pot/po/de/widgets_activity-bar.po delete mode 100644 translations/pot/widgets_activity-bar.pot delete mode 100644 translations/pot/widgets_conv-settings-dialog.pot delete mode 100644 translations/pot/widgets_layer-element.pot diff --git a/translations/generate_templates.sh b/translations/generate_templates.sh index 9ed783a..3257c5f 100755 --- a/translations/generate_templates.sh +++ b/translations/generate_templates.sh @@ -12,12 +12,28 @@ cd "$DIR" files=`find ../ -name "*.c"` mkdir -p "pot" +# C Files + +pot="pot/gds-render.pot" + for file in $files; do - pot="pot/"$(echo "${file#*/}" | sed -e "s/\//_/g") - pot="${pot%.c}.pot" + echo "Parsing C file $file" + # pot="pot/"$(echo "${file#*/}" | sed -e "s/\//_/g") + # pot="${pot%.c}.pot" if [[ -f "$pot" ]]; then xgettext --package-name="gds-render" --join-existing --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" else xgettext --package-name="gds-render" --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" fi done + +# Glade files +glade_files=`find ../resources/ -name "*.glade"` +for glade in $glade_files; do + echo "Parsing Glade file $glade" + if [[ -f "$pot" ]]; then + xgettext --package-name="gds-render" --join-existing --keyword=_ -L Glade --sort-output -o "$pot" "$glade" + else + xgettext --package-name="gds-render" --keyword=_ -L Glade --sort-output -o "$pot" "$glade" + fi +done diff --git a/translations/pot/command-line.pot b/translations/pot/command-line.pot deleted file mode 100644 index 4123a58..0000000 --- a/translations/pot/command-line.pot +++ /dev/null @@ -1,72 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../command-line.c:205 -#, c-format -msgid "%d reference loops found.\n" -msgstr "" - -#: ../command-line.c:209 -#, c-format -msgid "Cell is affected by reference loop. Abort!\n" -msgstr "" - -#: ../command-line.c:215 -#, c-format -msgid "" -"Cell was not checked. This should not happen. Please report this issue. Will " -"continue either way.\n" -msgstr "" - -#: ../command-line.c:202 -#, c-format -msgid "Checking library %s failed.\n" -msgstr "" - -#: ../command-line.c:195 -#, c-format -msgid "Couldn't find cell in first library!\n" -msgstr "" - -#: ../command-line.c:81 -#, c-format -msgid "Count of renderers %d does not match count of output file names %d\n" -msgstr "" - -#: ../command-line.c:186 -#, c-format -msgid "No library in library list. This should not happen.\n" -msgstr "" - -#: ../command-line.c:74 -#, c-format -msgid "Please specify renderers and file names\n" -msgstr "" - -#: ../command-line.c:104 -#, c-format -msgid "" -"Please specify shared object for external renderer. Will ignore this " -"renderer.\n" -msgstr "" - -#: ../command-line.c:160 -#, c-format -msgid "Probably missing argument. Check --help option\n" -msgstr "" diff --git a/translations/pot/gds-render-gui.pot b/translations/pot/gds-render-gui.pot deleted file mode 100644 index 5a1149a..0000000 --- a/translations/pot/gds-render-gui.pot +++ /dev/null @@ -1,46 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../gds-render-gui.c:286 -msgid "Cancel" -msgstr "" - -#: ../gds-render-gui.c:244 -msgid "Cell" -msgstr "" - -#: ../gds-render-gui.c:294 -msgid "GDSII-Files" -msgstr "" - -#: ../gds-render-gui.c:241 -msgid "Library" -msgstr "" - -#: ../gds-render-gui.c:287 -msgid "Open GDSII" -msgstr "" - -#: ../gds-render-gui.c:284 -msgid "Open GDSII File" -msgstr "" - -#: ../gds-render-gui.c:554 -msgid "Rendering cell..." -msgstr "" diff --git a/translations/pot/gds-render.pot b/translations/pot/gds-render.pot new file mode 100644 index 0000000..82c55a9 --- /dev/null +++ b/translations/pot/gds-render.pot @@ -0,0 +1,456 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gds-render package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gds-render\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-16 18:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../main.c:97 +#, c-format +msgid "" +"\n" +"\n" +"Full git commit: %s" +msgstr "" + +#: ../main.c:294 +msgid " FILE - Convert GDS file to graphic" +msgstr "" + +#: ../resources/about.glade:10 +msgid "!! Replaced during runtime !!" +msgstr "" + +#: ../command-line.c:205 +#, c-format +msgid "%d reference loops found.\n" +msgstr "" + +#: ../main.c:220 +msgid "About" +msgstr "" + +#: ../main.c:290 +msgid "Argument string passed to render lib" +msgstr "" + +#: ../resources/main.glade:225 +msgid "Automatically color layers" +msgstr "" + +#: ../resources/main.glade:255 +msgid "Automatically name layers" +msgstr "" + +#: ../gds-utils/gds-tree-checker.c:71 +#, c-format +msgid "Broken cell list item found in cell %s. Will continue.\n" +msgstr "" + +#: ../gds-utils/gds-tree-checker.c:57 +#, c-format +msgid "Broken cell list item found. Will continue.\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:409 +#, c-format +msgid "Cairo export finished. It might still be buggy!\n" +msgstr "" + +#. Execute +#: ../output-renderers/external-renderer.c:120 +msgid "Calling external renderer." +msgstr "" + +#: ../gds-render-gui.c:286 ../widgets/conv-settings-dialog.c:291 +msgid "Cancel" +msgstr "" + +#: ../gds-render-gui.c:244 +msgid "Cell" +msgstr "" + +#: ../command-line.c:209 +#, c-format +msgid "Cell is affected by reference loop. Abort!\n" +msgstr "" + +#: ../main.c:284 +msgid "Cell to render" +msgstr "" + +#: ../command-line.c:215 +#, c-format +msgid "" +"Cell was not checked. This should not happen. Please report this issue. Will " +"continue either way.\n" +msgstr "" + +#: ../command-line.c:202 +#, c-format +msgid "Checking library %s failed.\n" +msgstr "" + +#: ../resources/dialog.glade:79 +msgid "Configure LaTeX as standalone document" +msgstr "" + +#: ../resources/main.glade:109 +msgid "Convert selected cell" +msgstr "" + +#: ../output-renderers/external-renderer.c:89 +#, c-format +msgid "" +"Could not load external library '%s'\n" +"Detailed error is:\n" +"%s\n" +msgstr "" + +#: ../output-renderers/latex-renderer.c:373 +msgid "Could not open LaTeX output file" +msgstr "" + +#: ../command-line.c:195 +#, c-format +msgid "Couldn't find cell in first library!\n" +msgstr "" + +#: ../command-line.c:81 +#, c-format +msgid "Count of renderers %d does not match count of output file names %d\n" +msgstr "" + +#: ../main.c:286 +msgid "Create PDF Layers (OCG)" +msgstr "" + +#: ../main.c:285 +msgid "Create standalone TeX" +msgstr "" + +#: ../main.c:280 +msgid "Divide output coordinates by " +msgstr "" + +#: ../resources/layer-widget.glade:62 +msgid "Export Layer" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:366 +#, c-format +msgid "Exporting layer %d to file\n" +msgstr "" + +#: ../output-renderers/external-renderer.c:142 +msgid "External renderer finished." +msgstr "" + +#. This should not happen +#: ../output-renderers/cairo-renderer.c:271 +#, c-format +msgid "Fatal error: Cairo Renderer: Could not spawn child process!" +msgstr "" + +#: ../resources/main.glade:50 +msgid "GDS-Render" +msgstr "" + +#: ../gds-render-gui.c:294 +msgid "GDSII-Files" +msgstr "" + +#: ../resources/dialog.glade:18 +msgid "Generate LaTeX/TikZ output" +msgstr "" + +#: ../resources/dialog.glade:93 +msgid "Generate PDF Layers" +msgstr "" + +#: ../output-renderers/latex-renderer.c:253 +#, c-format +msgid "Generating cell %s" +msgstr "" + +#: ../resources/about.glade:12 +msgid "Git Repository" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:246 +#, c-format +msgid "Height: %.3lf %sm" +msgstr "" + +#: ../main.c:321 +#, c-format +msgid "Ignored argument: %s" +msgstr "" + +#: ../output-renderers/external-renderer.c:106 +#, c-format +msgid "" +"Init function not found in library:\n" +"%s\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:321 +#, c-format +msgid "Layer number too high / outside of spec.\n" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:369 +#, c-format +msgid "Layer outside of spec.\n" +msgstr "" + +#: ../widgets/layer-element.c:102 +#, c-format +msgid "Layer: %d" +msgstr "" + +#: ../gds-render-gui.c:241 +msgid "Library" +msgstr "" + +#: ../resources/main.glade:68 +msgid "Load Mapping" +msgstr "" + +#: ../resources/main.glade:73 +msgid "Load the current layer configuration from CSV" +msgstr "" + +#: ../main.c:116 +#, c-format +msgid "Logo could not be displayed: %s\n" +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:293 +msgid "No layer specification supplied." +msgstr "" + +#: ../command-line.c:186 +#, c-format +msgid "No library in library list. This should not happen.\n" +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:288 +msgid "No/invalid output file set." +msgstr "" + +#: ../widgets/conv-settings-dialog.c:291 +msgid "OK" +msgstr "" + +#: ../resources/main.glade:58 +msgid "Open GDS2 Database" +msgstr "" + +#: ../gds-render-gui.c:287 +msgid "Open GDSII" +msgstr "" + +#: ../gds-render-gui.c:284 +msgid "Open GDSII File" +msgstr "" + +#: ../main.c:299 +#, c-format +msgid "Option parsing failed: %s\n" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:255 +#, c-format +msgid "Output Height: %u px" +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:283 +msgid "Output Renderer not valid." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:304 +msgid "Output Renderer: Rendering function broken. This is a bug." +msgstr "" + +#. Set the pixel sizes +#: ../widgets/conv-settings-dialog.c:252 +#, c-format +msgid "Output Width: %u px" +msgstr "" + +#: ../main.c:282 +msgid "Output file path. Can be used multiple times." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:298 +msgid "Output renderer called without cell to render." +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:74 +msgid "Output renderer does not define a render_output function!" +msgstr "" + +#: ../main.c:283 +msgid "Path for Layer Mapping File" +msgstr "" + +#: ../main.c:288 +msgid "" +"Path to a custom shared object, that implements the necessary rendering " +"functions" +msgstr "" + +#: ../output-renderers/external-renderer.c:78 +#, c-format +msgid "Path to shared object not set!\n" +msgstr "" + +#: ../command-line.c:74 +#, c-format +msgid "Please specify renderers and file names\n" +msgstr "" + +#: ../command-line.c:104 +#, c-format +msgid "" +"Please specify shared object for external renderer. Will ignore this " +"renderer.\n" +msgstr "" + +#: ../main.c:277 +msgid "Print version" +msgstr "" + +#: ../command-line.c:160 +#, c-format +msgid "Probably missing argument. Check --help option\n" +msgstr "" + +#: ../main.c:219 +msgid "Quit" +msgstr "" + +#: ../widgets/activity-bar.c:104 +msgid "Ready" +msgstr "" + +#: ../resources/dialog.glade:33 +msgid "Render PDF using Cairographics" +msgstr "" + +#: ../resources/dialog.glade:48 +msgid "Render SVG using Cairographics (too buggy at the moment)" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:293 +msgid "Renderer Settings" +msgstr "" + +#: ../output-renderers/gds-output-renderer.c:365 +msgid "Renderer already started asynchronously" +msgstr "" + +#: ../main.c:279 +msgid "Renderer to use. Can be used multiple times." +msgstr "" + +#: ../output-renderers/cairo-renderer.c:467 +msgid "Rendering Cairo Output..." +msgstr "" + +#: ../gds-render-gui.c:554 +msgid "Rendering cell..." +msgstr "" + +#: ../output-renderers/external-renderer.c:98 +#, c-format +msgid "" +"Rendering function not found in library:\n" +"%s\n" +msgstr "" + +#: ../resources/main.glade:86 +msgid "Save Mapping" +msgstr "" + +#: ../resources/main.glade:23 +msgid "Save the current layer configuration to CSV" +msgstr "" + +#: ../main.c:312 +#, c-format +msgid "Scale < 1 not allowed. Setting to 1\n" +msgstr "" + +#: ../resources/layer-widget.glade:51 +msgid "Select Layer Color and Opacity" +msgstr "" + +#: ../resources/main.glade:240 +msgid "Select all layers for export" +msgstr "" + +#: ../output-renderers/cairo-renderer.c:331 +#, c-format +msgid "Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n" +msgstr "" + +#: ../resources/main.glade:195 +msgid "Sort layers ascending" +msgstr "" + +#: ../resources/main.glade:210 +msgid "Sort layers descending" +msgstr "" + +#: ../main.c:212 +#, c-format +msgid "" +"There is already an open instance. Will open second window in that " +"instance.\n" +msgstr "" + +#: ../main.c:244 +#, c-format +msgid "" +"This is gds-render, version: %s\n" +"\n" +"For a list of supported commands execute with --help option.\n" +msgstr "" + +#: ../gds-utils/gds-tree-checker.c:188 +#, c-format +msgid "Visited cell list should be empty. This is a bug. Please report this.\n" +msgstr "" + +#: ../widgets/conv-settings-dialog.c:244 +#, c-format +msgid "Width: %.3lf %sm" +msgstr "" + +#: ../widgets/activity-bar.c:110 +msgid "Working..." +msgstr "" + +#: ../main.c:96 +msgid "" +"gds-render is a free tool for rendering GDS2 layout files into vector " +"graphics." +msgstr "" + +#: ../resources/layer-widget.glade:37 +msgid "label" +msgstr "" diff --git a/translations/pot/gds-utils_gds-tree-checker.pot b/translations/pot/gds-utils_gds-tree-checker.pot deleted file mode 100644 index b31cec7..0000000 --- a/translations/pot/gds-utils_gds-tree-checker.pot +++ /dev/null @@ -1,33 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../gds-utils/gds-tree-checker.c:71 -#, c-format -msgid "Broken cell list item found in cell %s. Will continue.\n" -msgstr "" - -#: ../gds-utils/gds-tree-checker.c:57 -#, c-format -msgid "Broken cell list item found. Will continue.\n" -msgstr "" - -#: ../gds-utils/gds-tree-checker.c:188 -#, c-format -msgid "Visited cell list should be empty. This is a bug. Please report this.\n" -msgstr "" diff --git a/translations/pot/main.pot b/translations/pot/main.pot deleted file mode 100644 index 88814f9..0000000 --- a/translations/pot/main.pot +++ /dev/null @@ -1,121 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../main.c:97 -#, c-format -msgid "" -"\n" -"\n" -"Full git commit: %s" -msgstr "" - -#: ../main.c:294 -msgid " FILE - Convert GDS file to graphic" -msgstr "" - -#: ../main.c:220 -msgid "About" -msgstr "" - -#: ../main.c:290 -msgid "Argument string passed to render lib" -msgstr "" - -#: ../main.c:284 -msgid "Cell to render" -msgstr "" - -#: ../main.c:286 -msgid "Create PDF Layers (OCG)" -msgstr "" - -#: ../main.c:285 -msgid "Create standalone TeX" -msgstr "" - -#: ../main.c:280 -msgid "Divide output coordinates by " -msgstr "" - -#: ../main.c:321 -#, c-format -msgid "Ignored argument: %s" -msgstr "" - -#: ../main.c:116 -#, c-format -msgid "Logo could not be displayed: %s\n" -msgstr "" - -#: ../main.c:299 -#, c-format -msgid "Option parsing failed: %s\n" -msgstr "" - -#: ../main.c:282 -msgid "Output file path. Can be used multiple times." -msgstr "" - -#: ../main.c:283 -msgid "Path for Layer Mapping File" -msgstr "" - -#: ../main.c:288 -msgid "" -"Path to a custom shared object, that implements the necessary rendering " -"functions" -msgstr "" - -#: ../main.c:277 -msgid "Print version" -msgstr "" - -#: ../main.c:219 -msgid "Quit" -msgstr "" - -#: ../main.c:279 -msgid "Renderer to use. Can be used multiple times." -msgstr "" - -#: ../main.c:312 -#, c-format -msgid "Scale < 1 not allowed. Setting to 1\n" -msgstr "" - -#: ../main.c:212 -#, c-format -msgid "" -"There is already an open instance. Will open second window in that " -"instance.\n" -msgstr "" - -#: ../main.c:244 -#, c-format -msgid "" -"This is gds-render, version: %s\n" -"\n" -"For a list of supported commands execute with --help option.\n" -msgstr "" - -#: ../main.c:96 -msgid "" -"gds-render is a free tool for rendering GDS2 layout files into vector " -"graphics." -msgstr "" diff --git a/translations/pot/output-renderers_cairo-renderer.pot b/translations/pot/output-renderers_cairo-renderer.pot deleted file mode 100644 index ff1b461..0000000 --- a/translations/pot/output-renderers_cairo-renderer.pot +++ /dev/null @@ -1,53 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../output-renderers/cairo-renderer.c:409 -#, c-format -msgid "Cairo export finished. It might still be buggy!\n" -msgstr "" - -#: ../output-renderers/cairo-renderer.c:366 -#, c-format -msgid "Exporting layer %d to file\n" -msgstr "" - -#. This should not happen -#: ../output-renderers/cairo-renderer.c:271 -#, c-format -msgid "Fatal error: Cairo Renderer: Could not spawn child process!" -msgstr "" - -#: ../output-renderers/cairo-renderer.c:321 -#, c-format -msgid "Layer number too high / outside of spec.\n" -msgstr "" - -#: ../output-renderers/cairo-renderer.c:369 -#, c-format -msgid "Layer outside of spec.\n" -msgstr "" - -#: ../output-renderers/cairo-renderer.c:467 -msgid "Rendering Cairo Output..." -msgstr "" - -#: ../output-renderers/cairo-renderer.c:331 -#, c-format -msgid "Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n" -msgstr "" diff --git a/translations/pot/output-renderers_external-renderer.pot b/translations/pot/output-renderers_external-renderer.pot deleted file mode 100644 index de1c079..0000000 --- a/translations/pot/output-renderers_external-renderer.pot +++ /dev/null @@ -1,54 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#. Execute -#: ../output-renderers/external-renderer.c:120 -msgid "Calling external renderer." -msgstr "" - -#: ../output-renderers/external-renderer.c:89 -#, c-format -msgid "" -"Could not load external library '%s'\n" -"Detailed error is:\n" -"%s\n" -msgstr "" - -#: ../output-renderers/external-renderer.c:142 -msgid "External renderer finished." -msgstr "" - -#: ../output-renderers/external-renderer.c:106 -#, c-format -msgid "" -"Init function not found in library:\n" -"%s\n" -msgstr "" - -#: ../output-renderers/external-renderer.c:78 -#, c-format -msgid "Path to shared object not set!\n" -msgstr "" - -#: ../output-renderers/external-renderer.c:98 -#, c-format -msgid "" -"Rendering function not found in library:\n" -"%s\n" -msgstr "" diff --git a/translations/pot/output-renderers_gds-output-renderer.pot b/translations/pot/output-renderers_gds-output-renderer.pot deleted file mode 100644 index edaba26..0000000 --- a/translations/pot/output-renderers_gds-output-renderer.pot +++ /dev/null @@ -1,46 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../output-renderers/gds-output-renderer.c:293 -msgid "No layer specification supplied." -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:288 -msgid "No/invalid output file set." -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:283 -msgid "Output Renderer not valid." -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:304 -msgid "Output Renderer: Rendering function broken. This is a bug." -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:298 -msgid "Output renderer called without cell to render." -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:74 -msgid "Output renderer does not define a render_output function!" -msgstr "" - -#: ../output-renderers/gds-output-renderer.c:365 -msgid "Renderer already started asynchronously" -msgstr "" diff --git a/translations/pot/output-renderers_latex-renderer.pot b/translations/pot/output-renderers_latex-renderer.pot deleted file mode 100644 index ca01bad..0000000 --- a/translations/pot/output-renderers_latex-renderer.pot +++ /dev/null @@ -1,27 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../output-renderers/latex-renderer.c:373 -msgid "Could not open LaTeX output file" -msgstr "" - -#: ../output-renderers/latex-renderer.c:253 -#, c-format -msgid "Generating cell %s" -msgstr "" diff --git a/translations/pot/po/de/.gitignore b/translations/pot/po/de/.gitignore deleted file mode 100644 index 4591c0f..0000000 --- a/translations/pot/po/de/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.po~ diff --git a/translations/pot/po/de/command-line.po b/translations/pot/po/de/command-line.po deleted file mode 100644 index d2270f6..0000000 --- a/translations/pot/po/de/command-line.po +++ /dev/null @@ -1,73 +0,0 @@ -# German translations for gds-render package. -# Copyright (C) 2019 THE gds-render's COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Mario Hüttel , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-22 23:02+0200\n" -"PO-Revision-Date: 2019-10-22 23:02+0200\n" -"Last-Translator: \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: ../command-line.c:203 -#, c-format -msgid "%d reference loops found.\n" -msgstr "%d Referenzschleifen gefunden.\n" - -#: ../command-line.c:207 -#, c-format -msgid "Cell is affected by reference loop. Abort!\n" -msgstr "Zelle von Referenzschleife betroffen. Abbruch!\n" - -#: ../command-line.c:213 -#, c-format -msgid "" -"Cell was not checked. This should not happen. Please report this issue. Will " -"continue either way.\n" -msgstr "Zelle wurde nicht überprüft. Das sollte nicht passieren. Bitte melden Sie dieses Fehlverhalten. Es wird " -"dennoch fortgefahren.\n" - -#: ../command-line.c:200 -#, c-format -msgid "Checking library %s failed.\n" -msgstr "Überprüfen der Bibliothek %s fehlgeschlagen.\n" - -#: ../command-line.c:193 -#, c-format -msgid "Couldn't find cell in first library!\n" -msgstr "Konnte Zelle nicht in der ersten Bibliothek finden!\n" - -#: ../command-line.c:81 -#, c-format -msgid "Count of renderers %d does not match count of output file names %d\n" -msgstr "Anzahl der Renderer %d entspricht nicht der Anzahl der angegebenen Ausgabepfade %s\n" - -#: ../command-line.c:184 -#, c-format -msgid "No library in library list. This should not happen.\n" -msgstr "Keine Bilbiothek in Bibliotheksliste vorhanden. Dies sollte nicht passieren.\n" - -#: ../command-line.c:74 -#, c-format -msgid "Please specify renderers and file names\n" -msgstr "Bitte geben Sie Renderer und Dateinamen an\n" - -#: ../command-line.c:104 -#, c-format -msgid "" -"Please specify shared object for external renderer. Will ignore this " -"renderer.\n" -msgstr "Bitte geben Sie ein 'shared object' für den externen Renderer an. Renderer wird ignoriert.\n" - -#: ../command-line.c:158 -#, c-format -msgid "Probably missing argument. Check --help option\n" -msgstr "Vermutlich fehlendes Argument. Siehe --help Option für Hilfe\n" diff --git a/translations/pot/po/de/gds-render-gui.po b/translations/pot/po/de/gds-render-gui.po deleted file mode 100644 index 78880de..0000000 --- a/translations/pot/po/de/gds-render-gui.po +++ /dev/null @@ -1,50 +0,0 @@ -# German translations for PACKAGE package. -# Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Mario Hüttel , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: gds-render VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" -"PO-Revision-Date: 2019-10-18 23:10+0200\n" -"Last-Translator: \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: ../gds-render-gui.c:275 -msgid "Acc. Date" -msgstr "Zugr. Datum" - -#: ../gds-render-gui.c:318 -msgid "Cancel" -msgstr "Abbruch" - -#: ../gds-render-gui.c:268 -msgid "Cell" -msgstr "Zelle" - -#: ../gds-render-gui.c:326 -msgid "GDSII-Files" -msgstr "GDSII-Dateiem" - -#: ../gds-render-gui.c:265 -msgid "Library" -msgstr "Bibliothek" - -#: ../gds-render-gui.c:272 -msgid "Mod. Date" -msgstr "Mod. Datum" - -#: ../gds-render-gui.c:319 -msgid "Open GDSII" -msgstr "GDSII öffnen" - -#: ../gds-render-gui.c:316 -msgid "Open GDSII File" -msgstr "GDSII Datei öffnen" diff --git a/translations/pot/po/de/main.po b/translations/pot/po/de/main.po deleted file mode 100644 index 78723ed..0000000 --- a/translations/pot/po/de/main.po +++ /dev/null @@ -1,133 +0,0 @@ -# German translations for gds-render package. -# Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# Mario Hüttel , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: gds-render VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-15 20:32+0100\n" -"PO-Revision-Date: 2019-10-18 20:49+0200\n" -"Last-Translator: \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: ../main.c:97 -#, c-format -msgid "" -"\n" -"\n" -"Full git commit: %s" -msgstr "" -"\n" -"\n" -"Vollständige git Commit-ID %s" - -#: ../main.c:293 -msgid " FILE - Convert GDS file to graphic" -msgstr "Datei -- Konvertiere GDS Datei zu Vektorgrafik" - -#: ../main.c:221 -msgid "About" -msgstr "Über" - -#: ../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" -msgstr "Zu konvertierende Zelle" - -#: ../main.c:285 -msgid "Create PDF Layers (OCG)" -msgstr "Generiere PDF Layer (OCG)" - -#: ../main.c:284 -msgid "Create standalone TeX" -msgstr "Generiere alleinstehendes TeX" - -#: ../main.c:279 -msgid "Divide output coordinates by " -msgstr "Skaliere Ausgabekoordinaten um Faktor herab" - -#: ../main.c:320 -#, c-format -msgid "Ignored argument: %s" -msgstr "Ignoriertes Argument: %s" - -#: ../main.c:116 -#, c-format -msgid "Logo could not be displayed: %s\n" -msgstr "Logo konnte nicht angezeigt werden: %s\n" - -#: ../main.c:298 -#, c-format -msgid "Option parsing failed: %s\n" -msgstr "Übergabeparameterkonvertierung fehlgeschlagen: %s\n" - -#: ../main.c:281 -msgid "Output file path. Can be used multiple times." -msgstr "Ausgabedatei. Kann mehrfach angegeben werden." - -#: ../main.c:282 -msgid "Path for Layer Mapping File" -msgstr "Pfad zur \"Layer Mapping\"-Datei" - -#: ../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" -msgstr "Programmversion aufgeben" - -#: ../main.c:220 -msgid "Quit" -msgstr "Beenden" - -#: ../main.c:278 -msgid "Renderer to use. Can be used multiple times." -msgstr "Gewünschter Renderer. Kann mehrfach angegeben werden." - -#: ../main.c:311 -#, c-format -msgid "Scale < 1 not allowed. Setting to 1\n" -msgstr "Skalierung < 1 nicht erlaubt. Rückfallwert 1 benutzt.\n" - -#: ../main.c:213 -#, c-format -msgid "" -"There is already an open instance. Will open second window in that " -"instance.\n" -msgstr "" -"Es is bereits eine Instanz dieses Programms geöffnet. Ein weiteres Fenster " -"in dieser wird geöffnet.\n" - -#: ../main.c:245 -#, c-format -msgid "" -"This is gds-render, version: %s\n" -"\n" -"For a list of supported commands execute with --help option.\n" -msgstr "" -"gds-render, Version %s\n" -"\n" -"Um eine Liste der unterstützten Befehle zu erhalten, bitte mit der Option --" -"help ausführen.\n" - -#: ../main.c:96 -msgid "" -"gds-render is a free tool for rendering GDS2 layout files into vector " -"graphics." -msgstr "" -"gds-render is ein freies Werkzeug zum Wandeln von GDS2 Layouts in " -"Vektorgrafiken." diff --git a/translations/pot/po/de/widgets_activity-bar.po b/translations/pot/po/de/widgets_activity-bar.po deleted file mode 100644 index 3dca313..0000000 --- a/translations/pot/po/de/widgets_activity-bar.po +++ /dev/null @@ -1,26 +0,0 @@ -# German translations for gds-render package. -# Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Mario Hüttel , 2019. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-25 20:27+0200\n" -"PO-Revision-Date: 2019-10-25 20:27+0200\n" -"Last-Translator: \n" -"Language-Team: German \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: ../widgets/activity-bar.c:105 -msgid "Ready" -msgstr "Bereit" - -#: ../widgets/activity-bar.c:111 -msgid "Working..." -msgstr "Berechnung aktiv..." diff --git a/translations/pot/widgets_activity-bar.pot b/translations/pot/widgets_activity-bar.pot deleted file mode 100644 index 9db827e..0000000 --- a/translations/pot/widgets_activity-bar.pot +++ /dev/null @@ -1,26 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../widgets/activity-bar.c:104 -msgid "Ready" -msgstr "" - -#: ../widgets/activity-bar.c:110 -msgid "Working..." -msgstr "" diff --git a/translations/pot/widgets_conv-settings-dialog.pot b/translations/pot/widgets_conv-settings-dialog.pot deleted file mode 100644 index 7b85420..0000000 --- a/translations/pot/widgets_conv-settings-dialog.pot +++ /dev/null @@ -1,51 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../widgets/conv-settings-dialog.c:291 -msgid "Cancel" -msgstr "" - -#: ../widgets/conv-settings-dialog.c:246 -#, c-format -msgid "Height: %.3lf %sm" -msgstr "" - -#: ../widgets/conv-settings-dialog.c:291 -msgid "OK" -msgstr "" - -#: ../widgets/conv-settings-dialog.c:255 -#, c-format -msgid "Output Height: %u px" -msgstr "" - -#. Set the pixel sizes -#: ../widgets/conv-settings-dialog.c:252 -#, c-format -msgid "Output Width: %u px" -msgstr "" - -#: ../widgets/conv-settings-dialog.c:293 -msgid "Renderer Settings" -msgstr "" - -#: ../widgets/conv-settings-dialog.c:244 -#, c-format -msgid "Width: %.3lf %sm" -msgstr "" diff --git a/translations/pot/widgets_layer-element.pot b/translations/pot/widgets_layer-element.pot deleted file mode 100644 index fffb9c5..0000000 --- a/translations/pot/widgets_layer-element.pot +++ /dev/null @@ -1,23 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gds-render package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: gds-render\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-12 21:38+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../widgets/layer-element.c:102 -#, c-format -msgid "Layer: %d" -msgstr "" From fdfa478fed2fb0a835ea5e0c7eadbf09a9fe769a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 16 Dec 2019 21:58:18 +0100 Subject: [PATCH 38/40] Add full German translation --- translations/pot/po/de/gds-render.po | 487 +++++++++++++++++++++++++++ 1 file changed, 487 insertions(+) create mode 100644 translations/pot/po/de/gds-render.po diff --git a/translations/pot/po/de/gds-render.po b/translations/pot/po/de/gds-render.po new file mode 100644 index 0000000..2aafed8 --- /dev/null +++ b/translations/pot/po/de/gds-render.po @@ -0,0 +1,487 @@ +# German translations for gds-render package. +# Copyright (C) 2019 THE gds-render'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gds-render package. +# マリオ , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: gds-render\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-12-16 18:27+0100\n" +"PO-Revision-Date: 2019-12-16 21:57+0100\n" +"Last-Translator: Mario Hüttel \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.2.4\n" + +#: ../main.c:97 +#, c-format +msgid "" +"\n" +"\n" +"Full git commit: %s" +msgstr "" +"\n" +"\n" +"Vollständiger git-Commit: %s" + +#: ../main.c:294 +msgid " FILE - Convert GDS file to graphic" +msgstr " DATEI - Konvertiere GDS-Datei in Grafik" + +#: ../resources/about.glade:10 +msgid "!! Replaced during runtime !!" +msgstr "!! Ersetzt zur Laufzeit !!" + +#: ../command-line.c:205 +#, c-format +msgid "%d reference loops found.\n" +msgstr "%d Referenzschleifen gefunden.\n" + +#: ../main.c:220 +msgid "About" +msgstr "Info" + +#: ../main.c:290 +msgid "Argument string passed to render lib" +msgstr "An Render-Bibliothek übergebener Argument-String" + +#: ../resources/main.glade:225 +msgid "Automatically color layers" +msgstr "Färbe Layer automatisch" + +#: ../resources/main.glade:255 +msgid "Automatically name layers" +msgstr "Bename Layer automatisch" + +#: ../gds-utils/gds-tree-checker.c:71 +#, c-format +msgid "Broken cell list item found in cell %s. Will continue.\n" +msgstr "Defektes Listenelement in Zelle %s. Ignoriere.\n" + +#: ../gds-utils/gds-tree-checker.c:57 +#, c-format +msgid "Broken cell list item found. Will continue.\n" +msgstr "Defektes Zellenelement in Liste gefunden. Ignoriere.\n" + +#: ../output-renderers/cairo-renderer.c:409 +#, c-format +msgid "Cairo export finished. It might still be buggy!\n" +msgstr "Cairo-Export abgeschlossen. Möglicherweise fehlerhaft!\n" + +#. Execute +#: ../output-renderers/external-renderer.c:120 +msgid "Calling external renderer." +msgstr "Rufe externen Renderer auf." + +#: ../gds-render-gui.c:286 ../widgets/conv-settings-dialog.c:291 +msgid "Cancel" +msgstr "Abbruch" + +#: ../gds-render-gui.c:244 +msgid "Cell" +msgstr "Zelle" + +#: ../command-line.c:209 +#, c-format +msgid "Cell is affected by reference loop. Abort!\n" +msgstr "Zelle ist von referenzschleife betroffen. Abbruch!\n" + +#: ../main.c:284 +msgid "Cell to render" +msgstr "Zu rendernde Zelle" + +#: ../command-line.c:215 +#, c-format +msgid "" +"Cell was not checked. This should not happen. Please report this issue. Will " +"continue either way.\n" +msgstr "" +"Zelle wurde nicht überprüft. Das sollte nicht passieren. Bitte melden Sie " +"dieses Problem. Es wird dennoch fortgefahren.\n" + +#: ../command-line.c:202 +#, c-format +msgid "Checking library %s failed.\n" +msgstr "Überprüfung von Bibliothek %s fehlgeschlagen.\n" + +#: ../resources/dialog.glade:79 +msgid "Configure LaTeX as standalone document" +msgstr "Konfiguriere LaTeX als eigenständiges Dokument" + +#: ../resources/main.glade:109 +msgid "Convert selected cell" +msgstr "Konvertiere ausgewählte Zelle" + +#: ../output-renderers/external-renderer.c:89 +#, c-format +msgid "" +"Could not load external library '%s'\n" +"Detailed error is:\n" +"%s\n" +msgstr "" +"Externe Bibliothek '%s' konnte nicht geladen werden.\n" +"Detailierter Fehler:\n" +"%s\n" + +#: ../output-renderers/latex-renderer.c:373 +msgid "Could not open LaTeX output file" +msgstr "LaTeX-Ausgabedatei konnte nicht geöffnet werden" + +#: ../command-line.c:195 +#, c-format +msgid "Couldn't find cell in first library!\n" +msgstr "Zelle nicht in erster Bibliothek gefunden!\n" + +#: ../command-line.c:81 +#, c-format +msgid "Count of renderers %d does not match count of output file names %d\n" +msgstr "" +"Anzahl der Renderer %d stimmt nicht mit der Anzahl der angegebenen " +"Ausgabedateinamen %d überein\n" + +#: ../main.c:286 +msgid "Create PDF Layers (OCG)" +msgstr "Generiere PDF-Layer (OCG)" + +#: ../main.c:285 +msgid "Create standalone TeX" +msgstr "Generiere eingenständiges TeX" + +#: ../main.c:280 +msgid "Divide output coordinates by " +msgstr "Dividiere Ausgabekoordinaten durch " + +#: ../resources/layer-widget.glade:62 +msgid "Export Layer" +msgstr "Exportiere Layer" + +#: ../output-renderers/cairo-renderer.c:366 +#, c-format +msgid "Exporting layer %d to file\n" +msgstr "Exportiere Layer %d in Datei\n" + +#: ../output-renderers/external-renderer.c:142 +msgid "External renderer finished." +msgstr "Externer Renderer beendet." + +#. This should not happen +#: ../output-renderers/cairo-renderer.c:271 +#, c-format +msgid "Fatal error: Cairo Renderer: Could not spawn child process!" +msgstr "" +"Fataler Fehler: Cairo Renderer: Sub-Prozess konnte nicht gestartet werden!" + +#: ../resources/main.glade:50 +msgid "GDS-Render" +msgstr "GDS-Render" + +#: ../gds-render-gui.c:294 +msgid "GDSII-Files" +msgstr "GDSII-Dateien" + +#: ../resources/dialog.glade:18 +msgid "Generate LaTeX/TikZ output" +msgstr "Generiere LaTeX/TikZ Ausgabe" + +#: ../resources/dialog.glade:93 +msgid "Generate PDF Layers" +msgstr "Generiere PDF Layers" + +#: ../output-renderers/latex-renderer.c:253 +#, c-format +msgid "Generating cell %s" +msgstr "Generiere Zelle %s" + +#: ../resources/about.glade:12 +msgid "Git Repository" +msgstr "Git Repository" + +#: ../widgets/conv-settings-dialog.c:246 +#, c-format +msgid "Height: %.3lf %sm" +msgstr "Höhe: %.3lf %sm" + +#: ../main.c:321 +#, c-format +msgid "Ignored argument: %s" +msgstr "Ignoriertes Argument: %s" + +#: ../output-renderers/external-renderer.c:106 +#, c-format +msgid "" +"Init function not found in library:\n" +"%s\n" +msgstr "" +"Init-Funktion nicht in Bibliothek gefunden:\n" +"%s\n" + +#: ../output-renderers/cairo-renderer.c:321 +#, c-format +msgid "Layer number too high / outside of spec.\n" +msgstr "Layer-Nummer zu hoch / Außerhalb der Spezifikation.\n" + +#: ../output-renderers/cairo-renderer.c:369 +#, c-format +msgid "Layer outside of spec.\n" +msgstr "Layer außerhalb der Spezifikation\n" + +#: ../widgets/layer-element.c:102 +#, c-format +msgid "Layer: %d" +msgstr "Layer: %d" + +#: ../gds-render-gui.c:241 +msgid "Library" +msgstr "Bibliothek" + +#: ../resources/main.glade:68 +msgid "Load Mapping" +msgstr "Zuordnung laden" + +#: ../resources/main.glade:73 +msgid "Load the current layer configuration from CSV" +msgstr "Lade die aktuelle Layer-Zuordnung aus einer CSV-Datei" + +#: ../main.c:116 +#, c-format +msgid "Logo could not be displayed: %s\n" +msgstr "Logo konnte nicht angezeigt werden: %s\n" + +#: ../output-renderers/gds-output-renderer.c:293 +msgid "No layer specification supplied." +msgstr "Keine Layer-Spezifikation angegeben." + +#: ../command-line.c:186 +#, c-format +msgid "No library in library list. This should not happen.\n" +msgstr "Keine Bibliothek in Bibliotheksliste. Das sollte nicht passieren.\n" + +#: ../output-renderers/gds-output-renderer.c:288 +msgid "No/invalid output file set." +msgstr "Keine oder invalide Ausgabedatei angegeben." + +#: ../widgets/conv-settings-dialog.c:291 +msgid "OK" +msgstr "OK" + +#: ../resources/main.glade:58 +msgid "Open GDS2 Database" +msgstr "Öffne GDS2 Datenbank" + +#: ../gds-render-gui.c:287 +msgid "Open GDSII" +msgstr "Öffne GDSII" + +#: ../gds-render-gui.c:284 +msgid "Open GDSII File" +msgstr "Öffne GDSII-Datei" + +#: ../main.c:299 +#, c-format +msgid "Option parsing failed: %s\n" +msgstr "Optionsverarbeitung fehlgeschlagen: %s\n" + +#: ../widgets/conv-settings-dialog.c:255 +#, c-format +msgid "Output Height: %u px" +msgstr "Ausgabehöhe: %u px" + +#: ../output-renderers/gds-output-renderer.c:283 +msgid "Output Renderer not valid." +msgstr "Ausgaberenderer invalide." + +#: ../output-renderers/gds-output-renderer.c:304 +msgid "Output Renderer: Rendering function broken. This is a bug." +msgstr "" +"Ausgaberenderer: Render-Funktion defekt. Dies ist ein interner " +"Programmfehler." + +#. Set the pixel sizes +#: ../widgets/conv-settings-dialog.c:252 +#, c-format +msgid "Output Width: %u px" +msgstr "Ausgabebreite: %u px" + +#: ../main.c:282 +msgid "Output file path. Can be used multiple times." +msgstr "Ausgabepfad. Kann mehrfach angegeben werden." + +#: ../output-renderers/gds-output-renderer.c:298 +msgid "Output renderer called without cell to render." +msgstr "Ausgaberenderer ohne zu rendernde Zelle aufgerufen." + +#: ../output-renderers/gds-output-renderer.c:74 +msgid "Output renderer does not define a render_output function!" +msgstr "Ausgaberenderer definiert keine render_output Funktion!" + +#: ../main.c:283 +msgid "Path for Layer Mapping File" +msgstr "Pfad zur Lagenzuordnungsdatei" + +#: ../main.c:288 +msgid "" +"Path to a custom shared object, that implements the necessary rendering " +"functions" +msgstr "" +"Pfad zu einem benutzerdefiniertem Shared-Object, welches die notwendigen " +"Funktionen implementiert" + +#: ../output-renderers/external-renderer.c:78 +#, c-format +msgid "Path to shared object not set!\n" +msgstr "Kein Pfad zu einem Shared-Object gesetzt!\n" + +#: ../command-line.c:74 +#, c-format +msgid "Please specify renderers and file names\n" +msgstr "Bitte Renderer und Dateinamen angeben.\n" + +#: ../command-line.c:104 +#, c-format +msgid "" +"Please specify shared object for external renderer. Will ignore this " +"renderer.\n" +msgstr "" +"Bitte Shares-Object für externen Renderer angeben. Dieser Renderer wird " +"ignoriert.\n" + +#: ../main.c:277 +msgid "Print version" +msgstr "Zeige Versionsnummer" + +#: ../command-line.c:160 +#, c-format +msgid "Probably missing argument. Check --help option\n" +msgstr "Vermutlich ein fehlendes Argument. Bitte --help überprüfen\n" + +#: ../main.c:219 +msgid "Quit" +msgstr "Beenden" + +#: ../widgets/activity-bar.c:104 +msgid "Ready" +msgstr "Bereit" + +#: ../resources/dialog.glade:33 +msgid "Render PDF using Cairographics" +msgstr "Rendere PDF mit Cairographics" + +#: ../resources/dialog.glade:48 +msgid "Render SVG using Cairographics (too buggy at the moment)" +msgstr "Rendere SVG mit Cairographics (Experimentell)" + +#: ../widgets/conv-settings-dialog.c:293 +msgid "Renderer Settings" +msgstr "Renderer Einstellungen" + +#: ../output-renderers/gds-output-renderer.c:365 +msgid "Renderer already started asynchronously" +msgstr "Renderer wird bereits asynchron ausgeführt" + +#: ../main.c:279 +msgid "Renderer to use. Can be used multiple times." +msgstr "Zu nutzender Renderer. Kann mehrfach angegeben werden." + +#: ../output-renderers/cairo-renderer.c:467 +msgid "Rendering Cairo Output..." +msgstr "Rendere Cairo-Ausgabe..." + +#: ../gds-render-gui.c:554 +msgid "Rendering cell..." +msgstr "Renderere Zelle..." + +#: ../output-renderers/external-renderer.c:98 +#, c-format +msgid "" +"Rendering function not found in library:\n" +"%s\n" +msgstr "" +"Render Funktion nicht in Bibliothek gefunden:\n" +"%s\n" + +#: ../resources/main.glade:86 +msgid "Save Mapping" +msgstr "Zuordnung speichern" + +#: ../resources/main.glade:23 +msgid "Save the current layer configuration to CSV" +msgstr "Die aktuelle Lagenkonfiguration als CSV-Datei speichern" + +#: ../main.c:312 +#, c-format +msgid "Scale < 1 not allowed. Setting to 1\n" +msgstr "Skaliereung < 1 nicht erlaubt. Setze auf 1\n" + +#: ../resources/layer-widget.glade:51 +msgid "Select Layer Color and Opacity" +msgstr "Wähle Layer-Farbe und Transparenz" + +#: ../resources/main.glade:240 +msgid "Select all layers for export" +msgstr "Wähle alle Layer für export" + +#: ../output-renderers/cairo-renderer.c:331 +#, c-format +msgid "Size of layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n" +msgstr "Größe von Layer %d%s%s%s: <%lf x %lf> @ (%lf | %lf)\n" + +#: ../resources/main.glade:195 +msgid "Sort layers ascending" +msgstr "Sortiere Layer aufsteigend" + +#: ../resources/main.glade:210 +msgid "Sort layers descending" +msgstr "Sortiere Layer absteigend" + +#: ../main.c:212 +#, c-format +msgid "" +"There is already an open instance. Will open second window in that " +"instance.\n" +msgstr "" +"Es ist bereits eine Instanz dieses Programms geöffnet. Es wird ein zweites " +"Fenster in jener Instanz geöffnet.\n" + +#: ../main.c:244 +#, c-format +msgid "" +"This is gds-render, version: %s\n" +"\n" +"For a list of supported commands execute with --help option.\n" +msgstr "" +"Dies ist gds-render, Version: %s\n" +"\n" +"Für eine Liste der unterstützten Kommandos mit der Option --help ausführen.\n" + +#: ../gds-utils/gds-tree-checker.c:188 +#, c-format +msgid "Visited cell list should be empty. This is a bug. Please report this.\n" +msgstr "" +"Liste markierter Zellen sollte leer sein. Dies ist ein Fehler. Bitte " +"melden.\n" + +#: ../widgets/conv-settings-dialog.c:244 +#, c-format +msgid "Width: %.3lf %sm" +msgstr "Breite: %.3lf %sm" + +#: ../widgets/activity-bar.c:110 +msgid "Working..." +msgstr "Arbeite..." + +#: ../main.c:96 +msgid "" +"gds-render is a free tool for rendering GDS2 layout files into vector " +"graphics." +msgstr "" +"gds-render ist ein freies Programm um GDS2-Layouts in Vektorgrafiken zu " +"konvertieren." + +#: ../resources/layer-widget.glade:37 +msgid "label" +msgstr "label" From b8fc904af5597b4ef689698c80e154837f72df29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 16 Dec 2019 22:00:59 +0100 Subject: [PATCH 39/40] Fix typos --- translations/pot/po/de/gds-render.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translations/pot/po/de/gds-render.po b/translations/pot/po/de/gds-render.po index 2aafed8..3c00727 100644 --- a/translations/pot/po/de/gds-render.po +++ b/translations/pot/po/de/gds-render.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: gds-render\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-12-16 18:27+0100\n" -"PO-Revision-Date: 2019-12-16 21:57+0100\n" +"PO-Revision-Date: 2019-12-16 22:00+0100\n" "Last-Translator: Mario Hüttel \n" "Language-Team: German \n" "Language: de\n" @@ -423,7 +423,7 @@ msgstr "Wähle Layer-Farbe und Transparenz" #: ../resources/main.glade:240 msgid "Select all layers for export" -msgstr "Wähle alle Layer für export" +msgstr "Wähle alle Layer zum Exporieren" #: ../output-renderers/cairo-renderer.c:331 #, c-format @@ -479,7 +479,7 @@ msgid "" "gds-render is a free tool for rendering GDS2 layout files into vector " "graphics." msgstr "" -"gds-render ist ein freies Programm um GDS2-Layouts in Vektorgrafiken zu " +"gds-render ist ein freies Programm, um GDS2-Layouts in Vektorgrafiken zu " "konvertieren." #: ../resources/layer-widget.glade:37 From 1ca04aaa7198a4bc9335d869b7cacff81e754a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Mon, 16 Dec 2019 22:09:14 +0100 Subject: [PATCH 40/40] Doxygen: Update image of Gui and its description. Fix #31 --- doxygen/images/gui.png | Bin 41145 -> 33455 bytes doxygen/usage.dox | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doxygen/images/gui.png b/doxygen/images/gui.png index 08ba81d39f8d615aed6ef7c3378cc129a769832f..ac3d0abba7ebaf1ecdd4d29eaef72bd70869c4ec 100644 GIT binary patch literal 33455 zcmafaWmH_v5-o%P!3pjI!QCBZAb5hiySv-q1a}GU?gV$Y;1Jv`xVyuf@4oxp_5QtC zYlbyvnm%2st5%IvjGJK9sCIna>ekJtqAhxqtjO@ z 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 literal 41145 zcma%iV|ZlI(rz-Di6*u)v2EL)*tTuV#I~JGY}>YNvt#r2%=ylD@6Vg(>2&Yzz4oeF zsCui`TcPr@VzAIy&>$cnuoB|JKS4mg8i9a-mO_F9zmchoD+IoMbrh6Pf&~6~K^lbs zuQ8oO)SMJ;O`Kfy9gIOtZEUTLX&en5jE!v^&1{`6!Mb=sKz@Ko2n#5=Wt?xgx}hq+ zbYEYNuP1Fve>52I_a43K+Q!C3bjYtRukRne?3t6eew83#yL)?L>^M=T z$jHdnaKZVu^cch_(E1pnwnMc4Z4Y@J|EH7^E&N;ALfF(1Rb_cO%#&AVdZz3V90@P) zhf{Fh_166SJaZrY`7i#QrajdEbPMd8J#X2HRZ00iIU(Wv`q`_=tfr=BikO6?;ItJF z9Xim1i}(KuNfcFih7qJ68WM8#^!`DBmOjC%Hdo&{%Ov{0n&iD=1pS&YIkT)=@v=}- zN)U=;_}{J&Hs}x_5l~SNsxg9Mm)ClnlJ)3Awl2k%?l<8Imdw+FHf)A08eA-Vt5~3t zc{2T2I@5`e`M?`<;>j;0rrj^=>dI5w}{YzAz@*?HcgMxeq!uhThU_&7U!F*Ydim$ zG}@ff(hUbct5`x~cDu9KF%%V`PQ-Lx z5ojnL$j?I&pQ!4t&F!rp0%CwFom#y@g8K&u5+ETV$)gkm=W{!(09>qCv6YpTWyVOM z|IR>2HftX}J0ah~^Sh6Mp&^4zU6auBj9EMS%*+gMX6sX9>{sS$gp2fYey?}t2bup4 z4I|+U^teR8sl2baAOos2zw%JyN?lHD*!nAvTv$Y8$Dzf8n;?JHP(n(sNcZ=*rn-o{ z48hX$!Ysv509QzV_28B>w=zkB%Bwk-wk1)eFDKX>lHJ!+a;kM1or12!rUbAlSOHg( z0^^3KHV$+g_Zx3+-*=40b~~nM8b@batoBnW&V6DYZ-iEM-_g3Gy}25Os4I1 z<$c#$>vpyhjL;0QuGe~_#_(y&-D$^kukF(CI!E|Quh$JSO4JbLiuO-hVKE~?aIDtP zkR;CdKa8-?jo$UA(s?4QLo-rH_G0iP&(e6l2W--jcM8=v+MQ1X!4AH}=KkOeZu~5o zwQz5IjlY$vItLzYAnZrLFnPSukf+*`Ke=qaJZj%VZY_c))vVw2duOC74Z!1f^o{~Z zzV3n3yV+3=oYk#`7KSxcbxk}v>;H-1PFk4@cHE_j&O_H871EWsME$!2-kj9`ppVQ* z=(x_{nd9g2%<_7uK5l&yPd)kI&f;*t`upI06oGMa`%x+C~_tx@LQSiFk?l%0Dk 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 diff --git a/doxygen/usage.dox b/doxygen/usage.dox index 98d1a32..8e1cc5c 100644 --- a/doxygen/usage.dox +++ b/doxygen/usage.dox @@ -35,6 +35,6 @@ It is possible to export the layer configurations so they can be used later on. The cell selector on the left shows the GDS Libraries and Cells. The cells are marked green if all references inside the cell could be found. If not all references could be found, the cell is marked orange. This doens't show if child cells have missing childs. Only one level of the hierarchy is checked in order to make it easier to spot an errorneous cell. Cells with missing child cells are still renderable but `--` obviously `--` faulty. If a cell or any sub-cell contains a reference loop, the cell is marked red. In this case it can't be selected for rendering. -In the above image the cell is green; so everything is okay. - +In the above image one cell is green; so everything is okay. And the other one is red, which indicates a reference loop. This cell cannot be selected for rendering! */ +