diff options
author | Lars Clausen <lclausen@src.gnome.org> | 2007-03-29 10:23:40 +0000 |
---|---|---|
committer | Lars Clausen <lclausen@src.gnome.org> | 2007-03-29 10:23:40 +0000 |
commit | 3a03fdd1aca8dea0157d7d096f31613377acfd31 (patch) | |
tree | 4b14928c2cec0a2cea62dde63f71c1bf5be9c624 | |
parent | 3f1eb324ef01fb0e27eda5883090bd8355b73382 (diff) | |
download | dia_0_96.tar.xz |
Version 0.96.1dia_0_96
svn path=/branches/dia_0_96/; revision=3657
-rw-r--r-- | ChangeLog | 29 | ||||
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | app/diapsrenderer.c | 4 | ||||
-rw-r--r-- | config.h.win32 | 2 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | doc/en/dia.xml | 2 | ||||
-rw-r--r-- | doc/eu/dia.xml | 2 | ||||
-rw-r--r-- | doc/pl/dia.xml | 2 | ||||
-rw-r--r-- | lib/text.c | 1 | ||||
-rw-r--r-- | plug-ins/dxf/dxf-import.c | 10 | ||||
-rw-r--r-- | plug-ins/vdx/vdx-import.c | 192 |
11 files changed, 197 insertions, 54 deletions
@@ -1,7 +1,30 @@ -2007-03-26 Hans Breuer <hans@breuer.org> +2007-03-29 Lars Clausen <lars@raeder.dk> - * bindings/* : dia/lib bindings with the help of SWIG, for details - see: http://mail.gnome.org/archives/dia-list/2007-March/msg00092.html + * NEWS: + * RELEASE-PROCESS: + * config.h.win32: + * doc/en/dia.xml: + * doc/pl/dia.xml: + * doc/eu/dia.xml: + * configure.in: Release 0.96.1 is a brown-bag release for empty + initial line problem in shapes, and a couple other bugs. + + * app/diapsrenderer.c (draw_text_line): Use language-independent + float conversion in new text rendering code. Fixes bug #424052. + + * plug-ins/vdx/vdx-import.c: Updated to version 0.9.4 to fix shape + problems and text errors. Fixes bug #417956. + + * lib/text.c (text_key_event): Treat keypad enter like return. + Fixes bug #423480. + + * plug-ins/dxf/dxf-import.c: Load closed polyline as polygon, + patch from Ben Abbott fixes font height problems. Fixes bug #421250. + +2007-03-28 Lars Clausen <lars@raeder.dk> + + * objects/custom/custom_object.c (custom_update_data): Use newer + way to get text ascent. Fixes bug #423351. 2007-03-25 Lars Clausen <lars@raeder.dk> @@ -1,3 +1,8 @@ +dia-0.96.1: 29-Mar-2007 + + * Brown-bag release with five bugfixes, one of them critical: Empty + initial lines in shapes crashes Dia (#421250). + dia-0.96: 25-Mar-2007 * Final release of 0.96. diff --git a/app/diapsrenderer.c b/app/diapsrenderer.c index 31e2d656..f7a9ee16 100644 --- a/app/diapsrenderer.c +++ b/app/diapsrenderer.c @@ -719,6 +719,7 @@ draw_text_line(DiaRenderer *self, gchar *text = text_line_get_string(text_line); int n_chars = g_utf8_strlen(text, -1); real adjust; + gchar sw_buf[DTOSTR_BUF_SIZE]; if (1 > n_chars) return; @@ -743,7 +744,8 @@ draw_text_line(DiaRenderer *self, width = text_line_get_width(text_line); /* Find the difference in length */ - fprintf(renderer->file, "dup sw %f exch sub \n", width); + fprintf(renderer->file, "dup sw %s exch sub \n", + psrenderer_dtostr(sw_buf, (gdouble) width)); /* Divide by number of chars and set up for ashow */ fprintf(renderer->file, "%d div exch 0.0 exch \n", n_chars); diff --git a/config.h.win32 b/config.h.win32 index 47504508..341388e7 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -18,7 +18,7 @@ #undef LOCALEDIR /* needs to be calculated at runtime */ /* NOT: #define LOCALEDIR "../lib/locale" */ -#define VERSION "0.96" +#define VERSION "0.96.1" /* * We are linking libxml as DLL with either msvc or mingw, but this diff --git a/configure.in b/configure.in index b2c2dac1..ef243196 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this -*- autoconf -*- file with autoconf to produce a dnl configure script. -AC_INIT(dia, 0.96, http://bugzilla.gnome.org/enter_bug.cgi?product=dia) +AC_INIT(dia, 0.96.1, http://bugzilla.gnome.org/enter_bug.cgi?product=dia) AC_CONFIG_SRCDIR(app/diagram.c) AM_INIT_AUTOMAKE(AC_PACKAGE_NAME,AC_PACKAGE_VERSION) diff --git a/doc/en/dia.xml b/doc/en/dia.xml index 1fddb228..b7d335e2 100644 --- a/doc/en/dia.xml +++ b/doc/en/dia.xml @@ -8,7 +8,7 @@ [ - <!ENTITY VERSION "0.96"> + <!ENTITY VERSION "0.96.1"> <!ENTITY INTRODUCTION SYSTEM "intro.xml"> diff --git a/doc/eu/dia.xml b/doc/eu/dia.xml index 189ff61c..e35e4b8f 100644 --- a/doc/eu/dia.xml +++ b/doc/eu/dia.xml @@ -4,7 +4,7 @@ <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "../../dtd/docbookx.dtd" [ - <!ENTITY VERSION "0.96"> + <!ENTITY VERSION "0.96.1"> <!ENTITY INTRODUCTION SYSTEM "intro.xml"> diff --git a/doc/pl/dia.xml b/doc/pl/dia.xml index 171cc447..b9b8c702 100644 --- a/doc/pl/dia.xml +++ b/doc/pl/dia.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "../../dtd/docbookx.dtd"[ -<!ENTITY VERSION "0.96"> +<!ENTITY VERSION "0.96.1"> <!ENTITY INTRODUCTION SYSTEM "intro.xml"> <!ENTITY QUICKSTART SYSTEM "usage-quickstart.xml"> <!ENTITY CANVAS SYSTEM "usage-canvas.xml"> @@ -884,6 +884,7 @@ text_key_event(Focus *focus, guint keyval, const gchar *str, int strlen, text_delete_backward(text); break; case GDK_Return: + case GDK_KP_Enter: return_val = TRUE; *change = text_create_change(text, TYPE_SPLIT_ROW, 'Q', text->cursor_pos, text->cursor_row); diff --git a/plug-ins/dxf/dxf-import.c b/plug-ins/dxf/dxf-import.c index 0586c2d6..270af220 100644 --- a/plug-ins/dxf/dxf-import.c +++ b/plug-ins/dxf/dxf-import.c @@ -552,10 +552,7 @@ DiaObject *read_entity_polyline_dxf(FILE *filedxf, DxfData *data, DiagramData *d if( closed ) { - ++points; - p = g_realloc( p, sizeof( Point ) * points ); - p[points-1].x = p[0].x; - p[points-1].y = p[0].y; + otype = object_get_type("Standard - Polygon"); } pcd->num_points = points; @@ -941,7 +938,7 @@ DiaObject *read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) height = atof(data->value) * coord_scale * measure_scale; /*printf( "text height %f\n", height );*/ break; - case 62: + case 62: colour = atoi(data->value); text_colour.red = acad_pal[colour].r / 255.0; text_colour.green = acad_pal[colour].g / 255.0; @@ -994,7 +991,7 @@ DiaObject *read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) } while(codedxf != 0); setlocale(LC_NUMERIC,old_locale); - location.y += y_offset * height; + location.y += y_offset * height; text_obj = otype->ops->create(&location, otype->default_user_data, &h1, &h2); @@ -1010,6 +1007,7 @@ DiaObject *read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) tprop->attr.position.y = location.y; attributes_get_default_font(&tprop->attr.font, &tprop->attr.height); + tprop->attr.height = height; tprop->attr.color = text_colour; text_obj->ops->set_props(text_obj, props); diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c index 40915ec2..4bdb02c4 100644 --- a/plug-ins/vdx/vdx-import.c +++ b/plug-ins/vdx/vdx-import.c @@ -97,7 +97,11 @@ create_standard_line(Point *points, &h1, &h2); props = prop_list_from_descs(vdx_line_prop_descs, pdtpp_true); - g_assert(props->len == 4); + if (props->len != 4) + { + g_debug("create_standard_line() - props->len != 4"); + return 0; + } ptprop = g_ptr_array_index(props,0); ptprop->point_data = points[0]; @@ -216,8 +220,12 @@ vdx_parse_color(const char *s, const VDXDocument *theDoc) if (theDoc->Colors && i < theDoc->Colors->len) return g_array_index(theDoc->Colors, Color, i); } - message_warning(_("Couldn't read color: %s\n"), s); - g_debug("Couldn't read color: %s", s); + /* Colour 0 is always black, so don't warn (OmniGraffle) */ + if (*s != '0') + { + message_warning(_("Couldn't read color: %s\n"), s); + g_debug("Couldn't read color: %s", s); + } return c; } @@ -381,7 +389,13 @@ find_child(unsigned int type, const void *p) { struct vdx_any *Any = (struct vdx_any *)p; GSList *child; - g_assert(p); + + if (!p) + { + g_debug("find_child called with p=0"); + return 0; + } + for(child = Any->children; child; child = child->next) { struct vdx_any *Any_child = (struct vdx_any *)child->data; @@ -403,7 +417,12 @@ find_child_next(unsigned int type, const void *p, const void *given) struct vdx_any *Any = (struct vdx_any *)p; GSList *child; gboolean found_given = FALSE; - g_assert(p); + + if (!p) + { + g_debug("find_child_next() called with p=0"); + return 0; + } for(child = Any->children; child; child = child->next) { struct vdx_any *Any_child = (struct vdx_any *)child->data; @@ -448,14 +467,17 @@ get_style_child(unsigned int type, unsigned int style, VDXDocument* theDoc) { struct vdx_StyleSheet theSheet; struct vdx_any *Any; - if (!theDoc->StyleSheets) - { - g_debug("Unknown stylesheet reference"); - return 0; - } while(1) { - g_assert(theDoc->StyleSheets && style < theDoc->StyleSheets->len); + if (!theDoc->StyleSheets || style >= theDoc->StyleSheets->len) + { + /* Ignore style 0 for OmniGraffle */ + if (style) + { + g_debug("Unknown stylesheet reference: %d", style); + } + return 0; + } theSheet = g_array_index(theDoc->StyleSheets, struct vdx_StyleSheet, style); Any = find_child(type, &theSheet); @@ -486,7 +508,12 @@ get_shape_by_id(unsigned int id, struct vdx_Shapes *Shapes, unsigned int depth) struct vdx_Shape *Shape; struct vdx_Shapes *SubShapes; GSList *child; - g_assert(Shapes); + + if (!Shapes) + { + g_debug("get_shape_by_id() called with Shapes=0"); + return 0; + } /* A Master has a list of Shapes */ for(child = Shapes->children; child; child = child->next) @@ -529,7 +556,12 @@ get_master_shape(unsigned int master, unsigned int shape, VDXDocument* theDoc) struct vdx_Master theMaster; struct vdx_Shapes *Shapes; - g_assert(master < theDoc->Masters->len); + if (!theDoc->Masters || master >= theDoc->Masters->len) + { + g_debug("Unknown master reference"); + return 0; + } + if (theDoc->debug_comments) g_debug("Looking for Master %d Shape %d", master, shape); theMaster = g_array_index(theDoc->Masters, @@ -586,7 +618,11 @@ vdx_simple_properties(DiaObject *obj, ColorProperty *cprop = 0; unsigned int debug_id; - g_assert(props->len == 2); + if (props->len != 2) + { + g_debug("vdx_simple_properties() - props->len != 4"); + return; + } if (Line) { @@ -711,6 +747,12 @@ apply_XForm(Point p, const struct vdx_XForm *XForm) double sin_theta, cos_theta; /* Remove the offset of the rotation pin from the object */ + if (!XForm) + { + g_debug("apply_XForm() called with XForm=0"); + return q; + } + q.x -= XForm->LocPinX; q.y -= XForm->LocPinY; @@ -771,6 +813,11 @@ make_arrow(const struct vdx_Line *Line, char start_end, double size = 0; unsigned int type = 0; + if (!Line) + { + g_debug("make_arrow() called with Line=0"); + return 0; + } a->type = ARROW_FILLED_TRIANGLE; if (start_end == 's') @@ -823,17 +870,18 @@ plot_polyline(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, struct vdx_ArcTo *ArcTo; struct vdx_any *Any; Point *points, p; - unsigned int num_points = 0; + unsigned int num_points = 1; unsigned int count = 0; Arrow* start_arrow_p = NULL; Arrow* end_arrow_p = NULL; gboolean done = FALSE; if (theDoc->debug_comments) g_debug("plot_polyline()"); - if ((Geom->NoFill || (Fill && !Fill->FillPattern)) && - (Geom->NoLine || (Line && !Line->LinePattern))) + if (!Geom || ((Geom->NoFill || (Fill && !Fill->FillPattern)) && + (Geom->NoLine || (Line && !Line->LinePattern)))) { *more = 0; + if (theDoc->debug_comments) g_debug("Nothing to plot"); return 0; } @@ -854,6 +902,12 @@ plot_polyline(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, LineTo = (struct vdx_LineTo*)(item->data); if (LineTo->Del) continue; p.x = LineTo->X; p.y = LineTo->Y; + if (!count) + { + /* Use current as start point */ + points[count++] = + dia_point(apply_XForm(*current, XForm), theDoc); + } break; case vdx_types_MoveTo: MoveTo = (struct vdx_MoveTo*)(item->data); @@ -867,11 +921,6 @@ plot_polyline(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, done = TRUE; break; } - else - { - num_points--; - continue; - } } break; default: @@ -908,7 +957,8 @@ plot_polyline(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (count > 2) { - if (Geom->NoFill) + /* If we had to break the Geom partway, it's not a polygon */ + if (Geom->NoFill || done) { /* Yes, it is end_arrow followed by start_arrow */ newobj = create_standard_polyline(count, points, @@ -928,6 +978,7 @@ plot_polyline(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, } else { + /* Don't plot lines with only one point */ if (theDoc->debug_comments) g_debug("Empty polyline"); } @@ -1017,6 +1068,12 @@ arc_to_ellipticalarc(struct vdx_ArcTo *ArcTo, const Point *Start, Point perp; double length; + if (!EllipticalArcTo || !ArcTo || !Start) + { + g_debug("arc_to_ellipticalarc() called with null parameters"); + return FALSE; + } + EllipticalArcTo->type = vdx_types_EllipticalArcTo; EllipticalArcTo->children = 0; @@ -1082,6 +1139,12 @@ ellipticalarc_to_bezier(Point p0, Point p3, Point p4, double C, double D, double a, b, c, d, e, f, g; /* Scratch variables */ + if (!p1 || !p2) + { + g_debug("ellipticalarc_to_bezier() called with null parameters"); + return FALSE; + } + /* We assume the arc is not degenerate: p0 != p4 != p3 != p0, 0 < D < infty */ @@ -1423,7 +1486,7 @@ plot_bezier(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (!all_lines) { /* It's a Bezier */ - if (Geom->NoFill) + if (Geom && Geom->NoFill) { /* Yes, it is end then start arrow */ newobj = create_standard_bezierline(num_points, bezpoints, @@ -1450,7 +1513,7 @@ plot_bezier(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (count > 2) { - if (Geom->NoFill) + if (Geom && Geom->NoFill) { /* Yes, it is end_arrow followed by start_arrow */ newobj = create_standard_polyline(count, points, @@ -1498,6 +1561,12 @@ NURBS_N(unsigned int i, unsigned int k, float u, unsigned int n, { float sum = 0.0; + if (! knot) + { + g_debug("NURBS_N() called with knot=0"); + return sum; + } + if (k == 0) { if (knot[i] <= u && u < knot[i+1]) @@ -1542,7 +1611,13 @@ NURBS_C(unsigned int k, float u, unsigned int n, float bottom = 0; unsigned int i; float N_i_k; - Point p; + Point p = {0, 0}; + + if (!knot || !weight || !control) + { + g_debug("NURBS_C() called with null parameters"); + return p; + } for(i=0; i<=n; i++) { @@ -1608,8 +1683,8 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, unsigned int steps = 40; float start_u, step_u; - if(theDoc->debug_comments) - g_debug("plot_nurbs()"); + if (theDoc->debug_comments) + g_debug("plot_nurbs(), current x=%f y=%f", current->x, current->y); item = *more; Any = (struct vdx_any *)(item->data); @@ -1620,6 +1695,8 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, current->x = MoveTo->X; current->y = MoveTo->Y; begin = *current; + if (theDoc->debug_comments) + g_debug("MoveTo x=%f y=%f", begin.x, begin.y); item = item->next; Any = (struct vdx_any *)(item->data); *more = item; @@ -1627,6 +1704,7 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (Any->type == vdx_types_NURBSTo) { + if (theDoc->debug_comments) g_debug("NURBSTo"); NURBSTo = (struct vdx_NURBSTo*)(item->data); /* E holds the NURBS formula */ @@ -1688,25 +1766,25 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, i = 0; while(c && *c && i < n) { - g_assert(c); + if (!c) break; control[i].x = atof(++c); current->x = control[i].x; /* xType = 0 means X is proportion of Width */ if (xType == 0) control[i].x *= XForm->Width; c = strchr(c, ','); - g_assert(c); + if (!c) break; control[i].y = atof(++c); current->y = control[i].y; /* yType = 0 means Y is proportion of Height */ if (yType == 0) control[i].y *= XForm->Height; c = strchr(c, ','); - g_assert(c); + if (!c) break; knot[i] = atof(++c); c = strchr(c, ','); - g_assert(c); + if (!c) break; weight[i] = atof(++c); c = strchr(c, ','); i++; @@ -1717,6 +1795,7 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, { if (Any->type == vdx_types_SplineStart) { + if (theDoc->debug_comments) g_debug("SplineStart"); SplineStart = (struct vdx_SplineStart*)(item->data); item2 = item; n = 1; @@ -1829,7 +1908,8 @@ plot_nurbs(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, { points[num_points-1] = dia_point(apply_XForm(end, XForm), theDoc); if (theDoc->debug_comments) - g_debug("Point %d VDX x=%f y=%f", num_points-1, end.x, end.y); + g_debug("End Point %d VDX x=%f y=%f", num_points-1, end.x, end.y); + *current = end; } if (theDoc->debug_comments) @@ -1875,6 +1955,12 @@ write_base64_file(const char *filename, const char *b64) char buf[4]; /* For 4 decoded 6-bit chunks */ unsigned int buf_len = 0; + if (!filename || !b64) + { + g_debug("write_base64_file() called with null parameters"); + return; + } + f = g_fopen(filename, "w+b"); if (!f) { @@ -2068,6 +2154,7 @@ plot_geom(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, { const GSList *item; gboolean all_lines = TRUE; /* Flag for line/polyline */ + gboolean has_nurbs = FALSE; /* Flag for NURBS */ unsigned int num_steps = 0; /* Flag for poly */ struct vdx_any *last_point = 0; unsigned int dia_type_choice = vdx_dia_any; @@ -2076,7 +2163,7 @@ plot_geom(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, struct vdx_ArcTo *ArcTo; /* Is it disabled? */ - if (Geom->NoShow) + if (!Geom || Geom->NoShow) { if (theDoc->debug_comments) g_debug("NoShow"); @@ -2103,6 +2190,11 @@ plot_geom(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (ArcTo->Del) continue; all_lines = FALSE; break; + case vdx_types_NURBSTo: + case vdx_types_SplineKnot: + has_nurbs = TRUE; + all_lines = FALSE; + break; default: all_lines = FALSE; } @@ -2141,7 +2233,7 @@ plot_geom(const struct vdx_Geom *Geom, const struct vdx_XForm *XForm, if (Geom->NoFill) { dia_type_choice = vdx_dia_bezier; } else { dia_type_choice = vdx_dia_beziergon; } /* Unless it's a spline */ - if (last_point->type == vdx_types_SplineKnot) + if (last_point->type == vdx_types_SplineKnot || has_nurbs) dia_type_choice = vdx_dia_nurbs; } @@ -2203,8 +2295,13 @@ plot_text(const struct vdx_Text *Text, const struct vdx_XForm *XForm, double height; char *font_name = 0; DiaFontStyle style = 0; + DiaFont *font = 0; - if (!Char || !text) { g_debug("Not enough info for text"); return 0; } + if (!Text || !Char || !text || !XForm) + { + g_debug("Not enough info for text"); + return 0; + } p.x = 0; p.y = 0; /* Setup position for horizontal alignment */ @@ -2316,11 +2413,17 @@ plot_text(const struct vdx_Text *Text, const struct vdx_XForm *XForm, font_name = FaceName.Name; } } - tprop->attr.font = dia_font_new(font_name, style, height); + + font = dia_font_new_from_legacy_name(font_name); + dia_font_set_weight(font, DIA_FONT_STYLE_GET_WEIGHT(style)); + dia_font_set_slant(font, DIA_FONT_STYLE_GET_SLANT(style)); + dia_font_set_height(font, height); + tprop->attr.font = font; + if (theDoc->debug_comments) - g_debug("Text: %s at %f,%f v=%d h=%d s=%.2x", + g_debug("Text: %s at %f,%f v=%d h=%d s=%.2x f=%s", tprop->text_data, p.x, p.y, - eprop->enum_data, tprop->attr.alignment, style); + eprop->enum_data, tprop->attr.alignment, style, font_name); tprop->attr.height = height; tprop->attr.color = Char->Color; @@ -2359,6 +2462,11 @@ vdx_plot_shape(struct vdx_Shape *Shape, GSList *objects, const GSList *more = 0; Point current = {0, 0}; + if (!Shape) + { + g_debug("vdx_plot_shape() called with Shape=0"); + return 0; + } theDoc->shape_id = Shape->ID; if (Shape->Del) { @@ -2701,6 +2809,12 @@ vdx_setup_layers(struct vdx_PageSheet* PageSheet, VDXDocument* theDoc, /* What layers are on this page? */ + if (!PageSheet) + { + g_debug("vdx_setup_layers() called with PageSheet=0"); + return; + } + for (child = PageSheet->children; child; child = child->next) { if (!child || !child->data) continue; |