X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f X-Recipient: geda-user AT delorie DOT com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1386889313; bh=j3ARFL4e8ykLoivtg1i1RjX2xtphKKGChNjiVOJj6so=; h=Date:From:To:Subject:Message-ID:X-Mailer:Mime-Version: Content-Type; b=CTfp7nK5q2aaOmNvvVM8zzYktwtpEo5DU8UO22uiMb4Dqjcn0nKKepJSMQlk/zYj/ FR341mCkvvo0pD+RrwFCdU/cP2KpmKVTwHQZrbzcRS9SgEX7QN5lOd8UjaZfxj8pm3 x1ZE+e1V0YCJFS48sB/bUZSMJt3O3KWBciqIWFJQ= Authentication-Results: smtp1o.mail.yandex.net; dkim=pass header.i=@yandex.ru Date: Fri, 13 Dec 2013 05:01:40 +0600 From: Alexey Shaposhnikov To: geda-user AT delorie DOT com Subject: [geda-user] [PATCH] Customizable graphical elements Message-ID: <20131213050140.4ae1f52c@warrawoona.sti> X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.22; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/dGZFl4awxs6U6xPcnTIdpx0" Reply-To: geda-user AT delorie DOT com --MP_/dGZFl4awxs6U6xPcnTIdpx0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Wrote a small patch (for master branch from git) so user can set own sizes of the graphical elements (net, pin and bus widths plus end- and midcue siz= es) by using new EdaConfig mechanism. It look in "geda.graphical" group for following keys: bus_width (int, set a line width for buses); net_width (int, set a line width for buses); pin_width_net / pin_width_bus (int, set a line width for both types of pins= ); end_cue_width (int, set width for cue box at ends of unconnected pins and nets); cue_width (int, set dameter for intersection cue); Also I partially rewrote cue drawing functions and gEDA after patch will not draw cues over buses intersections. P.S. Patch is obviously crude, so critics and suggestions are welcome. --=20 =D0=A1 =D1=83=D0=B2=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC, =D0=90=D0=BB= =D0=B5=D0=BA=D1=81=D0=B5=D0=B9 =D0=A8=D0=B0=D0=BF=D0=BE=D1=88=D0=BD=D0=B8= =D0=BA=D0=BE=D0=B2. --MP_/dGZFl4awxs6U6xPcnTIdpx0 Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=customizable_graphical_elements.patch diff --git a/libgeda/src/o_bus_basic.c b/libgeda/src/o_bus_basic.c index 87ab800..fb878d5 100644 --- a/libgeda/src/o_bus_basic.c +++ b/libgeda/src/o_bus_basic.c @@ -64,7 +64,7 @@ void world_get_bus_bounds(TOPLEVEL *toplevel, OBJECT *object, int *left, int *to /*! \brief create a new bus object * \par Function Description * This function creates and returns a new bus object. - * + * * \param [in] toplevel The TOPLEVEL object. * \param [in] type The OBJECT type (usually OBJ_BUS) * \param [in] color The color of the bus @@ -76,29 +76,39 @@ void world_get_bus_bounds(TOPLEVEL *toplevel, OBJECT *object, int *left, int *to * \return A new bus OBJECT */ OBJECT *o_bus_new(TOPLEVEL *toplevel, - char type, int color, - int x1, int y1, int x2, int y2, - int bus_ripper_direction) + char type, int color, + int x1, int y1, int x2, int y2, + int bus_ripper_direction) { - OBJECT *new_node; + OBJECT *new_node; + EdaConfig *cfg; + int size; + + /* TODO: add a sanity check. Just use toplevel->page_current for getting + path work with gschem but make "gaf export" to segfault. */ + cfg = eda_config_get_context_for_file (NULL); + size = eda_config_get_int (cfg, "geda.graphical", "bus_width", NULL); + if (!size) { + size = BUS_WIDTH; + }; - new_node = s_basic_new_object(type, "bus"); - new_node->color = color; + new_node = s_basic_new_object(type, "bus"); + new_node->color = color; - new_node->line = (LINE *) g_malloc(sizeof(LINE)); - /* check for null */ + new_node->line = (LINE *) g_malloc(sizeof(LINE)); + /* check for null */ - new_node->line->x[0] = x1; - new_node->line->y[0] = y1; - new_node->line->x[1] = x2; - new_node->line->y[1] = y2; - new_node->line_width = BUS_WIDTH; + new_node->line->x[0] = x1; + new_node->line->y[0] = y1; + new_node->line->x[1] = x2; + new_node->line->y[1] = y2; + new_node->line_width = size; - new_node->bus_ripper_direction = bus_ripper_direction; + new_node->bus_ripper_direction = bus_ripper_direction; - new_node->w_bounds_valid_for = NULL; + new_node->w_bounds_valid_for = NULL; - return new_node; + return new_node; } /*! \brief read a bus object from a char buffer diff --git a/libgeda/src/o_net_basic.c b/libgeda/src/o_net_basic.c index a701543..d662e6b 100644 --- a/libgeda/src/o_net_basic.c +++ b/libgeda/src/o_net_basic.c @@ -64,7 +64,7 @@ void world_get_net_bounds(TOPLEVEL *toplevel, OBJECT *object, int *left, /*! \brief create a new net object * \par Function Description * This function creates and returns a new net object. - * + * * \param [in] toplevel The TOPLEVEL object. * \param [in] type The OBJECT type (usually OBJ_NET) * \param [in] color The color of the net @@ -75,25 +75,34 @@ void world_get_net_bounds(TOPLEVEL *toplevel, OBJECT *object, int *left, * \return A new net OBJECT */ OBJECT *o_net_new(TOPLEVEL *toplevel, char type, - int color, int x1, int y1, int x2, int y2) + int color, int x1, int y1, int x2, int y2) { - OBJECT *new_node; + OBJECT *new_node; + EdaConfig *cfg; + int size; + + /* TODO: check how to get page path for "gaf export" */ + cfg = eda_config_get_context_for_file (NULL); + size = eda_config_get_int (cfg, "geda.graphical", "net_width", NULL); + if (!size) { + size = NET_WIDTH; + }; - new_node = s_basic_new_object(type, "net"); - new_node->color = color; + new_node = s_basic_new_object(type, "net"); + new_node->color = color; - new_node->line = (LINE *) g_malloc(sizeof(LINE)); - /* check for null */ + new_node->line = (LINE *) g_malloc(sizeof(LINE)); + /* check for null */ - new_node->line->x[0] = x1; - new_node->line->y[0] = y1; - new_node->line->x[1] = x2; - new_node->line->y[1] = y2; - new_node->line_width = NET_WIDTH; + new_node->line->x[0] = x1; + new_node->line->y[0] = y1; + new_node->line->x[1] = x2; + new_node->line->y[1] = y2; + new_node->line_width = size; - new_node->w_bounds_valid_for = NULL; + new_node->w_bounds_valid_for = NULL; - return new_node; + return new_node; } /*! \brief read a net object from a char buffer diff --git a/libgeda/src/o_pin_basic.c b/libgeda/src/o_pin_basic.c index 0106f4d..3fa63ba 100644 --- a/libgeda/src/o_pin_basic.c +++ b/libgeda/src/o_pin_basic.c @@ -468,19 +468,32 @@ void o_pin_update_whichend(TOPLEVEL *toplevel, */ void o_pin_set_type (TOPLEVEL *toplevel, OBJECT *o_current, int pin_type) { - o_emit_pre_change_notify (toplevel, o_current); - switch (pin_type) { - default: - g_critical ("o_pin_set_type: Got invalid pin type %i\n", pin_type); - /* Fall through */ - case PIN_TYPE_NET: - o_current->line_width = PIN_WIDTH_NET; - o_current->pin_type = PIN_TYPE_NET; - break; - case PIN_TYPE_BUS: - o_current->line_width = PIN_WIDTH_BUS; - o_current->pin_type = PIN_TYPE_BUS; - break; - } - o_emit_change_notify (toplevel, o_current); + EdaConfig *cfg; + int size; + + /* TODO: add checking for page path, without crashing "gaf export" */ + cfg = eda_config_get_context_for_file(NULL); + + o_emit_pre_change_notify (toplevel, o_current); + switch (pin_type) { + default: + g_critical ("o_pin_set_type: Got invalid pin type %i\n", pin_type); + /* Fall through */ + case PIN_TYPE_NET: + size = eda_config_get_int(cfg, "geda.graphical", "pin_width_net", NULL); + if (!size) { + size = PIN_WIDTH_NET; + } + o_current->pin_type = PIN_TYPE_NET; + break; + case PIN_TYPE_BUS: + size = eda_config_get_int(cfg, "geda.graphical", "pin_width_bus", NULL); + if (!size) { + size = PIN_WIDTH_BUS; + } + o_current->pin_type = PIN_TYPE_BUS; + break; + } + o_current->line_width = size; + o_emit_change_notify (toplevel, o_current); } diff --git a/libgedacairo/edarenderer.c b/libgedacairo/edarenderer.c index e065081..aa48dac 100644 --- a/libgedacairo/edarenderer.c +++ b/libgedacairo/edarenderer.c @@ -146,8 +146,6 @@ static void eda_renderer_draw_cues_list (EdaRenderer *renderer, GList *objects); static void eda_renderer_draw_end_cues (EdaRenderer *renderer, OBJECT *object, int end); static void eda_renderer_draw_mid_cues (EdaRenderer *renderer, OBJECT *object); -static void eda_renderer_draw_junction_cue (EdaRenderer *renderer, int x, int y, - int is_bus); static int eda_renderer_default_get_user_bounds (EdaRenderer *renderer, OBJECT *object, double *left, double *top, @@ -641,12 +639,12 @@ static void eda_renderer_draw_net (EdaRenderer *renderer, OBJECT *object) { eda_cairo_line (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), - END_SQUARE, NET_WIDTH, + END_SQUARE, object->line_width, object->line->x[0], object->line->y[0], object->line->x[1], object->line->y[1]); eda_cairo_stroke (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), TYPE_SOLID, END_SQUARE, - EDA_RENDERER_STROKE_WIDTH (renderer, NET_WIDTH), + EDA_RENDERER_STROKE_WIDTH (renderer, object->line_width), -1, -1); } @@ -654,37 +652,25 @@ static void eda_renderer_draw_bus (EdaRenderer *renderer, OBJECT *object) { eda_cairo_line (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), - END_SQUARE, BUS_WIDTH, + END_SQUARE, object->line_width, object->line->x[0], object->line->y[0], object->line->x[1], object->line->y[1]); eda_cairo_stroke (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), TYPE_SOLID, END_SQUARE, - EDA_RENDERER_STROKE_WIDTH (renderer, BUS_WIDTH), + EDA_RENDERER_STROKE_WIDTH (renderer, object->line_width), -1, -1); } static void eda_renderer_draw_pin (EdaRenderer *renderer, OBJECT *object) { - int width = 0; - switch (object->pin_type) { - case PIN_TYPE_NET: - width = PIN_WIDTH_NET; - break; - case PIN_TYPE_BUS: - width = PIN_WIDTH_BUS; - break; - default: - g_return_if_reached (); - } - eda_cairo_line (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), - END_SQUARE, width, + END_SQUARE, object->line_width, object->line->x[0], object->line->y[0], object->line->x[1], object->line->y[1]); eda_cairo_stroke (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), TYPE_SOLID, END_SQUARE, - EDA_RENDERER_STROKE_WIDTH (renderer, width), + EDA_RENDERER_STROKE_WIDTH (renderer, object->line_width), -1, -1); } @@ -1343,11 +1329,12 @@ eda_renderer_default_draw_cues (EdaRenderer *renderer, OBJECT *object) eda_renderer_draw_cues_list (renderer, object->complex->prim_objs); break; case OBJ_NET: - case OBJ_BUS: eda_renderer_draw_mid_cues (renderer, object); eda_renderer_draw_end_cues (renderer, object, 0); eda_renderer_draw_end_cues (renderer, object, 1); break; + case OBJ_BUS: + break; case OBJ_PIN: g_return_if_fail ((object->whichend == 1) || (object->whichend == 0)); eda_renderer_draw_end_cues (renderer, object, object->whichend); @@ -1360,101 +1347,100 @@ eda_renderer_default_draw_cues (EdaRenderer *renderer, OBJECT *object) static void eda_renderer_draw_end_cues (EdaRenderer *renderer, OBJECT *object, int end) { - int x = object->line->x[end], y = object->line->y[end]; - int conn_count = 0; - int conn_type = CONN_ENDPOINT; - int is_bus = FALSE; - GList *iter; - - /* We should never be at the unconnectable end of a pin */ - g_return_if_fail ((object->type != OBJ_PIN) || (object->whichend == end)); - - /* Check whether the current object is a bus or bus pin */ - is_bus = ((object->type == OBJ_BUS) - || ((object->type == OBJ_PIN) - && (object->pin_type == PIN_TYPE_BUS))); - - for (iter = object->conn_list; iter != NULL; iter = g_list_next (iter)) { - CONN *conn = (CONN *) iter->data; - if ((conn->x != x) || (conn->y != y)) continue; - - /* Check whether the connected object is a bus or bus pin */ - is_bus |= ((conn->other_object->type == OBJ_BUS) - || ((conn->other_object->type == OBJ_PIN) - && (conn->other_object->pin_type == PIN_TYPE_BUS))); - - if (conn->type == CONN_MIDPOINT) { - /* If it's a mid-line connection, we can stop already. */ - conn_type = CONN_MIDPOINT; - break; - } - - conn_count++; - } - - /* Draw a midpoint, if necessary */ - if ((conn_type == CONN_MIDPOINT) - || ((object->type == OBJ_NET) && (conn_count > 1))) { - eda_renderer_draw_junction_cue (renderer, x, y, is_bus); - return; - } - - /* Only things left to be drawn are end point cues */ - if (!eda_renderer_is_drawable_color (renderer, NET_ENDPOINT_COLOR, TRUE)) - return; - eda_renderer_set_color (renderer, NET_ENDPOINT_COLOR); - - switch (object->type) { - case OBJ_NET: - case OBJ_PIN: - /* If less than one thing was connected to this end of the net - * segment or pin, draw box cue */ - if (conn_count > 0) break; - - eda_cairo_center_box (renderer->priv->cr, - EDA_RENDERER_CAIRO_FLAGS (renderer), - -1, -1, x, y, CUE_BOX_SIZE, CUE_BOX_SIZE); - cairo_fill (renderer->priv->cr); - break; - - case OBJ_BUS: - break; - default: - g_return_if_reached (); - } + int x = object->line->x[end], y = object->line->y[end]; + int conn_count = 0; + int conn_type = CONN_ENDPOINT; + GList *iter; + EdaConfig *cfg; + int size; + + /* TODO: get real page path without crashing gaf export. */ + cfg = eda_config_get_context_for_file(NULL); + size = eda_config_get_int(cfg, "geda.graphical", "end_cue_width", NULL); + if (!size) { + size = CUE_BOX_SIZE; + } + /* We should never be at the unconnectable end of a pin */ + g_return_if_fail ((object->type != OBJ_PIN) || (object->whichend == end)); + + for (iter = object->conn_list; iter != NULL; iter = g_list_next (iter)) { + CONN *conn = (CONN *) iter->data; + if ((conn->x != x) || (conn->y != y)) { + continue; + } + if (conn->type == CONN_MIDPOINT) { + /* If it's a mid-line connection, we can stop already. */ + conn_type = CONN_MIDPOINT; + break; + } + conn_count++; + } + + if ((conn_type == CONN_MIDPOINT) + || ((object->type == OBJ_NET) && (conn_count > 1))) { + return; + } + + /* Only things left to be drawn are end point cues */ + if (!eda_renderer_is_drawable_color (renderer, NET_ENDPOINT_COLOR, TRUE)) + return; + eda_renderer_set_color (renderer, NET_ENDPOINT_COLOR); + + /* If less than one thing was connected to this end of the net + * segment or pin, draw box cue */ + if (conn_count == 0) { + eda_cairo_center_box (renderer->priv->cr, + EDA_RENDERER_CAIRO_FLAGS (renderer), + -1, -1, x, y, size, size); + cairo_fill (renderer->priv->cr); + } } static void eda_renderer_draw_mid_cues (EdaRenderer *renderer, OBJECT *object) { - GList *iter; - for (iter = object->conn_list; iter != NULL; iter = g_list_next (iter)) { - CONN *conn = (CONN *) iter->data; - - if (conn->type == CONN_MIDPOINT) { - int is_bus = ((object->type == OBJ_BUS) - || (conn->other_object->type == OBJ_BUS) - || ((conn->other_object->type == OBJ_PIN) - && (conn->other_object->pin_type == PIN_TYPE_BUS))); - eda_renderer_draw_junction_cue (renderer, conn->x, conn->y, is_bus); - } - } -} - -static void -eda_renderer_draw_junction_cue (EdaRenderer *renderer, int x, int y, int is_bus) -{ - double width = (is_bus ? BUS_WIDTH : NET_WIDTH); - double radius = (is_bus ? JUNCTION_CUE_SIZE_BUS : JUNCTION_CUE_SIZE_NET) / 2; - - if (!eda_renderer_is_drawable_color (renderer, JUNCTION_COLOR, 1)) { - return; - } - - eda_cairo_center_arc (renderer->priv->cr, EDA_RENDERER_CAIRO_FLAGS (renderer), - width, -1, x, y, radius, 0, 360); - eda_renderer_set_color (renderer, JUNCTION_COLOR); - cairo_fill (renderer->priv->cr); + GList *iter; + EdaConfig *cfg; + int width, diameter; + + /* TODO: get page path without crashing "gaf export" */ + cfg = eda_config_get_context_for_file(NULL); + width = eda_config_get_int (cfg, "geda.graphical", "net_width", NULL); + if (!width) { + width = NET_WIDTH; + } + diameter = eda_config_get_int (cfg, "geda.graphical", "cue_width", NULL); + if (!diameter) { + diameter = JUNCTION_CUE_SIZE_NET; + } + + for (iter = object->conn_list; iter != NULL; iter = g_list_next (iter)) { + CONN *conn = (CONN *) iter->data; + + if (conn->type == CONN_ENDPOINT) { + continue; + } + int is_bus = ((object->type == OBJ_BUS) || + (conn->other_object->type == OBJ_BUS) || + ((conn->other_object->type == OBJ_PIN) && + (conn->other_object->pin_type == PIN_TYPE_BUS))); + /* Don't show cue if connected to bus. + TODO: It's may be (and definitely will) a source of errors in case of + two or more nets connected at one point of bus. Need to do something, + at least show a clear sign of error. */ + if (is_bus && (conn->other_object->type != OBJ_PIN)) { + continue; + } + + if (!eda_renderer_is_drawable_color (renderer, JUNCTION_COLOR, 1)) { + return; + } + eda_cairo_center_arc (renderer->priv->cr, + EDA_RENDERER_CAIRO_FLAGS (renderer), + width, -1, conn->x, conn->y, diameter/2, 0, 360); + eda_renderer_set_color (renderer, JUNCTION_COLOR); + cairo_fill (renderer->priv->cr); + } } /* ================================================================ --MP_/dGZFl4awxs6U6xPcnTIdpx0--