Merge branch 'dev' into japanese-translations

This commit is contained in:
Mario Hüttel 2019-12-16 22:38:48 +01:00
commit 5f94ec49bf
43 changed files with 1419 additions and 722 deletions

View File

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

View File

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

View File

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

View File

@ -1766,7 +1766,7 @@ PAPER_TYPE = a4
# If left blank no extra packages will be included. # If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES. # 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 # 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 # generated LaTeX document. The header should contain everything until the first

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 33 KiB

6
doxygen/plugins.dox Normal file
View File

@ -0,0 +1,6 @@
/**
* @defgroup plugins External Renderer Plugins
*
* These plugins can be loaded with the @ref ExternalRenderer
*
*/

View File

@ -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. 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!
*/ */

View File

@ -48,8 +48,6 @@ enum cell_store_columns {
CELL_SEL_LIBRARY = 0, CELL_SEL_LIBRARY = 0,
CELL_SEL_CELL, CELL_SEL_CELL,
CELL_SEL_CELL_ERROR_STATE, /**< Used for cell color and selectability */ 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 */ 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; 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 * @brief This function only allows valid cells to be selected
* @param selection * @param selection
@ -237,14 +216,12 @@ exit_filter:
*/ */
int gds_render_gui_setup_cell_selector(GdsRenderGui *self) int gds_render_gui_setup_cell_selector(GdsRenderGui *self)
{ {
GtkCellRenderer *render_dates;
GtkCellRenderer *render_cell; GtkCellRenderer *render_cell;
GtkCellRenderer *render_lib; GtkCellRenderer *render_lib;
GtkTreeViewColumn *column; GtkTreeViewColumn *column;
self->cell_tree_store = gtk_tree_store_new(CELL_SEL_COLUMN_COUNT, G_TYPE_POINTER, self->cell_tree_store = gtk_tree_store_new(CELL_SEL_COLUMN_COUNT, G_TYPE_POINTER,
G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_UINT);
G_TYPE_STRING, G_TYPE_STRING);
/* Searching */ /* Searching */
self->cell_filter = GTK_TREE_MODEL_FILTER( 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)); 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_cell = lib_cell_renderer_new();
render_lib = 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); "error-level", CELL_SEL_CELL_ERROR_STATE, NULL);
gtk_tree_view_append_column(self->cell_tree_view, column); 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 /* Callback for selection
* This prevents selecting a library * This prevents selecting a library
*/ */
@ -305,8 +275,6 @@ static void on_load_gds(gpointer button, gpointer user)
gint dialog_result; gint dialog_result;
int gds_result; int gds_result;
char *filename; char *filename;
GString *mod_date;
GString *acc_date;
unsigned int cell_error_level; unsigned int cell_error_level;
self = RENDERER_GUI(user); self = RENDERER_GUI(user);
@ -354,30 +322,17 @@ static void on_load_gds(gpointer button, gpointer user)
/* Create top level iter */ /* Create top level iter */
gtk_tree_store_append(self->cell_tree_store, &libiter, NULL); 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, gtk_tree_store_set(self->cell_tree_store, &libiter,
CELL_SEL_LIBRARY, gds_lib, CELL_SEL_LIBRARY, gds_lib,
CELL_SEL_MODDATE, mod_date->str,
CELL_SEL_ACCESSDATE, acc_date->str,
-1); -1);
/* Check this library. This might take a while */ /* Check this library. This might take a while */
(void)gds_tree_check_cell_references(gds_lib); (void)gds_tree_check_cell_references(gds_lib);
(void)gds_tree_check_reference_loops(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) { for (cell = gds_lib->cells; cell != NULL; cell = cell->next) {
gds_c = (struct gds_cell *)cell->data; gds_c = (struct gds_cell *)cell->data;
gtk_tree_store_append(self->cell_tree_store, &celliter, &libiter); 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 */ /* Get the checking results for this cell */
cell_error_level = 0; cell_error_level = 0;
@ -391,15 +346,9 @@ static void on_load_gds(gpointer button, gpointer user)
/* Add cell to tree store model */ /* Add cell to tree store model */
gtk_tree_store_set(self->cell_tree_store, &celliter, gtk_tree_store_set(self->cell_tree_store, &celliter,
CELL_SEL_CELL, gds_c, 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, CELL_SEL_CELL_ERROR_STATE, cell_error_level,
CELL_SEL_LIBRARY, gds_c->parent_library,
-1); -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 cells */
} /* for libraries */ } /* for libraries */
@ -602,21 +551,13 @@ static void on_convert_clicked(gpointer button, gpointer user)
g_signal_connect(render_engine, "async-finished", G_CALLBACK(async_rendering_finished_callback), g_signal_connect(render_engine, "async-finished", G_CALLBACK(async_rendering_finished_callback),
self); self);
activity_bar_set_busy(self->activity_status_bar, "Rendering cell..."); 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_signal_connect(render_engine, "progress-changed",
G_CALLBACK(async_rendering_status_update_callback), self); G_CALLBACK(async_rendering_status_update_callback), self);
gds_output_renderer_render_output_async(render_engine, cell_to_render, sett->scale); 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); g_free(file_name);
} else { } else {
gtk_widget_destroy(dialog); gtk_widget_destroy(dialog);
} }

View File

@ -40,6 +40,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <math.h> #include <math.h>
#include <cairo.h> #include <cairo.h>
#include <glib/gi18n.h>
#include <gds-render/gds-utils/gds-parser.h> #include <gds-render/gds-utils/gds-parser.h>
@ -597,7 +598,7 @@ static void convert_aref_to_sref(struct gds_cell_array_instance *aref, struct gd
/* Iterate over columns and rows */ /* Iterate over columns and rows */
for (col = 0; col < aref->columns; col++) { for (col = 0; col < aref->columns; col++) {
for (row = 0; row < aref->rows; row++) { 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); container_cell->child_cells = append_cell_ref(container_cell->child_cells, &sref_inst);
if (!sref_inst) { if (!sref_inst) {
GDS_ERROR("Appending cell ref failed!"); GDS_ERROR("Appending cell ref failed!");

View File

@ -34,7 +34,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <glib/gi18n.h>
#include <gds-render/gds-utils/gds-tree-checker.h> #include <gds-render/gds-utils/gds-tree-checker.h>
int gds_tree_check_cell_references(struct gds_library *lib) 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 */ /* Check if this list element is broken. This should never happen */
if (!cell) { if (!cell) {
fprintf(stderr, "Broken cell list item found. Will continue.\n"); fprintf(stderr, _("Broken cell list item found. Will continue.\n"));
continue; continue;
} }
@ -68,7 +68,7 @@ int gds_tree_check_cell_references(struct gds_library *lib)
/* Check if broken. This should not happen */ /* Check if broken. This should not happen */
if (!cell_inst) { 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); cell->name);
continue; continue;
} }
@ -185,7 +185,7 @@ int gds_tree_check_reference_loops(struct gds_library *lib)
*/ */
if (res == 0) if (res == 0)
fprintf(stderr, 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); g_list_free(visited_cells);
visited_cells = NULL; visited_cells = NULL;
} }

View File

@ -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); 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) conv_generic_to_vector_2d_t conv_func, union bounding_box *box)
{ {
GList *vertex_iterator; 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); destination->vectors.upper_right.y = MAX(destination->vectors.upper_right.y, point.y);
} }
/** void bounding_box_get_all_points(struct vector_2d *points, union bounding_box *box)
* @brief Apply transformations onto bounding box. {
* @param scale Scaling factor if (!points || !box)
* @param rotation_deg Roation of bounding box around the origin in degrees (counterclockwise) return;
* @param flip_at_x Flip the boundig box on the x axis before rotating.
* @param box Bounding box the operations should be applied to. 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) void bounding_box_apply_transform(double scale, double rotation_deg, bool flip_at_x, union bounding_box *box)
{ {
int i; int i;
struct vector_2d input_points[4];
/* Due to linearity, the order of the operations does not matter. if (!box)
* flip must be applied before rotation as defined by the GDS format return;
*/
for (i = 0; i < 2; i++) { bounding_box_get_all_points(input_points, box);
box->vector_array[i].y *= (flip_at_x ? -1 : 1);
vector_2d_rotate(&box->vector_array[i], rotation_deg * M_PI / 180); /* Reset box */
vector_2d_scale(&box->vector_array[i], scale); 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]);
} }
} }

View File

@ -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. * Please be aware if paths are the outmost elements of your cell.
* You might end up with a completely wrong calculated cell size. * 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, (conv_generic_to_vector_2d_t)&convert_gds_point_to_2d_vector,
&current_box); &current_box);
break; break;

View File

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

View File

@ -58,7 +58,7 @@ enum graphics_type
enum path_type {PATH_FLUSH = 0, PATH_ROUNDED = 1, PATH_SQUARED = 2}; /**< Path line caps */ 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 { struct gds_point {
int x; int x;

View File

@ -46,12 +46,75 @@ union bounding_box {
typedef void (*conv_generic_to_vector_2d_t)(void *, struct vector_2d *); 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); 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); 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); 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); 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 \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:
*
* * \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_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_ */ #endif /* _BOUNDING_BOX_H_ */

View File

@ -0,0 +1,57 @@
#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 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.
*
* The function has to be defined as follows:
* @code
* int EXTERNAL_LIBRARY_RENDER_FUNCTION(struct gds_cell *toplevel, GList *layer_info_list, const char *output_file_name, double scale);
* @endcode
*/
#define EXTERNAL_LIBRARY_RENDER_FUNCTION exported_render_cell_to_file
/**
* @brief Function name expected to be found in external library for initialization.
*
* @code
* int EXTERNAL_LIBRARY_INIT_FUNCTION(const char *option_string, const char *version_string);
* @endcode
*/
#define EXTERNAL_LIBRARY_INIT_FUNCTION exported_init
/**
* @brief Global integer specified by an external renderer to signal, that the init and render functions shall be executed in a subprocess
*
* The pure presence of this symbol name causes forking. The content of this variable is don't care.
* @note Use this if you mess with the internal structures of gds-render
*/
#define EXTERNAL_LIBRARY_FORK_REQUEST exported_fork_request
/**
* @brief Define for declaring the exported functions.
*
* This not only helps with the declaration but also makes the symbols visible, so they can be called form outside the library
*/
#define EXPORTED_FUNC_DECL(FUNC) EXPORT_FUNC FUNC
/** @} */
#endif /* __EXTERNAL_RENDERER_INTERFACES_H__ */

View File

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

View File

@ -77,9 +77,9 @@ static void layer_settings_class_init(LayerSettingsClass *klass)
* @brief Copy layer_info struct * @brief Copy layer_info struct
* *
* This function copies a 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 * @param info Info to copy
* @return new layer_info struct * @return new layer_info struct
*/ */

31
main.c
View File

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

View File

@ -31,6 +31,7 @@
#include <cairo.h> #include <cairo.h>
#include <cairo-pdf.h> #include <cairo-pdf.h>
#include <cairo-svg.h> #include <cairo-svg.h>
#include <glib/gi18n.h>
#include <gds-render/output-renderers/cairo-renderer.h> #include <gds-render/output-renderers/cairo-renderer.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -267,7 +268,7 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer
//process_id = -1; //process_id = -1;
if (process_id < 0) { if (process_id < 0) {
/* This should not happen */ /* 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); exit(-2);
} else if (process_id > 0) { } else if (process_id > 0) {
/* Woohoo... Successfully dumped the shitty code to an unknowing victim */ /* 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; linfo = (struct layer_info *)info_list->data;
if (linfo->layer >= MAX_LAYERS) { if (linfo->layer >= MAX_LAYERS) {
printf("Layer outside of Spec.\n"); printf(_("Layer number too high / outside of spec.\n"));
continue; continue;
} }
@ -327,7 +328,7 @@ static int cairo_renderer_render_cell_to_vector_file(GdsOutputRenderer *renderer
/* Print size */ /* Print size */
cairo_recording_surface_ink_extents(layers[linfo->layer].rec, &rec_x0, &rec_y0, cairo_recording_surface_ink_extents(layers[linfo->layer].rec, &rec_x0, &rec_y0,
&rec_width, &rec_height); &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->layer,
(linfo->name && linfo->name[0] ? " (" : ""), (linfo->name && linfo->name[0] ? " (" : ""),
(linfo->name && linfo->name[0] ? linfo->name : ""), (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)) { for (info_list = layer_infos; info_list != NULL; info_list = g_list_next(info_list)) {
linfo = (struct layer_info *)info_list->data; 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) { if (linfo->layer >= MAX_LAYERS) {
printf("Layer outside of Spec.\n"); printf(_("Layer outside of spec.\n"));
continue; continue;
} }
@ -405,7 +406,7 @@ ret_clear_layers:
} }
free(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 */ /* Suspend child process */
exit(0); exit(0);
@ -463,7 +464,7 @@ static int cairo_renderer_render_output(GdsOutputRenderer *renderer,
else else
pdf_file = output_file; 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); ret = cairo_renderer_render_cell_to_vector_file(renderer, cell, layer_infos, pdf_file, svg_file, scale);
if (settings) if (settings)

View File

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

View File

@ -28,6 +28,7 @@
*/ */
#include <gds-render/output-renderers/gds-output-renderer.h> #include <gds-render/output-renderers/gds-output-renderer.h>
#include <glib/gi18n.h>
struct renderer_params { struct renderer_params {
struct gds_cell *cell; struct gds_cell *cell;
@ -70,7 +71,7 @@ static int gds_output_renderer_render_dummy(GdsOutputRenderer *renderer,
(void)cell; (void)cell;
(void)scale; (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; return 0;
} }
@ -168,17 +169,17 @@ static void gds_output_renderer_class_init(GdsOutputRendererClass *klass)
/* Setup properties */ /* Setup properties */
gds_output_renderer_properties[PROP_OUTPUT_FILE] = 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); NULL, G_PARAM_READWRITE);
gds_output_renderer_properties[PROP_LAYER_SETTINGS] = gds_output_renderer_properties[PROP_LAYER_SETTINGS] =
g_param_spec_object("layer-settings", "Layer Settings object", g_param_spec_object(N_("layer-settings"), N_("Layer Settings object"),
"Object containing the layer rendering information", N_("Object containing the layer rendering information"),
GDS_RENDER_TYPE_LAYER_SETTINGS, G_PARAM_READWRITE); GDS_RENDER_TYPE_LAYER_SETTINGS, G_PARAM_READWRITE);
g_object_class_install_properties(oclass, N_PROPERTIES, gds_output_renderer_properties); g_object_class_install_properties(oclass, N_PROPERTIES, gds_output_renderer_properties);
/* Setup output signals */ /* Setup output signals */
gds_output_renderer_signals[ASYNC_FINISHED] = 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, G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
NULL, NULL,
NULL, NULL,
@ -188,7 +189,7 @@ static void gds_output_renderer_class_init(GdsOutputRendererClass *klass)
0, 0,
NULL); NULL);
gds_output_renderer_signals[ASYNC_PROGRESS_CHANGED] = 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, G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
NULL, NULL,
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) 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, return GDS_RENDER_OUTPUT_RENDERER(g_object_new(GDS_RENDER_TYPE_OUTPUT_RENDERER,
"layer-settings", layer_settings, N_("layer-settings"), layer_settings,
"output-file", output_file, N_("output-file"), output_file,
NULL)); NULL));
} }
@ -235,14 +236,14 @@ void gds_output_renderer_set_output_file(GdsOutputRenderer *renderer, const gcha
/* Check if the filename is actually filled */ /* Check if the filename is actually filled */
if (!file_name || !file_name[0]) if (!file_name || !file_name[0])
return; 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 *gds_output_renderer_get_output_file(GdsOutputRenderer *renderer)
{ {
const char *file = NULL; const char *file = NULL;
g_object_get(renderer, "output-file", &file, NULL); g_object_get(renderer, N_("output-file"), &file, NULL);
return file; return file;
} }
@ -257,7 +258,7 @@ LayerSettings *gds_output_renderer_get_and_ref_layer_settings(GdsOutputRenderer
g_mutex_lock(&priv->settings_lock); g_mutex_lock(&priv->settings_lock);
/* This function seems to already reference the LayerSettings object */ /* 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 */ /* It is now safe to clear the lock */
g_mutex_unlock(&priv->settings_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_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) 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); GdsOutputRendererPrivate *priv = gds_output_renderer_get_instance_private(renderer);
if (GDS_RENDER_IS_OUTPUT_RENDERER(renderer) == FALSE) { 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; return GDS_OUTPUT_RENDERER_GEN_ERR;
} }
if (!priv->output_file || !priv->output_file[0]) { 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; return GDS_OUTPUT_RENDERER_GEN_ERR;
} }
if (!priv->layer_settings) { if (!priv->layer_settings) {
g_error("No layer specification supplied."); g_error(_("No layer specification supplied."));
return GDS_OUTPUT_RENDERER_GEN_ERR; return GDS_OUTPUT_RENDERER_GEN_ERR;
} }
if (!cell) { 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; return GDS_OUTPUT_RENDERER_PARAM_ERR;
} }
klass = GDS_RENDER_OUTPUT_RENDERER_GET_CLASS(renderer); klass = GDS_RENDER_OUTPUT_RENDERER_GET_CLASS(renderer);
if (klass->render_output == NULL) { 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; return GDS_OUTPUT_RENDERER_GEN_ERR;
} }
@ -361,12 +362,14 @@ int gds_output_renderer_render_output_async(GdsOutputRenderer *renderer, struct
priv = gds_output_renderer_get_instance_private(renderer); priv = gds_output_renderer_get_instance_private(renderer);
if (priv->task) { if (priv->task) {
g_warning("renderer already started asynchronously"); g_warning(_("Renderer already started asynchronously"));
return -2000; return -2000;
} }
priv->task = g_task_new(renderer, NULL, gds_output_renderer_async_finished, NULL); 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); g_mutex_lock(&priv->settings_lock);
priv->async_params.cell = cell; priv->async_params.cell = cell;

View File

@ -27,6 +27,8 @@
#include <stdio.h> #include <stdio.h>
#include <gds-render/output-renderers/latex-renderer.h> #include <gds-render/output-renderers/latex-renderer.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <glib/gi18n.h>
/** /**
* @addtogroup LaTeX-Renderer * @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; struct gds_cell_instance *inst;
status = g_string_new(NULL); 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); gds_output_renderer_update_async_progress(renderer, status->str);
g_string_free(status, TRUE); 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); l_renderer->pdf_layers, l_renderer->tex_standalone, renderer);
fclose(tex_file); fclose(tex_file);
} else { } else {
g_error("Could not open LaTeX output file"); g_error(_("Could not open LaTeX output file"));
} }
if (settings) if (settings)
@ -433,14 +435,14 @@ static void latex_renderer_class_init(LatexRendererClass *klass)
latex_renderer_properties[PROP_STANDALONE] = latex_renderer_properties[PROP_STANDALONE] =
g_param_spec_boolean("standalone", g_param_spec_boolean("standalone",
"Standalone TeX file", N_("Standalone TeX file"),
"Generate a standalone LaTeX file.", N_("Generate a standalone LaTeX file."),
FALSE, FALSE,
G_PARAM_READWRITE); G_PARAM_READWRITE);
latex_renderer_properties[PROP_PDF_LAYERS] = latex_renderer_properties[PROP_PDF_LAYERS] =
g_param_spec_boolean("pdf-layers", g_param_spec_boolean("pdf-layers",
"PDF OCR layers", N_("PDF OCR layers"),
"Generate OCR layers", N_("Generate OCR layers"),
FALSE, FALSE,
G_PARAM_READWRITE); G_PARAM_READWRITE);

2
plugins/CMakeLists.txt Normal file
View File

@ -0,0 +1,2 @@
add_subdirectory(plugin-example)
add_custom_target(plugins DEPENDS pluginexample)

View File

@ -0,0 +1,14 @@
project(pluginexample)
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)
set_target_properties(${PROJECT_NAME} PROPERTIES C_VISIBILITY_PRESET hidden)
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)

View File

@ -0,0 +1,49 @@
/*
* GDSII-Converter example plugin
* Copyright (C) 2019 Mario Hüttel <mario.huettel@gmx.net>
*
* 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 <http://www.gnu.org/licenses/>.
*/
/**
* @defgroup example-plugin Example Plugin for External Renderer
* @ingroup plugins
* This is a template / example for an external renderer plugin
* @addtogroup example-plugin
* @{
*/
#include <stdio.h>
#include <glib.h>
#include <gds-render/gds-utils/gds-types.h>
#include <gds-render/output-renderers/external-renderer-interfaces.h>
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;
printf("Rendering %s\n", toplevel->name);
return 0;
}
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;
}
/** @} */

View File

@ -12,8 +12,28 @@ cd "$DIR"
files=`find ../ -name "*.c"` files=`find ../ -name "*.c"`
mkdir -p "pot" mkdir -p "pot"
# C Files
pot="pot/gds-render.pot"
for file in $files; do for file in $files; do
pot="pot/"$(echo "${file#*/}" | sed -e "s/\//_/g") echo "Parsing C file $file"
pot="${pot%.c}.pot" # pot="pot/"$(echo "${file#*/}" | sed -e "s/\//_/g")
xgettext --keyword=_ --language=C --add-comments --sort-output -o "$pot" "$file" # 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 done

View File

@ -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 PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
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: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../command-line.c:203
#, c-format
msgid "%d reference loops found.\n"
msgstr ""
#: ../command-line.c:207
#, c-format
msgid "Cell is affected by reference loop. Abort!\n"
msgstr ""
#: ../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 ""
#: ../command-line.c:200
#, c-format
msgid "Checking library %s failed.\n"
msgstr ""
#: ../command-line.c:193
#, 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:184
#, 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:158
#, c-format
msgid "Probably missing argument. Check --help option\n"
msgstr ""

View File

@ -1,50 +0,0 @@
# 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 <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
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: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../gds-render-gui.c:273
msgid "Acc. Date"
msgstr ""
#: ../gds-render-gui.c:314
msgid "Cancel"
msgstr ""
#: ../gds-render-gui.c:266
msgid "Cell"
msgstr ""
#: ../gds-render-gui.c:322
msgid "GDSII-Files"
msgstr ""
#: ../gds-render-gui.c:263
msgid "Library"
msgstr ""
#: ../gds-render-gui.c:270
msgid "Mod. Date"
msgstr ""
#: ../gds-render-gui.c:315
msgid "Open GDSII"
msgstr ""
#: ../gds-render-gui.c:312
msgid "Open GDSII File"
msgstr ""

View File

@ -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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 <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 <SCALE>"
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 ""

View File

@ -1,111 +0,0 @@
# 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 <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
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: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../main.c:99
#, c-format
msgid ""
"\n"
"\n"
"Full git commit: %s"
msgstr ""
#: ../main.c:289
msgid " FILE - Convert GDS file <FILE> to graphic"
msgstr ""
#: ../main.c:223
msgid "About"
msgstr ""
#: ../main.c:282
msgid "Cell to render"
msgstr ""
#: ../main.c:284
msgid "Create PDF Layers (OCG)"
msgstr ""
#: ../main.c:283
msgid "Create standalone TeX"
msgstr ""
#: ../main.c:279
msgid "Divide output coordinates by <SCALE>"
msgstr ""
#: ../main.c:314
#, c-format
msgid "Ignored argument: %s"
msgstr ""
#: ../main.c:118
#, c-format
msgid "Logo could not be displayed: %s\n"
msgstr ""
#: ../main.c:294
#, c-format
msgid "Option parsing failed: %s\n"
msgstr ""
#: ../main.c:280
msgid "Output file path. Can be used multiple times."
msgstr ""
#: ../main.c:281
msgid "Path for Layer Mapping File"
msgstr ""
#: ../main.c:277
msgid "Print version"
msgstr ""
#: ../main.c:222
msgid "Quit"
msgstr ""
#: ../main.c:278
msgid "Renderer to use. Can be used multiple times."
msgstr ""
#: ../main.c:305
#, c-format
msgid "Scale < 1 not allowed. Setting to 1\n"
msgstr ""
#: ../main.c:215
#, c-format
msgid ""
"There is already an open instance. Will open second window in that "
"instance.\n"
msgstr ""
#: ../main.c:247
#, 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:98
msgid ""
"gds-render is a free tool for rendering GDS2 layout files into vector "
"graphics."
msgstr ""

View File

@ -1 +0,0 @@
*.po~

View File

@ -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 <mario.huettel@gmx.net>, 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: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\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"

View File

@ -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 <mario.huettel@gmx.net>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gds-render VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-22 23:02+0200\n"
"PO-Revision-Date: 2019-10-18 23:10+0200\n"
"Last-Translator: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\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:273
msgid "Acc. Date"
msgstr "Zugr. Datum"
#: ../gds-render-gui.c:314
msgid "Cancel"
msgstr "Abbruch"
#: ../gds-render-gui.c:266
msgid "Cell"
msgstr "Zelle"
#: ../gds-render-gui.c:322
msgid "GDSII-Files"
msgstr "GDSII-Dateiem"
#: ../gds-render-gui.c:263
msgid "Library"
msgstr "Bibliothek"
#: ../gds-render-gui.c:270
msgid "Mod. Date"
msgstr "Mod. Datum"
#: ../gds-render-gui.c:315
msgid "Open GDSII"
msgstr "GDSII öffnen"
#: ../gds-render-gui.c:312
msgid "Open GDSII File"
msgstr "GDSII Datei öffnen"

View File

@ -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.
# マリオ <mario.huettel@gmx.net>, 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 22:00+0100\n"
"Last-Translator: Mario Hüttel <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\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 <FILE> to graphic"
msgstr " DATEI - Konvertiere GDS-Datei <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 <SCALE>"
msgstr "Dividiere Ausgabekoordinaten durch <SCALE>"
#: ../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 zum Exporieren"
#: ../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"

View File

@ -1,122 +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 <mario.huettel@gmx.net>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gds-render VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-18 23:03+0200\n"
"PO-Revision-Date: 2019-10-18 20:49+0200\n"
"Last-Translator: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\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:99
#, c-format
msgid ""
"\n"
"\n"
"Full git commit: %s"
msgstr ""
"\n"
"\n"
"Vollständige git Commit-ID %s"
#: ../main.c:289
msgid " FILE - Convert GDS file <FILE> to graphic"
msgstr "Datei -- Konvertiere GDS Datei <Datei> zu Vektorgrafik"
#: ../main.c:223
msgid "About"
msgstr "Über"
#: ../main.c:282
msgid "Cell to render"
msgstr "Zu konvertierende Zelle"
#: ../main.c:284
msgid "Create PDF Layers (OCG)"
msgstr "Generiere PDF Layer (OCG)"
#: ../main.c:283
msgid "Create standalone TeX"
msgstr "Generiere alleinstehendes TeX"
#: ../main.c:279
msgid "Divide output coordinates by <SCALE>"
msgstr "Skaliere Ausgabekoordinaten um Faktor <SCALE> herab"
#: ../main.c:314
#, c-format
msgid "Ignored argument: %s"
msgstr "Ignoriertes Argument: %s"
#: ../main.c:118
#, c-format
msgid "Logo could not be displayed: %s\n"
msgstr "Logo konnte nicht angezeigt werden: %s\n"
#: ../main.c:294
#, c-format
msgid "Option parsing failed: %s\n"
msgstr "Übergabeparameterkonvertierung fehlgeschlagen: %s\n"
#: ../main.c:280
msgid "Output file path. Can be used multiple times."
msgstr "Ausgabedatei. Kann mehrfach angegeben werden."
#: ../main.c:281
msgid "Path for Layer Mapping File"
msgstr "Pfad zur \"Layer Mapping\"-Datei"
#: ../main.c:277
msgid "Print version"
msgstr "Programmversion aufgeben"
#: ../main.c:222
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:305
#, c-format
msgid "Scale < 1 not allowed. Setting to 1\n"
msgstr "Skalierung < 1 nicht erlaubt. Rückfallwert 1 benutzt.\n"
#: ../main.c:215
#, 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:247
#, 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:98
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."

View File

@ -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 <mario.huettel@gmx.net>, 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: <mario.huettel@gmx.net>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\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..."

View File

@ -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 PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
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: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../widgets/activity-bar.c:105
msgid "Ready"
msgstr ""
#: ../widgets/activity-bar.c:111
msgid "Working..."
msgstr ""

View File

@ -17,7 +17,6 @@
* along with GDSII-Converter. If not, see <http://www.gnu.org/licenses/>. * along with GDSII-Converter. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @defgroup version Version Number * @defgroup version Version Number
* See @ref git-version-num * See @ref git-version-num

View File

@ -99,7 +99,6 @@ ActivityBar *activity_bar_new()
return bar; return bar;
} }
/* TODO: Complete this once the task list is fully implemented */
void activity_bar_set_ready(ActivityBar *bar) void activity_bar_set_ready(ActivityBar *bar)
{ {
gtk_label_set_text(GTK_LABEL(bar->label), _("Ready")); gtk_label_set_text(GTK_LABEL(bar->label), _("Ready"));

View File

@ -30,6 +30,7 @@
*/ */
#include <gds-render/widgets/conv-settings-dialog.h> #include <gds-render/widgets/conv-settings-dialog.h>
#include <glib/gi18n.h>
struct _RendererSettingsDialog { struct _RendererSettingsDialog {
GtkDialog parent; GtkDialog parent;
@ -102,9 +103,9 @@ static void renderer_settings_dialog_class_init(RendererSettingsDialogClass *kla
oclass->set_property = renderer_settings_dialog_set_property; oclass->set_property = renderer_settings_dialog_set_property;
oclass->get_property = renderer_settings_dialog_get_property; oclass->get_property = renderer_settings_dialog_get_property;
properties[PROP_CELL_NAME] = g_param_spec_string("cell-name", properties[PROP_CELL_NAME] = g_param_spec_string(N_("cell-name"),
"cell-name", N_("cell-name"),
"Cell name to be displayed in header bar", N_("Cell name to be displayed in header bar"),
"", "",
G_PARAM_READWRITE); G_PARAM_READWRITE);
g_object_class_install_properties(oclass, PROP_COUNT, properties); 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); width_engineering = convert_number_to_engineering(width_meters, &width_prefix);
height_engineering = convert_number_to_engineering(height_meters, &height_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); 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); gtk_label_set_text(self->y_label, default_buff);
scale = gtk_range_get_value(GTK_RANGE(self->scale)); scale = gtk_range_get_value(GTK_RANGE(self->scale));
/* Set the pixel sizes */ /* 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)); (unsigned int)((double)self->cell_width / scale));
gtk_label_set_text(self->x_output_label, default_buff); 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)); (unsigned int)((double)self->cell_height / scale));
gtk_label_set_text(self->y_output_label, default_buff); 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->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")); 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_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(self->radio_latex, "toggled", G_CALLBACK(latex_render_callback), (gpointer)self);
g_signal_connect(G_OBJECT(self->shape_drawing), g_signal_connect(G_OBJECT(self->shape_drawing),

View File

@ -37,6 +37,7 @@
*/ */
#include <gds-render/widgets/layer-element.h> #include <gds-render/widgets/layer-element.h>
#include <glib/gi18n.h>
G_DEFINE_TYPE(LayerElement, layer_element, GTK_TYPE_LIST_BOX_ROW) 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; GString *string;
string = g_string_new_len(NULL, 100); 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); gtk_label_set_text(elem->priv.layer, (const gchar *)string->str);
elem->priv.layer_num = layer; elem->priv.layer_num = layer;
g_string_free(string, TRUE); g_string_free(string, TRUE);