Hello community, here is the log from the commit of package libvisio for openSUSE:Factory checked in at 2013-07-10 23:24:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libvisio (Old) and /work/SRC/openSUSE:Factory/.libvisio.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libvisio" Changes: -------- --- /work/SRC/openSUSE:Factory/libvisio/libvisio.changes 2013-07-03 10:24:33.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libvisio.new/libvisio.changes 2013-07-10 23:24:58.000000000 +0200 @@ -1,0 +2,12 @@ +Wed Jul 10 16:54:11 UTC 2013 - [email protected] + +- Bump version to 0.0.30 + * Fix building with older boosts + * Considerable performance improvement due to diminished + memory consumption. + * Implemented B-Spline conversion for xml-based formats + * For NURBS and B-Splines where it is possible, lossless + conversion to bezier segments. + * Coverity fixes. + +------------------------------------------------------------------- Old: ---- libvisio-0.0.29.tar.xz New: ---- libvisio-0.0.30.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libvisio.spec ++++++ --- /var/tmp/diff_new_pack.3Tvanr/_old 2013-07-10 23:25:00.000000000 +0200 +++ /var/tmp/diff_new_pack.3Tvanr/_new 2013-07-10 23:25:00.000000000 +0200 @@ -19,7 +19,7 @@ %define libname libvisio-0_0-0 Name: libvisio -Version: 0.0.29 +Version: 0.0.30 Release: 0 License: MPL-1.1 or GPL-2.0+ or LGPL-2.1+ Summary: Library for parsing the MS Visio file format structure ++++++ libvisio-0.0.29.tar.xz -> libvisio-0.0.30.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/ChangeLog new/libvisio-0.0.30/ChangeLog --- old/libvisio-0.0.29/ChangeLog 2013-07-02 14:20:53.000000000 +0200 +++ new/libvisio-0.0.30/ChangeLog 2013-07-10 15:16:31.000000000 +0200 @@ -1,3 +1,79 @@ +2013-07-10 Fridrich Štrba <[email protected]> [0c2293c7b1e0793f61a396d5bb3e9161f965b8e3] + + Add support of SplineStart and SplineKnot to xml-based formats + + +2013-07-10 Fridrich Štrba <[email protected]> [5a38774b5f9bfc2d58e8a7a06effb0bbe7d0debd] + + Try not to go out of bonds + + +2013-07-10 Fridrich Štrba <[email protected]> [e7974026dd728d2882962de803c0cfbc29057283] + + Fixing back some mistakes paid cash to valgrind + + +2013-07-10 David Tardon <[email protected]> [d8e22ac854217d647753c2f5c4943e167f45b6be] + + fix condition + + +2013-07-10 Fridrich Štrba <[email protected]> [31b9a3540b83bf0cbceb70ae3acadfc1a800e54e] + + SplineStart ends previous spline + + +2013-07-10 Fridrich Štrba <[email protected]> [f611310868933279a8d6899e6eabb9c5f820e929] + + Some more trying of refactoring of nurbs-related code + + +2013-07-09 Fridrich Štrba <[email protected]> [0e8734be3d3294454d3f6f8f9de282c31bdf28bf] + + De-uglify a tiny bit the NURBS code + + +2013-07-09 Fridrich Štrba <[email protected]> [98f9d25aae4de36c75656935da2909d044344398] + + Bump version to 0.0.30 (not release yet) + + +2013-07-09 Fridrich Štrba <[email protected]> [b49fb988a458c84869abc30376def886d4d3cc7f] + + Don't add a trailing M-segment when emulating NURBS by curves + + +2013-07-09 Fridrich Štrba <[email protected]> [29d671d0cd7a1b777d9c5172c5794d59b8048402] + + Handling in a special ways uniform NURBS of degree 2 and 3 + + +2013-07-09 Fridrich Štrba <[email protected]> [78fdaaf690c6aa37e56cb8a06f29be02fcd140a1] + + astyle + + +2013-07-06 Fridrich Štrba <[email protected]> [688aa1eb357b41e26d0a12f0d34dca426a50feb7] + + Proper fix for older boost and remove_whitespace + + +2013-07-06 Fridrich Štrba <[email protected]> [0cde479e62ce80a8a619f2e11b77f7f64b970802] + + Revert "Some older versions of boost have a buggy remove_whitespace and original code was not removing either" + + This reverts commit 6fe924aae90c7aed8a3ad6e172a90a341f7a82ca. + +2013-07-06 David Tardon <[email protected]> [73a17a5730bfbfb738cf0fa4fe59ad4b478f9731] + + coverity: gmtime can return NULL + + +2013-07-02 Fridrich Štrba <[email protected]> [6fe924aae90c7aed8a3ad6e172a90a341f7a82ca] + + Some older versions of boost have a buggy remove_whitespace and original code was not removing either + + 2013-07-02 Fridrich Štrba <[email protected]> [a55e97f84fdd51632f1fb29fbc438d1baa0c8e64] Bump version to 0.0.29 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/configure new/libvisio-0.0.30/configure --- old/libvisio-0.0.29/configure 2013-07-02 14:18:55.000000000 +0200 +++ new/libvisio-0.0.30/configure 2013-07-10 13:15:52.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libvisio 0.0.29. +# Generated by GNU Autoconf 2.69 for libvisio 0.0.30. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -587,8 +587,8 @@ # Identity of this package. PACKAGE_NAME='libvisio' PACKAGE_TARNAME='libvisio' -PACKAGE_VERSION='0.0.29' -PACKAGE_STRING='libvisio 0.0.29' +PACKAGE_VERSION='0.0.30' +PACKAGE_STRING='libvisio 0.0.30' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1380,7 +1380,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libvisio 0.0.29 to adapt to many kinds of systems. +\`configure' configures libvisio 0.0.30 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1450,7 +1450,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libvisio 0.0.29:";; + short | recursive ) echo "Configuration of libvisio 0.0.30:";; esac cat <<\_ACEOF @@ -1582,7 +1582,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libvisio configure 0.0.29 +libvisio configure 0.0.30 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2099,7 +2099,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libvisio $as_me 0.0.29, which was +It was created by libvisio $as_me 0.0.30, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2965,7 +2965,7 @@ # Define the identity of the package. PACKAGE='libvisio' - VERSION='0.0.29' + VERSION='0.0.30' cat >>confdefs.h <<_ACEOF @@ -17143,9 +17143,9 @@ VSD_MINOR_VERSION=0 -VSD_MICRO_VERSION=29 +VSD_MICRO_VERSION=30 -VSD_VERSION=0.0.29 +VSD_VERSION=0.0.30 # AC_SUBST(LT_RELEASE, [libvisio_version_major.libvisio_version_minor]) LT_CURRENT=`expr 100 '*' 0 + 0` @@ -17153,7 +17153,7 @@ LT_AGE=0 # LT_AGE=libvisio_version_minor -LT_REVISION=29 +LT_REVISION=30 @@ -18149,7 +18149,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libvisio $as_me 0.0.29, which was +This file was extended by libvisio $as_me 0.0.30, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18215,7 +18215,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libvisio config.status 0.0.29 +libvisio config.status 0.0.30 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/configure.ac new/libvisio-0.0.30/configure.ac --- old/libvisio-0.0.29/configure.ac 2013-07-02 14:18:41.000000000 +0200 +++ new/libvisio-0.0.30/configure.ac 2013-07-10 07:05:54.000000000 +0200 @@ -7,7 +7,7 @@ # ==================== m4_define([libvisio_version_major],[0]) m4_define([libvisio_version_minor],[0]) -m4_define([libvisio_version_micro],[29]) +m4_define([libvisio_version_micro],[30]) m4_define([libvisio_version],[libvisio_version_major.libvisio_version_minor.libvisio_version_micro]) # ============= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/libvisio.spec new/libvisio-0.0.30/libvisio.spec --- old/libvisio-0.0.29/libvisio.spec 2013-07-02 14:19:13.000000000 +0200 +++ new/libvisio-0.0.30/libvisio.spec 2013-07-10 13:16:17.000000000 +0200 @@ -1,5 +1,5 @@ %define name libvisio -%define version 0.0.29 +%define version 0.0.30 %define RELEASE 1 %define release %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDCollector.h new/libvisio-0.0.30/src/lib/VSDCollector.h --- old/libvisio-0.0.29/src/lib/VSDCollector.h 2013-04-22 08:31:25.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDCollector.h 2013-07-10 07:05:54.000000000 +0200 @@ -65,7 +65,7 @@ virtual void collectLineTo(unsigned id, unsigned level, double x, double y) = 0; virtual void collectArcTo(unsigned id, unsigned level, double x2, double y2, double bow) = 0; virtual void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, unsigned char xType, unsigned char yType, unsigned degree, - std::vector<std::pair<double, double> > controlPoints, std::vector<double> knotVector, std::vector<double> weights) = 0; + const std::vector<std::pair<double, double> > &ctrlPnts, const std::vector<double> &kntVec, const std::vector<double> &weights) = 0; virtual void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, unsigned dataID) = 0; virtual void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, const NURBSData &data) = 0; virtual void collectPolylineTo(unsigned id, unsigned level, double x, double y, unsigned char xType, unsigned char yType, const std::vector<std::pair<double, double> > &points) = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDContentCollector.cpp new/libvisio-0.0.30/src/lib/VSDContentCollector.cpp --- old/libvisio-0.0.29/src/lib/VSDContentCollector.cpp 2013-07-01 15:47:44.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDContentCollector.cpp 2013-07-10 10:43:14.000000000 +0200 @@ -1311,80 +1311,154 @@ } } -#define VSD_NUM_POLYLINES_PER_NURBS 200 -void libvisio::VSDContentCollector::collectNURBSTo(unsigned /* id */, unsigned level, double x2, double y2, unsigned char xType, unsigned char yType, unsigned degree, std::vector<std::pair<double, double> > controlPoints, std::vector<double> knotVector, std::vector<double> weights) +void libvisio::VSDContentCollector::_outputCubicBezierSegment(const std::vector<std::pair<double, double> > &points) { - _handleLevelChange(level); + if (points.size() < 4) + return; + WPXPropertyList node; + node.insert("libwpg:path-action", "C"); + double x = points[1].first; + double y = points[1].second; + transformPoint(x, y); + node.insert("svg:x1", m_scale*x); + node.insert("svg:y1", m_scale*y); + x = points[2].first; + y = points[2].second; + transformPoint(x, y); + node.insert("svg:x2", m_scale*x); + node.insert("svg:y2", m_scale*y); + x = points[3].first; + y = points[3].second; + transformPoint(x, y); + node.insert("svg:x", m_scale*x); + node.insert("svg:y", m_scale*y); - if (knotVector.empty() || controlPoints.empty() || weights.empty()) - // Here, maybe we should just draw line to (x2,y2) + if (!m_noFill && !m_noShow) + m_currentFillGeometry.push_back(node); + if (!m_noLine && !m_noShow) + m_currentLineGeometry.push_back(node); +} + +void libvisio::VSDContentCollector::_outputQuadraticBezierSegment(const std::vector<std::pair<double, double> > &points) +{ + if (points.size() < 3) return; + WPXPropertyList node; + node.insert("libwpg:path-action", "Q"); + double x = points[1].first; + double y = points[1].second; + transformPoint(x, y); + node.insert("svg:x1", m_scale*x); + node.insert("svg:y1", m_scale*y); + x = points[2].first; + y = points[2].second; + transformPoint(x, y); + node.insert("svg:x", m_scale*x); + node.insert("svg:y", m_scale*y); - // Fill in end knots - while (knotVector.size() < (controlPoints.size() + degree + 2)) - { - double tmpBack = knotVector.back(); - knotVector.push_back(tmpBack); - } + if (!m_noFill && !m_noShow) + m_currentFillGeometry.push_back(node); + if (!m_noLine && !m_noShow) + m_currentLineGeometry.push_back(node); +} - // Convert control points to static co-ordinates - for (std::vector<std::pair<double, double> >::iterator it = controlPoints.begin(); - it != controlPoints.end(); ++it) - { - if (xType == 0) // Percentage - (*it).first *= m_xform.width; +void libvisio::VSDContentCollector::_outputLinearBezierSegment(const std::vector<std::pair<double, double> > &points) +{ + if (points.size() < 2) + return; + WPXPropertyList node; + node.insert("libwpg:path-action", "L"); + double x = points[1].first; + double y = points[1].second; + transformPoint(x, y); + node.insert("svg:x", m_scale*x); + node.insert("svg:y", m_scale*y); - if (yType == 0) // Percentage - (*it).second *= m_xform.height; - } + if (!m_noFill && !m_noShow) + m_currentFillGeometry.push_back(node); + if (!m_noLine && !m_noShow) + m_currentLineGeometry.push_back(node); +} - controlPoints.push_back(std::pair<double,double>(x2, y2)); - controlPoints.insert(controlPoints.begin(), std::pair<double, double>(m_originalX, m_originalY)); +void libvisio::VSDContentCollector::_generateBezierSegmentsFromNURBS(unsigned degree, + const std::vector<std::pair<double, double> > &controlPoints, const std::vector<double> &knotVector) +{ + if (controlPoints.empty() || knotVector.empty() || !degree) + return; - // Generate NURBS using VSD_NUM_POLYLINES_PER_NURBS polylines - WPXPropertyList NURBS; - double step = (knotVector.back() - knotVector[0]) / VSD_NUM_POLYLINES_PER_NURBS; - - for (unsigned i = 0; i < VSD_NUM_POLYLINES_PER_NURBS; i++) - { - NURBS.clear(); - NURBS.insert("libwpg:path-action", "L"); - double nextX = 0; - double nextY = 0; - double denominator = LIBVISIO_EPSILON; + /* Decomposition of a uniform spline of a given degree into Bezier segments + * adapted from the algorithm DecomposeCurve (Les Piegl, Wayne Tiller: + * The NURBS Book, 2nd Edition, 1997 + */ + + unsigned a = degree; + unsigned b = degree + 1; + std::vector< std::pair<double, double> > points(degree + 1), nextPoints(degree + 1); + unsigned i = 0; + for (; i <= degree; i++) + points[i] = controlPoints[i]; + while (b < knotVector.size() - 1) + { + i = b; + while (b < knotVector.size() - 1 && knotVector[b+1] == knotVector[b]) + b++; + unsigned mult = b - i + 1; + if (mult < degree) + { + double numer = (double)(knotVector[b] - knotVector[a]); + unsigned j = degree; + std::vector<double> alphas(degree - 1, 0.0); + for (; j >mult; j--) + alphas[j-mult-1] = numer/double(knotVector[a+j]-knotVector[a]); + unsigned r = degree - mult; + for (j=1; j<=r; j++) + { + unsigned save = r - j; + unsigned s = mult+j; + for (unsigned k = degree; k>=s; k--) + { + double alpha = alphas[k-s]; + points[k].first = alpha*points[k].first + (1.0-alpha)*points[k-1].first; + points[k].second = alpha*points[k].second + (1.0-alpha)*points[k-1].second; + } + if (b < knotVector.size() - 1) + { + nextPoints[save].first = points[degree].first; + nextPoints[save].second = points[degree].second; + } + } + } + // Pass the segment to the path - for (unsigned p = 0; p < controlPoints.size() && p < weights.size(); p++) + switch (degree) { - double basis = _NURBSBasis(p, degree, knotVector[0] + i * step, knotVector); - nextX += basis * controlPoints[p].first * weights[p]; - nextY += basis * controlPoints[p].second * weights[p]; - denominator += weights[p] * basis; + case 1: + _outputLinearBezierSegment(points); + break; + case 2: + _outputQuadraticBezierSegment(points); + break; + case 3: + _outputCubicBezierSegment(points); + break; + default: + break; } - nextX = (nextX/denominator); - nextY = (nextY/denominator); - transformPoint(nextX, nextY); - NURBS.insert("svg:x", m_scale*nextX); - NURBS.insert("svg:y", m_scale*nextY); - if (!m_noFill && !m_noShow) - m_currentFillGeometry.push_back(NURBS); - if (!m_noLine && !m_noShow) - m_currentLineGeometry.push_back(NURBS); - } - m_originalX = x2; - m_originalY = y2; - m_x = x2; - m_y = y2; - transformPoint(m_x, m_y); - NURBS.clear(); - NURBS.insert("libwpg:path-action", "L"); - NURBS.insert("svg:x", m_scale*m_x); - NURBS.insert("svg:y", m_scale*m_y); - if (!m_noFill && !m_noShow) - m_currentFillGeometry.push_back(NURBS); - if (!m_noLine && !m_noShow) - m_currentLineGeometry.push_back(NURBS); + std::swap(points, nextPoints); + + if (b < knotVector.size() - 1) + { + for (i=degree-mult; i <= degree; i++) + { + points[i].first = controlPoints[b-degree+i].first; + points[i].second = controlPoints[b-degree+i].second; + } + a = b; + b++; + } + } } double libvisio::VSDContentCollector::_NURBSBasis(unsigned knot, unsigned degree, double point, const std::vector<double> &knotVector) @@ -1408,6 +1482,123 @@ return basis; } +#define VSD_NUM_POLYLINES_PER_KNOT 100 + +void libvisio::VSDContentCollector::_generatePolylineFromNURBS(unsigned degree, const std::vector<std::pair<double, double> > &controlPoints, + const std::vector<double> &knotVector, const std::vector<double> &weights) +{ + if (m_noShow) + return; + + WPXPropertyList node; + + for (unsigned i = 0; i < VSD_NUM_POLYLINES_PER_KNOT * knotVector.size(); i++) + { + node.clear(); + node.insert("libwpg:path-action", "L"); + double x = 0; + double y = 0; + double denominator = LIBVISIO_EPSILON; + + for (unsigned p = 0; p < controlPoints.size() && p < weights.size(); p++) + { + double basis = _NURBSBasis(p, degree, (double)i / (VSD_NUM_POLYLINES_PER_KNOT * knotVector.size()), knotVector); + x += basis * controlPoints[p].first * weights[p]; + y += basis * controlPoints[p].second * weights[p]; + denominator += weights[p] * basis; + } + x /= denominator; + y /= denominator; + transformPoint(x, y); + node.insert("svg:x", m_scale*x); + node.insert("svg:y", m_scale*y); + + if (!m_noFill && !m_noShow) + m_currentFillGeometry.push_back(node); + if (!m_noLine && !m_noShow) + m_currentLineGeometry.push_back(node); + } +} + +bool libvisio::VSDContentCollector::_isUniform(const std::vector<double> weights) const +{ + if (weights.empty()) + return true; + double previousValue = weights[0]; + for (std::vector<double>::size_type i = 0; i < weights.size(); ++i) + { + if (fabs(weights[i] - previousValue) < LIBVISIO_EPSILON) + previousValue = weights[i]; + else + return false; + } + return true; +} + +void libvisio::VSDContentCollector::collectNURBSTo(unsigned /* id */, unsigned level, double x2, double y2, + unsigned char xType, unsigned char yType, unsigned degree, const std::vector<std::pair<double, double> > &ctrlPnts, + const std::vector<double> &kntVec, const std::vector<double> &weights) +{ + _handleLevelChange(level); + + if (kntVec.empty() || ctrlPnts.empty() || weights.empty()) + // Here, maybe we should just draw line to (x2,y2) + return; + + std::vector<std::pair<double, double> > controlPoints(ctrlPnts); + + // Convert control points to static co-ordinates + for (std::vector<std::pair<double, double> >::iterator iter = controlPoints.begin(); iter != controlPoints.end(); ++iter) + { + if (xType == 0) // Percentage + iter->first *= m_xform.width; + if (yType == 0) // Percentage + iter->second *= m_xform.height; + } + + controlPoints.push_back(std::pair<double,double>(x2, y2)); + controlPoints.insert(controlPoints.begin(), std::pair<double, double>(m_originalX, m_originalY)); + + std::vector<double> knotVector(kntVec); + + // Fill in end knots + while (knotVector.size() < (controlPoints.size() + degree + 1)) + { + double tmpBack = knotVector.back(); + knotVector.push_back(tmpBack); + } + + // Let knotVector run from 0 to 1 + double firstKnot = knotVector[0]; + double lastKnot = knotVector.back()-knotVector[0]; + for(std::vector<double>::iterator knot = knotVector.begin(); knot != knotVector.end(); ++knot) + { + *knot -= firstKnot; + *knot /= lastKnot; + } + + if (degree <= 3 && _isUniform(weights)) + _generateBezierSegmentsFromNURBS(degree, controlPoints, knotVector); + else + _generatePolylineFromNURBS(degree, controlPoints, knotVector, weights); + + m_originalX = x2; + m_originalY = y2; + m_x = x2; + m_y = y2; + transformPoint(m_x, m_y); +#if 1 + WPXPropertyList node; + node.insert("libwpg:path-action", "L"); + node.insert("svg:x", m_scale*m_x); + node.insert("svg:y", m_scale*m_y); + if (!m_noFill && !m_noShow) + m_currentFillGeometry.push_back(node); + if (!m_noLine && !m_noShow) + m_currentLineGeometry.push_back(node); +#endif +} + void libvisio::VSDContentCollector::collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, const NURBSData &data) { NURBSData newData(data); @@ -1892,9 +2083,9 @@ return; } m_splineKnotVector.push_back(m_splineLastKnot); - std::vector<double> weights; + std::vector<double> weights(m_splineControlPoints.size()+2); for (unsigned i=0; i < m_splineControlPoints.size()+2; i++) - weights.push_back(1.0); + weights[i] = 1.0; collectNURBSTo(0, m_splineLevel, m_splineX, m_splineY, 1, 1, m_splineDegree, m_splineControlPoints, m_splineKnotVector, weights); m_splineKnotVector.clear(); m_splineControlPoints.clear(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDContentCollector.h new/libvisio-0.0.30/src/lib/VSDContentCollector.h --- old/libvisio-0.0.29/src/lib/VSDContentCollector.h 2013-05-12 19:07:41.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDContentCollector.h 2013-07-10 07:05:54.000000000 +0200 @@ -85,7 +85,7 @@ void collectLineTo(unsigned id, unsigned level, double x, double y); void collectArcTo(unsigned id, unsigned level, double x2, double y2, double bow); void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, unsigned char xType, unsigned char yType, unsigned degree, - std::vector<std::pair<double, double> > controlPoints, std::vector<double> knotVector, std::vector<double> weights); + const std::vector<std::pair<double, double> > &ctrlPnts, const std::vector<double> &kntVec, const std::vector<double> &weights); void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, unsigned dataID); void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, const NURBSData &data); void collectPolylineTo(unsigned id, unsigned level, double x, double y, unsigned char xType, unsigned char yType, @@ -220,6 +220,16 @@ bool parseFormatId( const char *formatString, unsigned short &result ); void _appendField(WPXString &text); + // NURBS processing functions + bool _isUniform(const std::vector<double> weights) const; + void _generatePolylineFromNURBS(unsigned degree, const std::vector<std::pair<double, double> > &controlPoints, + const std::vector<double> &knotVector, const std::vector<double> &weights); + void _generateBezierSegmentsFromNURBS(unsigned degree, const std::vector<std::pair<double, double> > &controlPoints, + const std::vector<double> &knotVector); + void _outputCubicBezierSegment(const std::vector<std::pair<double, double> > &points); + void _outputQuadraticBezierSegment(const std::vector<std::pair<double, double> > &points); + void _outputLinearBezierSegment(const std::vector<std::pair<double, double> > &points); + bool m_isPageStarted; double m_pageWidth; double m_pageHeight; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDFieldList.cpp new/libvisio-0.0.30/src/lib/VSDFieldList.cpp --- old/libvisio-0.0.29/src/lib/VSDFieldList.cpp 2013-04-19 16:04:31.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDFieldList.cpp 2013-07-06 14:40:22.000000000 +0200 @@ -74,8 +74,12 @@ WPXString result; char buffer[MAX_BUFFER]; time_t timer = (time_t)(86400 * datetime - 2209161600.0); - strftime(&buffer[0], MAX_BUFFER-1, format, gmtime(&timer)); - result.append(&buffer[0]); + const struct tm *const time = gmtime(&timer); + if (time) + { + strftime(&buffer[0], MAX_BUFFER-1, format, time); + result.append(&buffer[0]); + } return result; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDGeometryList.cpp new/libvisio-0.0.30/src/lib/VSDGeometryList.cpp --- old/libvisio-0.0.29/src/lib/VSDGeometryList.cpp 2013-06-25 10:35:43.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDGeometryList.cpp 2013-07-10 09:28:14.000000000 +0200 @@ -491,6 +491,7 @@ void libvisio::VSDSplineStart::handle(VSDCollector *collector) const { + collector->collectSplineEnd(); collector->collectSplineStart(m_id, m_level, m_x, m_y, m_secondKnot, m_firstKnot, m_lastKnot, m_degree); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDStylesCollector.cpp new/libvisio-0.0.30/src/lib/VSDStylesCollector.cpp --- old/libvisio-0.0.29/src/lib/VSDStylesCollector.cpp 2013-04-22 08:31:25.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDStylesCollector.cpp 2013-07-10 07:05:54.000000000 +0200 @@ -117,9 +117,8 @@ } void libvisio::VSDStylesCollector::collectNURBSTo(unsigned /* id */, unsigned level, double /* x2 */, double /* y2 */, - unsigned char /* xType */, unsigned char /* yType */, unsigned /* degree */, - std::vector<std::pair<double, double> > /* controlPoints */, - std::vector<double> /* knotVector */, std::vector<double> /* weights */) + unsigned char /* xType */, unsigned char /* yType */, unsigned /* degree */, const std::vector<std::pair<double, double> > & /* ctrlPts */, + const std::vector<double> & /* kntVec */, const std::vector<double> & /* weights */) { _handleLevelChange(level); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDStylesCollector.h new/libvisio-0.0.30/src/lib/VSDStylesCollector.h --- old/libvisio-0.0.29/src/lib/VSDStylesCollector.h 2013-04-22 08:31:25.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDStylesCollector.h 2013-07-10 07:05:54.000000000 +0200 @@ -75,9 +75,8 @@ void collectMoveTo(unsigned id, unsigned level, double x, double y); void collectLineTo(unsigned id, unsigned level, double x, double y); void collectArcTo(unsigned id, unsigned level, double x2, double y2, double bow); - void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, unsigned char xType, unsigned char yType, - unsigned degree, std::vector<std::pair<double, double> > controlPoints, - std::vector<double> knotVector, std::vector<double> weights); + void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, unsigned char xType, unsigned char yType, unsigned degree, + const std::vector<std::pair<double, double> > &ctrlPnts, const std::vector<double> &kntVec, const std::vector<double> &weights); void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, unsigned dataID); void collectNURBSTo(unsigned id, unsigned level, double x2, double y2, double knot, double knotPrev, double weight, double weightPrev, const NURBSData &data); void collectPolylineTo(unsigned id, unsigned level, double x, double y, unsigned char xType, unsigned char yType, const std::vector<std::pair<double, double> > &points); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/VSDXMLParserBase.cpp new/libvisio-0.0.30/src/lib/VSDXMLParserBase.cpp --- old/libvisio-0.0.29/src/lib/VSDXMLParserBase.cpp 2013-04-22 08:31:25.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/VSDXMLParserBase.cpp 2013-07-10 14:13:53.000000000 +0200 @@ -168,6 +168,14 @@ if (XML_READER_TYPE_ELEMENT == tokenType) readRelQuadBezTo(reader); break; + case XML_SPLINESTART: + if (XML_READER_TYPE_ELEMENT == tokenType) + readSplineStart(reader); + break; + case XML_SPLINEKNOT: + if (XML_READER_TYPE_ELEMENT == tokenType) + readSplineKnot(reader); + break; default: break; } @@ -1589,7 +1597,7 @@ break; } } - while (((XML_ELLIPTICALARCTO != tokenId && XML_ROW != tokenId) || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); + while (((XML_SPLINESTART != tokenId && XML_ROW != tokenId) || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); if (ret == 1) m_currentGeometryList->addSplineStart(ix, level, x, y, a, b, c, d); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/libvisio_utils.cpp new/libvisio-0.0.30/src/lib/libvisio_utils.cpp --- old/libvisio-0.0.29/src/lib/libvisio_utils.cpp 2013-06-25 09:37:41.000000000 +0200 +++ new/libvisio-0.0.30/src/lib/libvisio_utils.cpp 2013-07-09 15:21:23.000000000 +0200 @@ -123,14 +123,15 @@ return tmpUnion.d; } -void libvisio::appendFromBase64(WPXBinaryData &data, const unsigned char *base64String, size_t base64StringLength) +void libvisio::appendFromBase64(WPXBinaryData &data, const unsigned char *base64Data, size_t base64DataLength) { + std::string base64String((const char *)base64Data, base64DataLength); typedef boost::archive::iterators::transform_width< boost::archive::iterators::binary_from_base64< - boost::archive::iterators::remove_whitespace< const char * > >, 8, 6 > base64_decoder; + boost::archive::iterators::remove_whitespace< std::string::const_iterator > >, 8, 6 > base64_decoder; std::vector<unsigned char> buffer; - std::copy(base64_decoder(base64String), base64_decoder(base64String + base64StringLength), std::back_inserter(buffer)); + std::copy(base64_decoder(base64String.begin()), base64_decoder(base64String.end()), std::back_inserter(buffer)); if (!buffer.empty()) data.append(&buffer[0], buffer.size()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libvisio-0.0.29/src/lib/libvisio_utils.h new/libvisio-0.0.30/src/lib/libvisio_utils.h --- old/libvisio-0.0.29/src/lib/libvisio_utils.h 2012-11-16 11:45:33.000000000 +0100 +++ new/libvisio-0.0.30/src/lib/libvisio_utils.h 2013-07-08 06:42:26.000000000 +0200 @@ -98,7 +98,7 @@ double readDouble(WPXInputStream *input); -void appendFromBase64(WPXBinaryData &data, const unsigned char *base64String, size_t base64StringLength); +void appendFromBase64(WPXBinaryData &data, const unsigned char *base64Data, size_t base64DataLength); const ::WPXString getColourString(const Colour &c); -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
