From ef021e84adefd98b9f5a72713f0ac93308e55b42 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 27 Feb 2013 09:40:16 -0500 Subject: [PATCH 1/6] comment out non-critical failing karma conversion to_string tests, leaving just single important failure - refs #1741 --- tests/cpp_tests/conversions_test.cpp | 33 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/tests/cpp_tests/conversions_test.cpp b/tests/cpp_tests/conversions_test.cpp index bdb9d102c..b67553909 100644 --- a/tests/cpp_tests/conversions_test.cpp +++ b/tests/cpp_tests/conversions_test.cpp @@ -65,11 +65,6 @@ int main( int, char*[] ) BOOST_TEST_EQ( out, "-0.0001" ); out.clear(); - to_string(out, double(0.0001234567890123456)); - // TODO: https://github.com/mapnik/mapnik/issues/1676 - BOOST_TEST_EQ( out, "0.000123457" ); - out.clear(); - to_string(out, double(0.0001)); BOOST_TEST_EQ( out, "0.0001" ); out.clear(); @@ -98,6 +93,23 @@ int main( int, char*[] ) BOOST_TEST_EQ( out, "1e-10" ); out.clear(); + // critical failure when karam is used + + to_string(out, double(-1.234e+16)); + BOOST_TEST_EQ( out, "-1.234e+16" ); + out.clear(); + // https://github.com/mapbox/tilemill/issues/1456 + to_string(out, double(8.3)); + BOOST_TEST_EQ( out, "8.3" ); + out.clear(); + + // non-critical failures if karma is used + /* + to_string(out, double(0.0001234567890123456)); + // TODO: https://github.com/mapnik/mapnik/issues/1676 + BOOST_TEST_EQ( out, "0.000123457" ); + out.clear(); + to_string(out, double(0.00000000001)); BOOST_TEST_EQ( out, "1e-11" ); out.clear(); @@ -177,6 +189,7 @@ int main( int, char*[] ) to_string(out, double(1234000000000000)); BOOST_TEST_EQ( out, "1.234e+15" ); out.clear(); + */ to_string(out, double(1e+16)); BOOST_TEST_EQ( out, "1e+16" ); @@ -185,15 +198,7 @@ int main( int, char*[] ) to_string(out, double(1.234e+16)); BOOST_TEST_EQ( out, "1.234e+16" ); out.clear(); - - to_string(out, double(-1.234e+16)); - BOOST_TEST_EQ( out, "-1.234e+16" ); - out.clear(); - // https://github.com/mapbox/tilemill/issues/1456 - to_string(out, double(8.3)); - BOOST_TEST_EQ( out, "8.3" ); - out.clear(); - + // int to_string(out, int(2)); BOOST_TEST_EQ( out, "2" ); From 0745d07a796a22ab83005f60d36440cc3baec70c Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 27 Feb 2013 09:48:41 -0500 Subject: [PATCH 2/6] + use cxxflags option --- utils/mapnik-config/mapnik-config.template.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/mapnik-config/mapnik-config.template.sh b/utils/mapnik-config/mapnik-config.template.sh index bf6ee961e..55c4d0af9 100755 --- a/utils/mapnik-config/mapnik-config.template.sh +++ b/utils/mapnik-config/mapnik-config.template.sh @@ -27,7 +27,7 @@ Known values for OPTION are: --libs print library linking information --dep-libs print library linking information for Mapnik dependencies --ldflags print library paths (-L) information - --cflags print pre-processor and compiler flags + --cxxflags print pre-processor and compiler flags --fonts print default fonts directory --input-plugins print default input plugins directory --json print all config options as json object @@ -89,7 +89,7 @@ while test $# -gt 0; do echo ${CONFIG_INPUT_PLUGINS} ;; - --cflags) + --cxxflags) echo -I${CONFIG_MAPNIK_INCLUDE} -I${CONFIG_MAPNIK_AGG_INCLUDE} ${CONFIG_OTHER_INCLUDES} ;; From c0710c7b14f6bed7345ceb173f27193705ad3e49 Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 27 Feb 2013 09:49:36 -0500 Subject: [PATCH 3/6] + update viewer.pro to use cxxflags --- demo/viewer/viewer.pro | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/demo/viewer/viewer.pro b/demo/viewer/viewer.pro index 048cfad9c..adf2a46be 100644 --- a/demo/viewer/viewer.pro +++ b/demo/viewer/viewer.pro @@ -3,10 +3,10 @@ ###################################################################### TEMPLATE = app QMAKE_CXX = clang++ -QMAKE_CXXFLAGS += $$system(mapnik-config --cflags) +QMAKE_CXXFLAGS += $$system(mapnik-config --cxxflags) QMAKE_LFLAGS += $$system(mapnik-config --libs) QMAKE_LFLAGS += $$system(mapnik-config --ldflags --dep-libs) - +QMAKE_LFLAGS += -lboost_timer # Input CONFIG += qt debug_and_release @@ -19,17 +19,17 @@ HEADERS += mainwindow.hpp \ layerwidget.hpp \ layerlistmodel.hpp \ layerdelegate.hpp \ - styles_model.hpp + styles_model.hpp HEADERS += about_dialog.hpp \ info_dialog.hpp \ layer_info_dialog.hpp SOURCES += main.cpp \ - mainwindow.cpp \ + mainwindow.cpp \ mapwidget.cpp \ layerwidget.cpp \ - layerlistmodel.cpp \ + layerlistmodel.cpp \ layerdelegate.cpp \ styles_model.cpp From f7a726445ede386e370e19a33660194dd13a3875 Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 27 Feb 2013 09:59:53 -0500 Subject: [PATCH 4/6] + log rendering times --- demo/viewer/mapwidget.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp index ef9072331..0b8753e44 100644 --- a/demo/viewer/mapwidget.cpp +++ b/demo/viewer/mapwidget.cpp @@ -20,6 +20,8 @@ #include +#define BOOST_CHRONO_HEADER_ONLY +#include #include #include @@ -502,7 +504,10 @@ void render_agg(mapnik::Map const& map, double scaling_factor, QPixmap & pix) try { - ren.apply(); + { + boost::timer::auto_cpu_timer t; + ren.apply(); + } QImage image((uchar*)buf.raw_data(),width,height,QImage::Format_ARGB32); pix = QPixmap::fromImage(image.rgbSwapped()); } From 00c2ff999d9dea620c43d8d53e2d8c170c5cec19 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 27 Feb 2013 10:08:04 -0500 Subject: [PATCH 5/6] fix all double to_string conversion failures by using sprintf method in all cases - closes #1741 --- src/conversions.cpp | 123 ++++----------------------- tests/cpp_tests/conversions_test.cpp | 7 +- 2 files changed, 21 insertions(+), 109 deletions(-) diff --git a/src/conversions.cpp b/src/conversions.cpp index 82ae88f4c..efd51f58c 100644 --- a/src/conversions.cpp +++ b/src/conversions.cpp @@ -152,6 +152,24 @@ bool string2float(const char * iter, const char * end, float & result) return r && (iter == end); } +// double conversion - here we use sprintf over karma to work +// around https://github.com/mapnik/mapnik/issues/1741 +bool to_string(std::string & s, double val) +{ + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return true; +} + #ifdef MAPNIK_KARMA_TO_STRING bool to_string(std::string & str, int value) @@ -184,95 +202,6 @@ bool to_string(std::string & str, bool value) return karma::generate(sink, value); } -namespace detail { - template - struct double_policy : boost::spirit::karma::real_policies - { - typedef boost::spirit::karma::real_policies base_type; - - static int floatfield(T n) { - using namespace boost::spirit; // for traits - - if (traits::test_zero(n)) - return base_type::fmtflags::fixed; - - T abs_n = traits::get_absolute_value(n); - return (abs_n >= 1e16 || abs_n < 1e-4) - ? base_type::fmtflags::scientific : base_type::fmtflags::fixed; - } - - static unsigned precision(T n) { - if ( n == 0.0 ) return 0; - using namespace boost::spirit; // for traits - return static_cast(15 - boost::math::trunc(log10(traits::get_absolute_value(n)))); - } - - template - static bool dot(OutputIterator& sink, T n, unsigned precision) { - if (n == 0.0) return true; // avoid trailing zeroes - return base_type::dot(sink, n, precision); - } - - template - static bool fraction_part (OutputIterator& sink, T n - , unsigned precision_, unsigned precision) - { - // NOTE: copied from karma only to avoid trailing zeroes - // (maybe a bug ?) - - // allow for ADL to find the correct overload for floor and log10 - using namespace std; - - using namespace boost::spirit; // for traits - using namespace boost::spirit::karma; // for char_inserter - - if ( traits::test_zero(n) ) return true; // this part added to karma - - // The following is equivalent to: - // generate(sink, right_align(precision, '0')[ulong], n); - // but it's spelled out to avoid inter-modular dependencies. - - typename boost::remove_const::type digits = - (traits::test_zero(n) ? 0 : floor(log10(n))) + 1; - bool r = true; - for (/**/; r && digits < precision_; digits = digits + 1) - r = char_inserter<>::call(sink, '0'); - if (precision && r) - r = int_inserter<10>::call(sink, n); - return r; - } - - template - static bool exponent (OutputIterator& sink, long n) - { - // NOTE: copied from karma to force sign in exponent - const bool force_sign = true; - - using namespace boost::spirit; // for traits - using namespace boost::spirit::karma; // for char_inserter, sign_inserter - - unsigned long abs_n = traits::get_absolute_value(n); - bool r = char_inserter::call(sink, 'e') && - sign_inserter::call(sink, traits::test_zero(n) - , traits::test_negative(n), force_sign); - - // the C99 Standard requires at least two digits in the exponent - if (r && abs_n < 10) - r = char_inserter::call(sink, '0'); - return r && int_inserter<10>::call(sink, abs_n); - } - - }; -} - -bool to_string(std::string & str, double value) -{ - namespace karma = boost::spirit::karma; - typedef karma::real_generator > double_type; - std::back_insert_iterator sink(str); - return karma::generate(sink, double_type(), value); -} - #else bool to_string(std::string & s, int val) @@ -332,22 +261,6 @@ bool to_string(std::string & s, bool val) return true; } -bool to_string(std::string & s, double val) -{ - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast(snprintf(&s[0], s.size()+1, "%g", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return true; -} - #endif } // end namespace util diff --git a/tests/cpp_tests/conversions_test.cpp b/tests/cpp_tests/conversions_test.cpp index b67553909..2050e4d82 100644 --- a/tests/cpp_tests/conversions_test.cpp +++ b/tests/cpp_tests/conversions_test.cpp @@ -93,18 +93,18 @@ int main( int, char*[] ) BOOST_TEST_EQ( out, "1e-10" ); out.clear(); - // critical failure when karam is used - to_string(out, double(-1.234e+16)); BOOST_TEST_EQ( out, "-1.234e+16" ); out.clear(); + + // critical failure when karam is used + // https://github.com/mapnik/mapnik/issues/1741 // https://github.com/mapbox/tilemill/issues/1456 to_string(out, double(8.3)); BOOST_TEST_EQ( out, "8.3" ); out.clear(); // non-critical failures if karma is used - /* to_string(out, double(0.0001234567890123456)); // TODO: https://github.com/mapnik/mapnik/issues/1676 BOOST_TEST_EQ( out, "0.000123457" ); @@ -189,7 +189,6 @@ int main( int, char*[] ) to_string(out, double(1234000000000000)); BOOST_TEST_EQ( out, "1.234e+15" ); out.clear(); - */ to_string(out, double(1e+16)); BOOST_TEST_EQ( out, "1e+16" ); From f232d026c38276433bbfe2ecc4eb854649a49905 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Wed, 27 Feb 2013 10:37:27 -0500 Subject: [PATCH 6/6] scons: fix behavior of scons --clean install --- SConstruct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index e0536337a..e8b6a11a1 100644 --- a/SConstruct +++ b/SConstruct @@ -456,7 +456,7 @@ HELP_REQUESTED = False if ('-h' in command_line_args) or ('--help' in command_line_args): HELP_REQUESTED = True -if ('-c' in command_line_args) or ('--clean' in command_line_args): +if ('install' not in command_line_args) and ('-c' in command_line_args) or ('--clean' in command_line_args): HELP_REQUESTED = True if 'configure' in command_line_args and not HELP_REQUESTED: